2013-06-25 62 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