如何衡量单词的语义相似度?

数据挖掘 nlp 词嵌入 word2vec nltk
2021-09-21 22:10:18

找出单词语义相似度的最佳方法是什么?Word2Vec 还可以,但并不理想:

# Using the 840B word Common Crawl GloVe vectors with gensim:

# 'hot' is closer to 'cold' than 'warm'
In [7]: model.similarity('hot', 'cold')
Out[7]: 0.59720456121072973

In [8]: model.similarity('hot', 'warm')
Out[8]: 0.56784095376659627

# Cold is much closer to 'hot' than 'popular'
In [9]: model.similarity('hot', 'popular')
Out[9]: 0.33708479049537632

NLTK 的 Wordnet 方法似乎放弃了:

In [25]: print wn.synset('hot.a.01').path_similarity(wn.synset('warm.a.01'))
None

还有什么其他选择?

4个回答

Word2vec 不会根据反义词和同义词捕获相似性。如果两个词具有相似的上下文,Word2vec 会给出更高的相似度。例如,加利福尼亚的天气是_____。空白可以由热和冷填充,因此相似度会更高。这个概念被称为范式关系。

如果您有兴趣捕获上位词、下位词、同义词、反义词等关系,则必须使用任何基于 wordnet 的相似性度量。有许多基于 wordnet 的相似性度量。您可以查看此链接

Text Analytic Tools for Semantic Similarity中,他们开发了一种算法来找出两个句子之间的相似性。但是如果你仔细阅读,他们会在一个矩阵中找到单词的相似度,然后将它们相加来找出句子之间的相似度。因此,检查单词相似度可能是一个机会。

同样在SimLex-999: Evaluating Semantic Models With (Genuine) Similarity Estimation中,他们解释了 和 之间的差异associationsimilarity这也可能是您观察的原因。例如,咖啡和杯子。它们并不相似,但它们是关联的。因此,仅考虑相似性会产生不同的结果。作者提出了各种模型来估计它们。

Word2vec 是大多数场景的一个很好的起点。确实通过使用 CBOW 方法进行预测来捕获语义。它允许翻译(作为我可以再次放在这里的最重复的例子),V(King) - V(Queen)~~ V(men) - V(women)等等。

那么问题是什么?问题在于词义歧义。每当单词本身在两个不同的上下文中具有两种不同的含义时,单词向量就会真正远离任何一个上下文。Python ~ Boa(都是蛇)和 Python - Java(都是编程语言)..

有什么选择吗?

对于“同义词”的非常具体的目的,如果你想要Wordnet将是理想的地方。它捕获两个单词的显式关系,而不是基于用法和出现的隐式关系。

Wordnet 主要是作为字典制作的 - word2vec 是通过使用来挖掘的。

在上下文无关的语法中,我认为确定单词的接近程度确实是不可能的。您可以做的是使用词典向量,然后如果一个单词在两个词典之间的值接近,则该值应该接近。