如何在Python的nltk和wordnet中获取一个单词/同义词集的所有下位词?

10

我现在有一个WordNet中所有名词的列表,我想只保留车辆相关的单词并删除其他单词。如何实现呢?以下是我想要编写的伪代码,但我不知道如何让它工作。

for word in wordlist:
  if not "vehicle" in wn.synsets(word):
    wordlist.remove(word)
2个回答

14
from nltk.corpus import wordnet as wn
vehicle = wn.synset('vehicle.n.01')
typesOfVehicles = list(set([w for s in vehicle.closure(lambda s:s.hyponyms()) for w in s.lemma_names()]))

这将为您提供名词“车辆”(第1个意义)的每个下位词的所有唯一单词。


但是当我试图进一步缩小范围时,就会出现以下错误Traceback (most recent call last): File "D:...\test.py", line 10, in <module> if "car" in word: TypeError: argument of type 'Synset' is not iterable - watisit
@Jared,非常优雅的回答,但是当Synset.closure(lambda s:s.hyponyms()进入无限循环时,有一个gotcha。尝试wn.synset('restrain.v.01').closure(lambda s:s.hyponyms() - alvas
1
使用这种方法时,我会得到“TypeError: 'method' object is not iterable”的错误。 - Stefan D
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Jared
用户Easton在回答中评论说lemma_names是一个方法,因此应该添加括号。不知道是否正确,但我将其留在这里供熟悉此模块的人审查。 - Tom Zych

9
def get_hyponyms(synset):
    hyponyms = set()
    for hyponym in synset.hyponyms():
        hyponyms |= set(get_hyponyms(hyponym))
    return hyponyms | set(synset.hyponyms())

1
这在 NLTK 3.0.3 中运行良好,与 jared 的回答不同(TypeError: 'method' object is not iterable),谢谢! - Franck Dernoncourt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接