2017-12-11 7 views
1

単語のセットVが与えられたら、同義語をVにグループ化したいと思います。私は入力としてVを取り、同義性に基づいてそれらを自動的にクラスタリングする、NLTKとWordnetに組み込み関数があるかどうか疑問に思っています。NLTKとWordnetを使用した同義語のクラスタリング

私はすでに各単語の同義語を抽出する方法を知っていますが、これは私が探しているものではありません。私がそうした場合、シノニムセットが互いに交差しているか、お互いのサブセット/スーパセットになっているときに問題が複雑になり、競合を取り除く関数を書く必要があります。一例として、

は、のは、私は出力として取得したい何

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

を考えてみましょうがされています。今、クラスタのサイズ/数に基づいて

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

、いくつかのセットがいくつかに分かれてありますセット、または組み合わせることができます。ここでは、Vという単語とその同義語をVに入れています。

+0

一切なしに定義がありません場合。あなたが望むクラスターの、より難しい問題です。 – alvas

+0

@alvasいいえ、私がnoを設定した場合。このクラスタリングを行う機能はありますか? – user5996916

+1

はい、k-meansを使うことができますが、まずsynset-lemma distanceに基づいてword - > synsets - > synset distance - > clusterから得る必要があります。それは自明ではない。大きなコーパスがあれば、word2vecやLDAをgensimで行う方が簡単です。 – alvas

答えて

0

はい、nltkwordnetを使用する方法があります。以下は例です。私は、 '書籍' の同義語の結果

import nltk 
from nltk.corpus import wordnet 

synonyms = [] 

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

は同義語の

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', ..] 

長さである、sysnetsにと '書籍' の同義語を探して構築された

len(synonyms) 
>>38 

注意を使用しています:いくつかの同義語は動詞形式であり、多くの同義語は単に「本」の異なる使用法です。代わりに、我々は同義語のセットを取る場合は、次のコードに示すように、少数のユニークな言葉が、あります:set操作を使用した後

len(set(synonyms)) 
>>25 

{'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'} 
+0

答えをありがとう。しかし、これは私が探しているものではありません。私は例を追加しました。あなたの場合、Vで単語の同義語がすべて見つかったら、 "set"関数を使用すると、同義語セットの単語の間で繰り返しが削除されるので、他のセットとの交差や競合はありません。 – user5996916

+0

@ user5996916はい、 'set'関数を使って試してみることができます。それは同義語のリストからユニークな単語を返すだけです! –

+0

@ user5996916私はあなたが 'set'を使うと、ユニークな同義語しか与えないと思います。例えば、私は 'good'と65の同義語を試してみました。私が' set'を使用した時、私は37だけでした。 –

関連する問題