可以使用几种内置的相似性度量轻松地计算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))

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

最佳答案

要获得非名词/动词的单词之间的相似性,没有简单的方法。

如前所述,名词/动词相似性很容易从中提取

>>> 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 for
  • 潜在语义索引/潜在语义分析
  • 单词袋
  • 向量空间模型语义
  • Word2Vec,Doc2Vec,Wiki2Vec
  • 神经网络
  • 余弦相似度自然语言语义

  • 您还可以尝试一些现成的软件/库,例如:
  • Gensim https://radimrehurek.com/gensim/
  • http://webcache.googleusercontent.com/search?q=cache:u5y4He592qgJ:takelab.fer.hr/sts/+&cd=2&hl=en&ct=clnk&gl=sg

  • 除了向量空间模型,您还可以尝试一些图形模型,该模型将单词放入图形中并使用诸如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
  • 10-06 10:32