【发布时间】:2020-03-25 16:18:23
【问题描述】:
我正在尝试评估表示单词的两个向量的余弦相似度。我正在使用来自 fasttext 的预训练词向量。 现在,我想知道为什么我的余弦相似度总是一个正数,无论我使用什么词。有什么建议吗?
这是我的代码的那一部分。 a 和 b 是词向量。
def cos_sim(a, b):
dot_product = np.dot(a, b)
norm_a = np.linalg.norm(a)
norm_b = np.linalg.norm(b)
return dot_product / (norm_a * norm_b)
如果有人可以帮助我,我会很高兴,因为我仍然处于初学者的水平。
【问题讨论】:
-
您在上面发布的代码没有任何问题,当我尝试使用
a = [1, 1]和b = [-1, -1](即给出-1)时,它按预期工作。所以所有的余弦相似度都是正的纯粹是由于词向量。你是怎么得出他们都是积极的结论的?你都试过了吗?还有余弦相似度的 sklearn 实现,无需自己动手,link -
@Hiho 感谢您的回复!我尝试了大约 70 个单词或更多。因此,这只是巧合的可能性很小。我也有点困惑的是 np.dot 的描述,它是:“如果 a 是 N-D 数组并且 b 是 M-D 数组(其中 M>=2),它是最后一个轴的和积a 和 b 的倒数第二个轴:
dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])n 维 (n>2) 向量的点积总是这样计算的吗?我也会尝试 sklearn 实现来检查它是否有所作为. -
我不确定点积,但为什么在这种情况下这很重要,a 和 b 都应该是一维的?
-
@Hiho 哦哦哦!是的,对不起!我以为 [1,2,3] 会是 3D 的!好久没码字了!谢谢!
标签: numpy trigonometry similarity fasttext