使用 NLTK 和 Wordnet 对同义词进行聚类

Mil*_*ila 5 python synonym nltk wordnet

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

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

作为一个例子,让我们考虑

V = ["good","constipate","bad","nice","defective","right","respectable","powerful"]
Run Code Online (Sandbox Code Playgroud)

我想要得到的输出是:

[('constipate'), ('nice'), ('bad', 'defective'), ('good', 'powerful', 'respectable', 'right')]
Run Code Online (Sandbox Code Playgroud)

现在,根据簇的大小/数量,某些集合可能会分成多个集合,或组合在一起。在这里,我只关心 中的单词V及其同义词V

i.n*_*n.m -1

是的,有一种方法可以使用nltkand wordnet。下面是一个例子。我正在使用内置的系统网并寻找“书”的同义词,

import nltk
from nltk.corpus import wordnet 

synonyms = []

for syn in wordnet.synsets('book'):
        for lemma in syn.lemmas():
            synonyms.append(lemma.name())
Run Code Online (Sandbox Code Playgroud)

“书”的同义词是

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', ..]
Run Code Online (Sandbox Code Playgroud)

同义词的长度,

 len(synonyms)
 >>38
Run Code Online (Sandbox Code Playgroud)

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

len(set(synonyms)) 
 >>25
Run Code Online (Sandbox Code Playgroud)

使用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'}
Run Code Online (Sandbox Code Playgroud)