从NLTK for Python

时间:2015-06-12 22:06:13

标签: python nlp nltk list-comprehension wordnet

使用此[x for x in wn.all_synsets('n')]我可以在NLTK的帮助下从Wordnet获取所有名词的列表allnouns

列表allnouns看起来像Synset('pile.n.01'), Synset('compost_heap.n.01'), Synset('mass.n.03'),依此类推。现在,我可以使用allnouns[2]获取任何元素,这应该是Synset('mass.n.03')

我想只提取 mass 这个词,但由于某种原因,我不能把它当成字符串,我尝试的所有内容都显示AttributeError: 'Synset' object has no attributeTypeError: 'Synset' object is not subscriptable或{{ 1}}如果我尝试使用.name或.pos

2 个答案:

答案 0 :(得分:5)

尝试此解决方案怎么样:

>>>> from nltk.corpus import wordnet as wn
>>>> wn.synset('mass.n.03').name().split(".")[0]
'mass'

对于你的情况:

>>>> allnouns = [x for x in wn.all_synsets('n')]  

第23个索引的项目是" Synset(' substance.n.07')"。现在,您可以提取其名称字段,如

>>>> allnouns[23].name().split(".")[0]
'substance'   #output

如果您只想要'名称' &名词'的同义词的字段列表中的类别,然后使用:

>>>> [x.name().split(".")[0] for x in wn.all_synsets('n')]

应该准确地给出你需要的结果。

注意:在wordnet中,name不是属性,而是一个函数!

答案 1 :(得分:0)

使用Synset.names()获取synset的规范引理名称:

>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('mass', 'n')
[Synset('mass.n.01'), Synset('batch.n.02'), Synset('mass.n.03'), Synset('mass.n.04'), Synset('mass.n.05'), Synset('multitude.n.03'), Synset('bulk.n.02'), Synset('mass.n.08'), Synset('mass.n.09')]
>>> wn.synsets('mass', 'n')[0]
Synset('mass.n.01')
>>> wn.synsets('mass', 'n')[0].name()
u'mass.n.01'
>>> wn.synsets('mass', 'n')[0].name().split('.')[0]
u'mass'

但是请注意,有时一个synset由几个引理组成,所以如果您使用了synset的表面单词形式,则应该使用Synset.lemma_names()来访问所有引号:

>>> wn.synsets('mass', 'n')[0].lemmas()
[Lemma('mass.n.01.mass')]
>>> wn.synsets('mass', 'n')[0].lemma_names()
[u'mass']
>>> wn.synsets('mass', 'n')[0].definition()
u'the property of a body that causes it to have weight in a gravitational field'

wn.synsets('mass', 'n')[0]案例中,只有1个引理附加到synset。但有时候不止一个,例如

>>> wn.synsets('mass', 'n')[1].lemma_names()
[u'batch', u'deal', u'flock', u'good_deal', u'great_deal', u'hatful', u'heap', u'lot', u'mass', u'mess', u'mickle', u'mint', u'mountain', u'muckle', u'passel', u'peck', u'pile', u'plenty', u'pot', u'quite_a_little', u'raft', u'sight', u'slew', u'spate', u'stack', u'tidy_sum', u'wad']
>>> wn.synsets('mass', 'n')[1].definition()
u"(often followed by `of') a large number or amount or extent"

要确定wordnet中的所有单词列表,您可以尝试:

>>> from itertools import chain
>>> set(chain(*[i.lemma_names() for i in wn.all_synsets('n')]))
>>> len(set(chain(*[i.lemma_names() for i in wn.all_synsets('n')])))
119034

请参阅Making a flat list out of list of lists in Python