如何从nltk WordNet Python中获取同义词

How to get synonyms from nltk WordNet Python

WordNet很棒,但在NLTK中我很难找到同义词。如果您搜索类似的"small"一词(如这里),它将显示所有同义词。

基本上我只需要知道以下几点:wn.synsets('word')[i].option()在哪里选项可以是同义词和反义词,但是获得同义词的选项是什么?


如果您想在synset中使用同义词(也就是组成集合的引理),可以使用lemma_names()获得它们:

1
2
3
4
5
6
7
8
9
10
11
>>> for ss in wn.synsets('small'):
>>>     print(ss.name(), ss.lemma_names())

small.n.01 ['small']
small.n.02 ['small']
small.a.01 ['small', 'little']
minor.s.10 ['minor', 'modest', 'small', 'small-scale', 'pocket-size',  'pocket-sized']
little.s.03 ['little', 'small']
small.s.04 ['small']
humble.s.01 ['humble', 'low', 'lowly', 'modest', 'small']    
...


您可以使用wordnet.synset和lemmas来获得所有同义词:

例子:

1
2
3
4
5
from itertools import chain
from nltk.corpus import wordnet

synonyms = wordnet.synsets(text)
lemmas = set(chain.from_iterable([word.lemma_names() for word in synonyms]))

演示:

1
2
3
>>> synonyms = wordnet.synsets('change')
>>> set(chain.from_iterable([word.lemma_names() for word in synonyms]))
set([u'interchange', u'convert', u'variety', u'vary', u'exchange', u'modify', u'alteration', u'switch', u'commute', u'shift', u'modification', u'deepen', u'transfer', u'alter', u'change'])


你已经有了同义词。这就是Synset的含义。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> wn.synsets('small')
[Synset('small.n.01'),
 Synset('small.n.02'),
 Synset('small.a.01'),
 Synset('minor.s.10'),
 Synset('little.s.03'),
 Synset('small.s.04'),
 Synset('humble.s.01'),
 Synset('little.s.07'),
 Synset('little.s.05'),
 Synset('small.s.08'),
 Synset('modest.s.02'),
 Synset('belittled.s.01'),
 Synset('small.r.01')]

这与Web界面提供的顶级条目列表相同。

如果你还想要"相似"的列表,那和同义词就不一样了。为此,您在每个Synset上调用similar_tos()

因此,要显示与网站相同的信息,请从以下内容开始:

1
2
3
4
for ss in wn.synsets('small'):
    print(ss)
    for sim in ss.similar_tos():
        print('    {}'.format(sim))

当然,该网站还为两个级别的每个合成集打印了词性部分(sim.pos)、引理列表(sim.lemma_names、定义(sim.definition)和示例(sim.examples)。它将它们按词类进行分组,并添加到指向其他可以跟踪的内容的链接中,以此类推。但这足以让你开始。


Simplest program to print the synonyms of a given word

1
2
3
4
5
from nltk.corpus import wordnet

for syn in wordnet.synsets("good"):
    for name in syn.lemma_names():
        print(name)


这对我有用

埃多克斯1〔9〕