0和1之间的余弦相似度

8
我对计算向量相似度很感兴趣,但这种相似度必须是介于0和1之间的数字。有许多关于tf-idf和余弦相似度的问题,都表明该值在0和1之间。来自维基百科的引用如下:
在信息检索的情况下,两个文档的余弦相似度将在0到1之间,因为术语频率(使用tf-idf权重)不能为负数。两个词频向量之间的夹角不能大于90°。
特别之处在于,我希望计算来自两个不同word2vec模型的两个向量之间的相似度。尽管这些模型已经对齐,但它们实际上应该在相同的向量空间中表示它们的单词。我可以像这样计算model_a中的一个单词与model_b中的一个单词之间的相似性:
import gensim as gs
from sklearn.metrics.pairwise import cosine_similarity

model_a = gs.models.KeyedVectors.load_word2vec_format(model_a_path, binary=False)
model_b = gs.models.KeyedVectors.load_word2vec_format(model_b_path, binary=False)

vector_a = model_a[word_a].reshape(1, -1)
vector_b = model_b[word_b].reshape(1, -1)

sim = cosine_similarity(vector_a, vector_b).item(0)

但是sim是一个[-1,1]范围内的相似度度量。是否有一种科学可靠的方法将其映射到[0,1]范围内?直觉上,我认为类似下面的内容可能会有帮助:

norm_sim = (sim + 1) / 2

这样做可以,但我不确定它是否符合余弦相似性的实际含义。如果不是,是否建议使用其他相似度指标?

我尝试让值介于0和1之间的原因是,数据将传递给同事,她将其用作机器学习系统的特征,该系统期望所有值介于0和1之间。她的直觉是取绝对值,但在我看来,这似乎是更糟糕的选择,因为这样你将把相反的值映射为相同的值。然而,考虑到余弦相似性的实际含义,我可能是错误的。因此,如果取绝对值是正确的方法,我们也可以这样做。


1
他们所说的只是具有标准化(单位)向量长度的向量点积。这只是两个向量之间夹角的余弦值(如果你将长度缩放为1)。这就是90度参考的来源,因为超过90度它会变成负数。 - Tom Karzes
为什么需要数值在0到1的范围内?(像word2vec这样的“密集”嵌入具有从原点开始的各个方向的向量,因此余弦相似性可能是负数。普通的TF-IDF,基于词袋中的单词计数,只会得到0到1的结果。)你将-1.0到1.0的norm_sim重新缩放为0.0到1.0是可以的,如果你的唯一目的是获得0.0-1.0的范围...但是当然,结果值不再是真正的余弦相似度。这有关系吗?如果不知道你其他的目标和想要0.0-1.0分数的原因,那就不清楚了。 - gojomo
感谢您对@gojomo的关注。我添加了一个最终段落来解释为什么我需要该范围内的这个值。如果有一种方法可以强制word2vec只生成正向量,那就太酷了 - 即使考虑到word2vec的语义如何,我也不确定它可能如何工作。 - Bram Vanroy
好的,这是一个合理的理由来喜欢0.0-1.0(虽然许多学习算法应该可以使用-1.0到1.0的范围)。现在值不再是真正的全角度范围可能并不重要。(如果算法需要真实的角度,它将使用-1.0到1.0。)使用绝对值是一个坏主意,因为它会改变相似性的排名顺序-将一些本来最不相似的结果向上移动。 - gojomo
此外,还有其他研究表明,通常的词向量可能不会在原点周围“平衡”(因此您将看到比随机超球中的点预期更少的负余弦相似性),将它们移动以使其更平衡通常会改善它们用于其他任务。请参见:https://arxiv.org/abs/1702.01417v2 - gojomo
显示剩余2条评论
2个回答

5
您有充分的理由偏爱0.0-1.0(尽管许多学习算法应该可以使用-1.0到1.0的范围),如果您的唯一目的是获得0.0-1.0的范围,那么您的norm_sim重新缩放从-1.0到1.0到0.0到1.0是可以接受的,但当然结果值不再是真正的余弦相似度了。
值不再是完整的角度也不一定重要,如果算法需要实际角度,则会使用-1.0到1.0。使用无符号绝对值将是一个坏主意,因为它会改变相似性的排名顺序,将一些本来最不相似的结果上升。

有关将单词向量限制为仅具有非负值的工作已经在进行中,通常的好处是结果维度更容易被单独解释。 (例如,请参见https://cs.cmu.edu/~bmurphy/NNSE/。)但是,gensim不支持此变体,只有尝试才能确定它是否对任何特定项目更好。

此外,还有其他研究表明,通常的单词向量可能不会在原点周围“平衡”(因此,您将看到比随机超球中的点预期的负余弦相似度更少),将它们移动以使其更平衡通常会改善它们用于其他任务。请参见:https://arxiv.org/abs/1702.01417v2


你好@gojomo,能否解释一下为什么非负值使嵌入可解释?您如何理解每个嵌入维度的含义? - N. F.
你需要查阅论文以获取支持他们方法的任何推理。 - gojomo

0

对于@gojomo的回答,我想更新一下,你需要拥有可解释的词嵌入,其中包含非负值的维度(与Mikolov等人提出的原始word2vec模型相反)。从这个意义上讲,您将能够使用0-1之间的余弦相似度获得单词相似性。

这篇论文是解决这个问题的好开端: https://www.aclweb.org/anthology/D15-1196


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接