我对计算向量相似度很感兴趣,但这种相似度必须是介于0和1之间的数字。有许多关于tf-idf和余弦相似度的问题,都表明该值在0和1之间。来自维基百科的引用如下:
在信息检索的情况下,两个文档的余弦相似度将在0到1之间,因为术语频率(使用tf-idf权重)不能为负数。两个词频向量之间的夹角不能大于90°。
特别之处在于,我希望计算来自两个不同word2vec模型的两个向量之间的相似度。尽管这些模型已经对齐,但它们实际上应该在相同的向量空间中表示它们的单词。我可以像这样计算
在信息检索的情况下,两个文档的余弦相似度将在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之间。她的直觉是取绝对值,但在我看来,这似乎是更糟糕的选择,因为这样你将把相反的值映射为相同的值。然而,考虑到余弦相似性的实际含义,我可能是错误的。因此,如果取绝对值是正确的方法,我们也可以这样做。
norm_sim
重新缩放为0.0到1.0是可以的,如果你的唯一目的是获得0.0-1.0的范围...但是当然,结果值不再是真正的余弦相似度。这有关系吗?如果不知道你其他的目标和想要0.0-1.0分数的原因,那就不清楚了。 - gojomo