Я пытаюсь выполнить некоторый код Python на С#, используя Pythonnet. В частности, я пытаюсь запустить некоторые базовые операции НЛП с использованием библиотеки NLTK, например получить гипонимы данного синсета WordNet. Что бы я ни делал, возвращаемый объект-генератор в моем коде C# всегда пуст.
Приведенный ниже код представляет собой аналоги Python и C# того, что я пытаюсь сделать. В то время как в Python он работает безупречно, возвращая гипонимы заданного синсета, в C# это не работает, так как он не входит в цикл foreach. Кроме того, я проверил, пуст ли объект генератора с помощью .next(), и он просто возвращает его пустым, но не в Python. Похоже, что лямбда-выражение C# не выполняет свою работу.
hyponyms = lambda x:x.hyponyms()
synset_example = wn.synset("body_of_water.n.01")
clos = synset_example.closure(hyponyms)
list = []
for hyponym in clos:
for word in hyponym.lemma_names("eng"):
list.append(word)
List<string> list = new List<string>();
using (Py.GIL())
{
dynamic nltk = Py.Import("nltk.corpus");
dynamic wn = nltk.wordnet;
Func<dynamic, dynamic> hyponyms = x => x.hyponyms();
dynamic synsetExample = wn.synset("body_of_water.n.01");
dynamic clos = synsetExample.closure(hyponyms);
foreach (dynamic hyponym in clos)
{
foreach (dynamic word in hyponym.lemma_names("eng"))
{
string hyp = word.ToString();
list.Add(hyp);
}
}
В Python он входит в цикл for, и функция .next() показывает, что объект генератора не пуст. В случае с C# это не так, и, проверяя, пуст он или нет, с помощью .next(), он возвращает "".