使用NLTK和Wordnet聚类同义词

时间:2017-12-11 16:40:40

标签: python nltk wordnet synonym

给定一组单词V,我想将V中的同义词组合在一起。我想知道在NLTK和Wordnet中是否有任何内置函数以V为输入并根据同义词自动聚类它们。

我已经知道如何提取每个单词的同义词,但这不是我要找的。如果我这样做,当同义词集相互交叉,或者是彼此的子集/超集时,问题会变得复杂,这需要编写一个消除冲突的函数。

举个例子,让我们考虑一下

V = ["good","constipate","bad","nice","defective","right","respectable","powerful"]

我想得到的输出是:

[('constipate'), ('nice'), ('bad', 'defective'), ('good', 'powerful', 'respectable', 'right')]

现在,根据群集的大小/数量,某些集合可能会分成几个集合,或者组合在一起。在这里,我只是关心V中的字词以及V中的同义词。

1 个答案:

答案 0 :(得分:0)

是的,有一种方法可以使用nltkwordnet。以下是一个例子。我使用内置的sysnets并寻找'book'的同义词,

import nltk
from nltk.corpus import wordnet 

synonyms = []

for syn in wordnet.synsets('book'):
        for lemma in syn.lemmas():
            synonyms.append(lemma.name())

“book”的结果是

print(synonyms)
>>['book', 'book', 'volume', 'record', 'record_book', 'book', 'script', 'book', 'playscript', 'ledger', 'leger', 'account_book', 'book_of_account', 'book', 'book', 'book', 'rule_book', 'Koran', 'Quran', "al-Qur'an", 'Book', 'Bible', 'Christian_Bible', ..]

同义词的长度,

 len(synonyms)
 >>38

注意:有些同义词是动词形式,许多同义词只是“书”的不同用法。相反,如果我们采用同义词集,则会有更少的唯一字,如下面的代码所示:

len(set(synonyms)) 
 >>25

使用set操作后,

{'record', 'Quran', 'Holy_Scripture', 'Koran', 'Good_Book', 'playscript', 'book', 'Word_of_God', 'hold', 'Holy_Writ', 'script', 'leger', 'book_of_account', 'Scripture', 'ledger', 'reserve', 'volume', 'record_book', "al-Qur'an", 'Christian_Bible', 'Word', 'rule_book', 'Bible', 'Book', 'account_book'}