没有简单的方法来获得非名词/动词的单词之间的相似性。
如前所述,名词/动词的相似性很容易从
>>> 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])
,你应该尝试谷歌
- 潜在语义索引/潜在语义分析
- 词袋
- 向量空间模型语义
- Word2Vec、Doc2Vec、Wiki2Vec
- 神经网络
- 余弦相似度自然语言语义
您还可以尝试一些现成的软件/库,例如:
- Gensim https://radimrehurek.com/gensim/
除了向量空间模型之外,您还可以尝试一些图形模型,将单词放入图表中,并使用诸如 pagerank 之类的东西来遍历图表,以提供一些相似性度量。
也可以看看:
- 使用 NLTK 比较术语/表达式的相似度?
- 检查两个单词是否彼此相关
- 如何确定使用 NLTK 时的语义层次/关系?
- 有没有一种算法可以告诉两个短语的语义相似度
- 语义相关性算法 - python