在带有 pythonnet 的 C# 中使用 NLTK:生成器对象为空
Using NLTK in C# with pythonnet: Generator object is empty
我正在尝试使用 Pythonnet 在 C# 中执行一些 Python 代码。特别是,我正在尝试使用 NLTK 库 运行 一些基本的 NLP 操作,例如获取给定 WordNet 同义词集的下位词。无论我做什么,我的 C# 代码中返回的生成器对象始终为空。
下面的代码代表 Python 和 C# 对应的我正在尝试做的事情。而在 Python 中它通过返回给定同义词集的下位词完美地工作,在 C# 中它不起作用,因为它不进入 foreach 循环。另外,我用 .next() 检查生成器对象是否为空,它只是 returns 它是空的,但在 Python 中不是。看起来好像 C# lambda 表达式没有完成它的工作。
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() 检查它是否为空,它 returns "".
您可能是对的,问题出在 lambda 表达式未正确执行。尝试将其设为 python lambda:
dynamic hyponyms = PythonEngine.Eval("lambda x: x.hyponyms()");
我没有深入了解为什么 C# lambda 不起作用。我的猜测是 pythonnet 将编译后的 lambda 传递给 python 以某种方式执行,而这种方式将不知道如何处理 x.hyponyms()。
我正在尝试使用 Pythonnet 在 C# 中执行一些 Python 代码。特别是,我正在尝试使用 NLTK 库 运行 一些基本的 NLP 操作,例如获取给定 WordNet 同义词集的下位词。无论我做什么,我的 C# 代码中返回的生成器对象始终为空。
下面的代码代表 Python 和 C# 对应的我正在尝试做的事情。而在 Python 中它通过返回给定同义词集的下位词完美地工作,在 C# 中它不起作用,因为它不进入 foreach 循环。另外,我用 .next() 检查生成器对象是否为空,它只是 returns 它是空的,但在 Python 中不是。看起来好像 C# lambda 表达式没有完成它的工作。
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() 检查它是否为空,它 returns "".
您可能是对的,问题出在 lambda 表达式未正确执行。尝试将其设为 python lambda:
dynamic hyponyms = PythonEngine.Eval("lambda x: x.hyponyms()");
我没有深入了解为什么 C# lambda 不起作用。我的猜测是 pythonnet 将编译后的 lambda 传递给 python 以某种方式执行,而这种方式将不知道如何处理 x.hyponyms()。