【问题标题】:How do I calculate the shortest path (geodesic) distance between two adjectives in WordNet using Python NLTK?如何使用 Python NLTK 计算 WordNet 中两个形容词之间的最短路径(测地线)距离?
【发布时间】:2015-09-22 21:51:05
【问题描述】:

在 WordNet 中计算两个同义词集之间的语义相似度可以很容易地通过几个内置的相似度度量来完成,例如:

synset1.path_similarity(synset2)

synset1.lch_similarity(synset2),Leacock-Chodorow 相似度

synset1.wup_similarity(synset2), Wu-Palmer 相似度

(as seen here)

但是,所有这些都利用了 WordNet 的分类关系,即名词和动词的关系。形容词和副词通过同义词、反义词和从属词相关联。如何测量两个形容词之间的距离(跳数)?

我尝试了path_similarity(),但正如预期的那样,它返回'None'

from nltk.corpus import wordnet as wn
x = wn.synset('good.a.01')
y = wn.synset('bad.a.01')


print(wn.path_similarity(x,y))

如果有任何方法可以计算一个形容词和另一个形容词之间的距离,将不胜感激。

【问题讨论】:

    标签: python nlp nltk wordnet cosine-similarity


    【解决方案1】:

    没有简单的方法来获得不是名词/动词的单词之间的相似度。

    如上所述,名词/动词的相似性很容易从

    中提取
    >>> from nltk.corpus import wordnet as wn
    >>> dog = wn.synset('dog.n.1')
    >>> cat = wn.synset('cat.n.1')
    >>> car = wn.synset('car.n.1')
    >>> wn.path_similarity(dog, cat)
    0.2
    >>> wn.path_similarity(dog, car)
    0.07692307692307693
    >>> wn.wup_similarity(dog, cat)
    0.8571428571428571
    >>> wn.wup_similarity(dog, car)
    0.4
    >>> wn.lch_similarity(dog, car)
    1.072636802264849
    >>> wn.lch_similarity(dog, cat)
    2.0281482472922856
    

    形容词很难,所以你需要建立自己的文本相似度设备。最简单的方法是使用向量空间模型,基本上所有的词都用一些浮点数来表示,例如

    >>> import numpy as np
    >>> blue = np.array([0.2, 0.2, 0.3])
    >>> red = np.array([0.1, 0.2, 0.3])
    >>> pink = np.array([0.1001, 0.221, 0.321])
    >>> car = np.array([0.6, 0.9, 0.5])
    >>> def cosine(x,y):
    ...     return np.dot(x,y) / (np.linalg.norm(x) * np.linalg.norm(y))
    ... 
    >>> cosine(pink, red)
    0.99971271929384864
    >>> cosine(pink, blue)
    0.96756147991512709
    >>> cosine(blue, red)
    0.97230558532824662
    >>> cosine(blue, car)
    0.91589118863996888
    >>> cosine(red, car)
    0.87469454283170045
    >>> cosine(pink, car)
    0.87482313596223782
    

    要为pink = np.array([0.1001, 0.221, 0.321]) 之类的东西训练一堆向量,您应该尝试 google

    • 潜在语义索引/潜在语义分析
    • 词袋
    • 向量空间模型语义
    • Word2Vec、Doc2Vec、Wiki2Vec
    • 神经网络
    • 余弦相似度自然语言语义

    您还可以尝试一些现成的软件/库,例如:

    除了向量空间模型,您还可以尝试一些图形模型,将单词放入图形中,并使用 pagerank 之类的东西在图形中走动,为您提供一些相似性度量。

    另见:

    【讨论】:

    • 感谢您的建议。 Kamps 等人有一篇论文。 (2004),其中他们确定了 WordNet 中形容词的极性(具有正面或负面情绪)。他们通过测量距离(adj1,bad)减去距离(adj1,bad)来做到这一点。所以他们在他们的论文中谈到了这个,但我不确定他们是如何实现这个的!!有什么想法吗? Link to paper@alvas
    • 他们似乎建立了一个图表,然后使用图表距离度量,但我不确定他们做了什么。可能你可以给作者发邮件;P
    【解决方案2】:

    Kamps et al. (2004) 的论文中,他们将单词图定义为节点,如果两个单词是同义词,则连接这些节点。然后他们将两个词之间的最短路径定义为它们的测地线距离。据我了解,边没有权重,这意味着当您想找到最短路径时,您基本上可以计算边数。

    论文:

    坎普斯、雅普等人。 “使用 WordNet 测量形容词的语义方向。” LREC。卷。 4. 2004.

    但他们真正寻求的是一种衡量语义定位的方法。这取决于您的应用程序来相应地选择最佳度量。最近获得巨大关注的一组相似性度量是基于分布假设。这些基于大型文档中单词使用的机器学习方法创建了几何相似度度量(例如余弦相似度)。但这些方法在概念上与 WordNet 距离度量是脱节的。

    但是,有一些工作围绕它使用同义词集中的 WordNet 光泽和定义作为上下文样本来学习单词的统计模型,例如 Patwardhan and Pedersen (2006)。但总的来说,这些模型不适合在没有积极性或消极性监督的情况下寻找情绪取向。

    【讨论】:

    • 是的,我已经探索了各种语义相似性度量,并使用它们将单词标记为正面或负面。我尝试过 WordNet 距离、以同义词集作为特征或以光泽信息作为特征的监督分类、随机游走、集成、形态词缀修改、影响信息和基于语料库/统计的分类。但我目前正在研究基于 WordNet 距离的形容词测量,以标记具有语义方向(极性)的单词。所以这就是为什么我只对形容词的距离感兴趣。我想我将开发一个代码来计算边缘。谢谢@Mehdi
    • 我认为,如果您构建所有图形然后找到最短路径,则需要进行大量计算。到目前为止,他们的测试集有限,目标有限,只是为了他们在论文中的观点。如果你发现在图中很难实现最短路径,也许你可以使用 random walk 模型来代替最短路径。我发现这篇论文与使用 WordNet 图的想法非常相关:nlp.stanford.edu/pubs/wordwalk-textgraphs09.pdf
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多