python nltk为wordnet相似性度量返回奇数结果

时间:2013-06-25 11:52:40

标签: python nltk wordnet

我试图使用python nltk的wordnet找到两个单词之间的相似性。两个示例关键字是“游戏”和“leonardo”。首先,我提取了这两个单词的所有同义词,并交叉匹配每个synset以找到它们的相似性。这是我的代码

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

     游戏.n.02一项运动或其他比赛的单一游戏leonardo.n.01   意大利画家和雕塑家和工程师,科学家和建筑师;   意大利文艺复兴时期最多才多艺的天才(1452-1519)   0.285714285714

     

game.n.03娱乐或消遣leonardo.n.01意大利画家和   雕塑家和工程师,科学家和建筑师;最通用的   意大利文艺复兴时期的天才(1452-1519)   0.25

     游戏.n.04动物猎食食物或运动leonardo.n.01意大利语   画家和雕塑家和工程师,科学家和建筑师;该   意大利文艺复兴时期最多才多艺的天才(1452-1519)   0.923076923077

     

game.n.05(网球)一个玩家所服务的游戏分区   leonardo.n.01意大利画家和雕塑家,工程师和科学家   和建筑师;意大利文艺复兴时期最多才多艺的天才   (1452-1519)   0.222222222222

     

game.n.06(游戏)特定点的得分或所需得分   赢得leonardo.n.01意大利画家和雕塑家和工程师   科学家和建筑师;意大利人最多才多艺的天才   文艺复兴时期(1452-1519)   0.285714285714

     游戏.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意大利语   画家和雕塑家和工程师,科学家和建筑师;该   意大利文艺复兴时期最多才多艺的天才(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意大利人   画家和雕塑家和工程师,科学家和建筑师;该   意大利文艺复兴时期最多才多艺的天才(1452-1519)   -1

     游戏.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

我的概念有问题吗?

1 个答案:

答案 0 :(得分:8)

根据the docswup_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

......由于某种原因,这是不同的。


<强>更新

  

我想要一些可以显示不同的测量结果('游戏',   'chess')远不如不相似('游戏','leonardo')

这样的事情怎么样......

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