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



我正在尝试使用python nltk的wordnet来查找两个单词之间的相似性。两个示例关键字是"game"one_answers"leonardo"。首先,我提取了这两个词的所有同义词集,并对每个同义词集进行交叉匹配,以找到它们的相似性。这是我的代码

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一场有规则的比赛,以确定获胜者莱昂纳多。n.01意大利画家、雕塑家、工程师、科学家和建筑师;意大利文艺复兴时期最多才多艺的天才(1452-1519)0.285714285714

一项运动或其他比赛的一场比赛意大利画家、雕塑家、工程师、科学家和建筑师;意大利文艺复兴时期最多才多艺的天才(1452-1519)0.285714285714

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

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

(网球)一个选手发球的赛区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

密谋做某事的秘密计划(尤指某事意大利画家、雕塑家和工程师、科学家和建筑师;最多才多艺的天才意大利文艺复兴时期(1452-1519)0.2

game.n.09玩特定游戏所需的游戏设备leonardo.n.01意大利画家、雕塑家、工程师和科学家建筑师;意大利文艺复兴时期最多才多艺的天才(1452-1519)0.666666666667

game.n.10你的职业或工作线leonardo.n.01意大利语画家、雕塑家、工程师、科学家和建筑师;这个意大利文艺复兴时期最多才多艺的天才(1452-1519)0.25

游戏.11轻浮或琐碎的行为莱昂纳多.01意大利画家雕塑家、工程师、科学家和建筑师;最多的意大利文艺复兴时期多才多艺的天才(1452-1519)0.222222222222

bet_on.v.01把赌注押在莱昂纳多身上。0.01意大利画家和雕塑家工程师、科学家和建筑师;最多才多艺的天才意大利文艺复兴(1452-1519)-1

残疾人d.s.01脚或腿残疾leonardo.n.01意大利人画家、雕塑家、工程师、科学家和建筑师;这个意大利文艺复兴时期最多才多艺的天才(1452-1519)-1

game.s.02愿意面对危险leonardo.n.01意大利画家和雕塑家、工程师、科学家和建筑师;最全能的意大利文艺复兴时期的天才(1452-1519)-1

但是game.n.04和leonardo.01之间的相似性真的很奇怪。我认为相似性(0.923076923077)不应该这么高。

game.n.04

为食物或运动而狩猎的动物

leonardo.n.01

意大利画家、雕塑家、工程师、科学家和建筑师;意大利文艺复兴时期最多才多艺的天才(1452-1519)

0.923076923077

我的概念有问题吗?

根据文档,wup_similarity()方法返回。。。

基于两种意义在分类学中的深度及其最不常见的深度子消费者(最特定的祖先节点)。

>>> 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

由于某些原因而不同。


更新

我想要一些测量来显示这种不同("game","国际象棋")远小于相异性("game","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

最新更新