如何使用 Python NLTK 计算 WordNet 中两个形容词之间的最短路径(测地线)距离?

How do I calculate the shortest path (geodesic) distance between two adjectives in WordNet using Python NLTK?

计算 WordNet 中两个同义词集之间的语义相似度可以使用几个内置的相似度度量轻松完成,例如:

synset1.path_similarity(synset2)

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

synset1.wup_similarity(synset2),吴-帕默相似度

(as seen here)

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

我尝试了 path_similarity(),但正如预期的那样 returns '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))

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

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

如前所述,nouns/verbs 相似性很容易从

中提取
>>> 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

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

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

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

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

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

另请参阅:

  • Compare similarity of terms/expressions using NLTK?
  • check if two words are related to each other
  • How to determine semantic hierarchies / relations in using NLTK?
  • Is there an algorithm that tells the semantic similarity of two phrases
  • Semantic Relatedness Algorithms - python

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

论文:

Kamps, Jaap, et al. "Using WordNet to Measure Semantic Orientations of Adjectives." LREC. Vol. 4. 2004.

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

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