查找列表中每个项目的Python NLTK Wordnet Synsets

时间:2015-01-28 15:30:19

标签: python python-3.x machine-learning nltk wordnet

我一直在学习基本的python,但我是NLTK的新手。我想使用nltk为给定的单词列表提取下位词。当我手动输入每个术语时它工作正常,但是当我尝试迭代列表中的项目时它似乎不起作用。

这有效:

from nltk.corpus import wordnet as wn

syn_sets = wn.synsets("car")

for syn_set in syn_sets:
    print(syn_set, syn_set.lemma_names())
    print(syn_set.hyponyms())

但是如何让Wordnet方法处理像

这样的项目列表
token = ["cat", "dog", "car"]
syn_sets = wn.synsets((*get each item from the list*))

在循环中?

谢谢!

2 个答案:

答案 0 :(得分:6)

列出对救援的理解!

完全可能,甚至使用与之前相同的语法。 Python有一个名为[list comprehension][1]的结构,专为此应用程序而制作。基本上,它是内联循环的函数式语法,但往往是更清晰,更强大的实现,开销略低。

示例:

tokens = ["cat", "dog", "car"]
syn_sets = [wn.synsets(token) for token in tokens]

这甚至可以很容易地扩展到稍微复杂的数据结构,例如:

split_syn_sets = [(syn_set.lemma_names(), syn_set.hyponyms()) for syn_set in syn_sets]

不确定这是否正是您正在寻找的内容,但它应该推广到您想要做的与此类似的内容。

如果它有用,我前一段时间问了一个关于抓取所有相关同义词here的问题。

答案 1 :(得分:1)

我相信你别无选择,只能循环说出你的话。我修改了你的代码以获得一个外部循环,它似乎工作:

from nltk.corpus import wordnet as wn

tokens = ["cat", "dog", "car"]

for token in tokens:
    syn_sets = wn.synsets(token)
    for syn_set in syn_sets:
        print(syn_set, syn_set.lemma_names())
        print(syn_set.hyponyms())

这是输出:

(Synset('cat.n.01'), [u'cat', u'true_cat'])
[Synset('domestic_cat.n.01'), Synset('wildcat.n.03')]
(Synset('guy.n.01'), [u'guy', u'cat', u'hombre', u'bozo'])
[Synset('sod.n.04')]
...
(Synset('cable_car.n.01'), [u'cable_car', u'car'])
[]