9

在python中获取单词同义词的代码是:

from nltk.corpus import wordnet

dog = wordnet.synset('dog.n.01')
print dog.lemma_names

>>['dog', 'domestic_dog', 'Canis_familiaris']

然而 dog.n.02 给出了不同的词。对于任何单词,我不知道可能有多少个单词。如何返回一个单词的所有同义词?

4

3 回答 3

22

使用wn.synset('dog.n.1').lemma_names是访问意义同义词的正确方法。这是因为一个词有很多意义,列出特定意义/意义的同义词更合适。要列举具有相似含义的单词,可能还可以查看下义词。

遗憾的是,Wordnet 的大小非常有限,因此每种感官可用的 lemma_names 很少。

使用 Wordnet 作为字典/词库本身并不是很合适,因为它是作为意义/意义的清单而不是单词的清单而开发的。但是,您可以使用访问特定意义和几个(不是很多)相关词的意义。可以将 Wordnet 用作:

字典:给定一个词,该词的不同含义是什么

for i,j in enumerate(wn.synsets('dog')):
  print "Meaning",i, "NLTK ID:", j.name
  print "Definition:",j.definition

同义词库:给定一个单词,该单词的每个含义的不同单词是什么

for i,j in enumerate(wn.synsets('dog')):
  print "Meaning",i, "NLTK ID:", j.name
  print "Definition:",j.definition
  print "Synonyms:", ", ".join(j.lemma_names)
  print

本体:给定一个词,下位词(即子类型)和上位词(即超类型)是什么。

for i,j in enumerate(wn.synsets('dog')):
  print "Meaning",i, "NLTK ID:", j.name
  print "Hypernyms:", ", ".join(list(chain(*[l.lemma_names for l in j.hypernyms()])))
  print "Hyponyms:", ", ".join(list(chain(*[l.lemma_names for l in j.hyponyms()])))
  print

【本体输出】

Meaning 0 NLTK ID: dog.n.01
Hypernyms words domestic_animal, domesticated_animal, canine, canid
Hyponyms puppy, Great_Pyrenees, basenji, Newfoundland, Newfoundland_dog, lapdog, poodle, poodle_dog, Leonberg, toy_dog, toy, spitz, pooch, doggie, doggy, barker, bow-wow, cur, mongrel, mutt, Mexican_hairless, hunting_dog, working_dog, dalmatian, coach_dog, carriage_dog, pug, pug-dog, corgi, Welsh_corgi, griffon, Brussels_griffon, Belgian_griffon

Meaning 1 NLTK ID: frump.n.01
Hypernyms: unpleasant_woman, disagreeable_woman
Hyponyms: 

Meaning 2 NLTK ID: dog.n.03
Hypernyms: chap, fellow, feller, fella, lad, gent, blighter, cuss, bloke
Hyponyms: 

Meaning 3 NLTK ID: cad.n.01
Hypernyms: villain, scoundrel
Hyponyms: perisher
于 2013-10-15T14:33:46.440 回答
6

请注意另一个答案

>>> 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')]

请记住,在您的代码中,您试图获取引理,但这对于您想要的东西来说太深了。同义词级别是关于意义的,而引理级别是给你单词的。 换句话说

在 WordNet 中(我在这里说的是英语 WordNet,尽管我认为其他语言中的 WordNet 也有类似的组织),引理具有意义。具体来说,一个引理(即在 WordNet 中被索引的基本词形式)的含义与其参与的同义词集的数量完全相同。相反,正如你所说,同义词集包含更多的引理,这意味着多个引理(单词)可以表示相同的含义或含义。

还可以查看NLTK 的 WordNet how to 以了解更多围绕含义或单词进行探索的方法。

于 2013-10-15T11:13:18.710 回答
5

文件建议

wordnet.synsets('dog') 

获取狗的所有同义词。

于 2013-10-13T19:05:28.257 回答