2013-06-25 63 views
5

我試圖找到使用wordnet的python nltk兩個單詞之間的相似性。兩個樣本關鍵字是'遊戲'和'萊昂納多'。首先,我提取了這兩個單詞的所有同義詞,並對每個同義詞進行交叉匹配以找到它們的相似性。這裏是我的代碼python nltk返回單詞結果爲wordnet相似性度量

from nltk.corpus import wordnet as wn 

xx = wn.synsets("game") 
yy = wn.synsets("leonardo") 
for x in xx: 
    for y in yy: 
     print x.name 
     print x.definition 
     print y.name 
     print y.definition 
     print x.wup_similarity(y) 
     print '\n' 

這裏是總輸出:

game.n.01與規則的較量,以確定一個勝利者leonardo.n.01 意大利畫家,雕刻家和工程師和科學家和建築師; 意大利文藝復興時期最多才多藝的天才(1452-1519) 0.285714285714

game.n.02運動或其他競賽leonardo.n.01 意大利畫家,雕刻家和工程師,科學家和建築師的單次播放; 意大利文藝復興時期最多才多藝的天才(1452-1519) 0.285714285714

game.n.03遊或消遣leonardo.n.01意大利畫家,雕刻家 和工程師兼科學家和建築師;意大利文藝復興時期最多才多藝的天才 (1452-1519) 0.25

game.n.04動物捕獵食物或運動leonardo.n.01意大利0​​畫家,雕刻家和工程師,科學家和建築師;意大利文藝復興時期的 最多才多藝的天才(1452-1519) 0.923076923077

game.n.05(網球)的在此期間,一名球員提供 leonardo.n.01意大利畫家,雕刻家和工程師,發揮分工科學家 和建築師;意大利文藝復興時期 (1452-1519) 0.222222222222

game.n.06(遊戲)在特定點的分數或分數的最多才多藝的天才需要 贏得leonardo.n.01意大利畫家和雕塑家和工程師和 科學家和建築師;意大利文藝復興時期 的最多才多藝的天才(1452-1519) 0.285714285714

game.n.07是用於食品 leonardo.n.01意大利畫家,雕刻家和工程師和科學家 野生動物的肉和建築師;意大利文藝復興時期 的最多才多藝的天才(1452-1519) 0.5

plot.n.01祕密計劃做一些事情(尤指 陰招或非法)leonardo.n.01意大利畫家,雕刻家和 工程師和科學家和建築師;在 意大利文藝復興時期(1452-1519) 0.2

game.n.09的最多才多藝的天才,以便在需要的遊戲設備玩特定遊戲 leonardo.n.01意大利畫家,雕刻家和工程師和科學家 和建築師;意大利文藝復興時期最多才多藝的天才 (1452-1519) 0.666666666667

game.n.10你的職業或工作線路leonardo.n。01意大利0​​畫家和雕塑家兼工程師和科學家和建築師;意大利文藝復興時期的 最多才多藝的天才(1452-1519) 0.25

game.n.11輕浮瑣碎或行爲leonardo.n.01意大利畫家 和雕刻家和工程師,科學家和建築師;意大利文藝復興時期最 多才多藝的天才(1452-1519) 0.222222222222

bet_on.v.01發生在leonardo.n.01意大利畫家和雕塑家 和工程師,科學家和建築師賭注;的 最多才多藝的天才意大利文藝復興時期(1452-1519) -1

crippled.s.01在腳或腿leonardo.n.01意大利0​​畫家,雕刻家和工程師,科學家和建築師禁用;意大利文藝復興時期的 最多才多藝的天才(1452-1519) -1

game.s.02願意面對leonardo.n.01意大利畫家,雕刻家 和工程師兼科學家和建築師的危險;最多才多藝的天才 意大利文藝復興時期(1452-1519) -1

但game.n.04和leonardo.n.01之間的相似性是非常奇怪的。我認爲相似度(0.923076923077)不應該這麼高。

game.n.04

動物捕獵食物或運動

leonardo.n.01

的意大利畫家,雕刻家和工程師,科學家和建築師;意大利文藝復興時期(1452-1519)

0.923076923077

最多才多藝的天才有沒有用我的概念什麼問題嗎?

回答

8

the docs,在wup_similarity()方法返回...

...得分表示兩個字意義的相似程度的基礎上, 深度分類中的兩個感官和他們的最不常用 Subsumer(最具體的祖先節點)。

......還有......

>>> from nltk.corpus import wordnet as wn 
>>> game = wn.synset('game.n.04') 
>>> leonardo = wn.synset('leonardo.n.01') 
>>> game.lowest_common_hypernyms(leonardo) 
[Synset('organism.n.01')] 
>>> organism = game.lowest_common_hypernyms(leonardo)[0] 
>>> game.shortest_path_distance(organism) 
2 
>>> leonardo.shortest_path_distance(organism) 
3 

...這就是爲什麼它認爲它們是相似的,雖然我得到...

>>> game.wup_similarity(leonardo) 
0.7058823529411765 

...這由於某種原因不同。


更新

我想要一些測量,這將表明,相異性( '遊戲', '棋')大於相異性( '遊戲', '達芬奇')要少得多多

如何這樣的事情...

from nltk.corpus import wordnet as wn 
from itertools import product 

def compare(word1, word2): 
    ss1 = wn.synsets(word1) 
    ss2 = wn.synsets(word2) 
    return max(s1.path_similarity(s2) for (s1, s2) in product(ss1, ss2)) 

for word1, word2 in (('game', 'leonardo'), ('game', 'chess')): 
    print "Path similarity of %-10s and %-10s is %.2f" % (word1, 
                  word2, 
                  compare(word1, word2)) 

...哪打印...

Path similarity of game  and leonardo is 0.17 
Path similarity of game  and chess  is 0.25 
+0

感謝您的解釋。但是什麼計算會顯示它們的原始/近似不相似性? – qmaruf

+0

@QuaziMarufurRahman取決於你如何定義「不相似性」。你可能會用'path_distance()'方法得到更好的結果,但這取決於你想要測量的是什麼。 – Aya

+0

其實我想要一些測量,表明不相似('遊戲','國際象棋')比差異性要小得多('遊戲','leonardo') – qmaruf