从 Python 的 NLTK 同义词集列表中提取单词
Extract word from a list of synsets in NLTK for Python
使用这个 [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 attribute
或 TypeError: 'Synset' object is not subscriptable
或 <bound method Synset.name of Synset('mass.n.03')>
如果我尝试使用 .name 或 .pos
试试这个解决方案怎么样:
>>>> 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
如果您只想要列表中 'noun' 类别的同义词集的 'name' 字段,则使用:
>>>> [x.name().split(".")[0] for x in wn.all_synsets('n')]
应该能准确给出您需要的结果。
注意:在wordnet中,name
不是属性而是函数!
使用Synset.names()
获取同义词集的规范引理名称:
>>> 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.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 个词条附加到同义词集。但有时会有不止一个,例如
>>> 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
使用这个 [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 attribute
或 TypeError: 'Synset' object is not subscriptable
或 <bound method Synset.name of Synset('mass.n.03')>
如果我尝试使用 .name 或 .pos
试试这个解决方案怎么样:
>>>> 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
如果您只想要列表中 'noun' 类别的同义词集的 'name' 字段,则使用:
>>>> [x.name().split(".")[0] for x in wn.all_synsets('n')]
应该能准确给出您需要的结果。
注意:在wordnet中,name
不是属性而是函数!
使用Synset.names()
获取同义词集的规范引理名称:
>>> 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.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 个词条附加到同义词集。但有时会有不止一个,例如
>>> 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