【问题标题】:python nltk returning odd result for wordnet similarity measurepython nltk返回wordnet相似度测量的奇数结果
【发布时间】:2016-02-06 02:25:59
【问题描述】:

我正在尝试使用 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 意大利语 画家、雕塑家、工程师、科学家和建筑师;这 意大利文艺复兴时期最多才多艺的天才(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 意大利语 画家、雕塑家、工程师、科学家和建筑师;这 意大利文艺复兴时期最多才多艺的天才(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

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

但是 game.n.04 和 leonardo.n.01 之间的相似性真的很奇怪。我觉得相似度(0.923076923077)应该不会那么高。

game.n.04

为了食物或运动而猎杀动物

莱昂纳多.n.01

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

0.923076923077

我的概念有问题吗?

【问题讨论】:

    标签: python nltk wordnet


    【解决方案1】:

    根据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') 远小于 dissimilarity('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
    

    【讨论】:

    • 感谢您的解释。但是什么计算会显示它们的原始/近似差异?
    • @QuaziMarufurRahman 取决于您如何定义“差异性”。使用path_distance() 方法可能会获得更好的结果,但这取决于您要测量的具体内容。
    • 实际上我想要一些测量结果来表明差异('game', 'chess')远小于差异('game', 'leonardo')
    • 感谢更新代码。是否可以形象化两个词的关系? “chess.n.02”和“king.n.10”之间的相似度为 0.08。可视化将有助于验证这一点。
    • @QuaziMarufurRahman 我找不到简单的方法来做到这一点,但它应该是可能的。对其中一个同义词集对象执行dir(),并尝试使用它的方法,例如hypernym_paths()hypernym_distances()
    猜你喜欢
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多