由于某些原因,我需要迭代WordNet3.0中的所有名词语法集,并在我的程序中使它们成为树状结构。在
但是当我用下面列出的代码来做这个的时候
from nltk.corpus import wordnet as wn
stack = []
duplicate_check = []
def iterate_all():
while(stack):
current_node = stack.pop()
print current_node,"on top"
for hypo in current_node.hyponyms():
stack.append(hypo)
duplicate_check.append(hypo)
if __name__ == "__main__":
root = wn.synset("entity.n.01")
stack.append(root)
duplicate_check.append(root)
iterate_all()
correct_list = list(wn.all_synsets('n'))
# print list( set(correct_list) - set(duplicate_check) )
print len(correct_list)
print len(duplicate_check)
我得到了96308条duplicate_check
的记录,而^{correct_list
包含正确数量的语法集,但不包含{
在将两个列表转换为set
并检查两个列表中的元素之后,我发现我会因为上面列出的代码而丢失名词关系中“instance of”的关系。有人能告诉我:
(1)WordNet3.0中的“下义词”关系是否等于“实例”?在
(2)我的代码中是否有错误导致我不能在duplicate_list
中添加“instance of”关系词?在
非常感谢您抽出时间。在
环境: Ubuntu 14.04+Python2.7+NLTK最新版本+WordNet 3.0
首先,不需要从
entity.n.01
自上而下迭代以获得其下义词,您只需检查所有synset中的root_hypernyms
botton:以下是
^{pr2}$Synset.root_hypernyms()
如何工作的代码,来自https://github.com/nltk/nltk/blob/develop/nltk/corpus/reader/wordnet.py#L439:还有另一种方法可以访问超/下义词,但似乎没有NLTK中的那样完美,参见How to get all the hyponyms of a word/synset in python nltk and wordnet?:
要单独迭代:
所以我们试着自下而上:
似乎在自下而上和自上而下分析超上下义树时,我们缺少约8000个语法集,因此我们检查:
您将得到丢失的~8000个synset的列表,下面是您将看到的前几个:
因此,
closure()
方法可能有点损失,但如果您不关心确切的数字,它仍然是一个优雅的方法。在相关问题 更多 >
编程相关推荐