Использование NLTK в С# с pythonnet: объект генератора пуст

Я пытаюсь выполнить некоторый код 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(), он возвращает "".


person Nicolás Fernández Martínez    schedule 03.08.2019    source источник


Ответы (1)


Вероятно, вы правы в том, что проблема заключается в том, что лямбда-выражение не выполняется должным образом. Вместо этого попробуйте сделать его лямбдой Python:

dynamic hyponyms = PythonEngine.Eval("lambda x: x.hyponyms()");

Я не копался достаточно глубоко, чтобы понять, почему лямбда С# не работает. Я предполагаю, что pythonnet каким-то образом передает скомпилированную лямбду в python для выполнения, и таким образом он не будет знать, что делать с x.hyponyms().

person cudima    schedule 06.08.2019