我正在阅读Manning的信息检索书。目前我处于余弦相似性的部分。有一点我不清楚。
假设我有查询和文档的tf-idf向量。我想计算两个向量之间的余弦相似度。当我计算文档向量的大小时,我是否对向量中的所有项的平方或仅查询中的项进行求和?
这是一个例子:我们有用户查询"猫食牛肉" 。 让我们说它的向量是(0,1,0,1,1)。(假设在向量中只有5个方向,对于查询和文档中的每个唯一字一个) 我们有一份文件"牛肉很美味" 它的向量是(1,1,1,0,0)。我们想要找到查询和文档向量之间的余弦相似性。
答案 0 :(得分:0)
余弦相似性只是
的一个分数表示分子,例如在numpy
:
>>> import numpy as np
>>> y = [1.0, 1.0, 1.0, 0.0, 0.0]
>>> x = [0.0, 1.0, 0.0, 1.0, 1.0]
>>> np.dot(x,y)
1.0
类似地,如果我们通过乘以x_i和y_i并将各个元素相加来计算点积:
>>> x_dot_y = sum([(1.0 * 0.0) + (1.0 * 1.0) + (1.0 * 0.0) + (0.0 * 1.0) + (0.0 * 1.0)])
>>> x_dot_y
1.0
对于分母,我们可以用numpy
计算幅度:
>>> from numpy.linalg import norm
>>> y = [1.0, 1.0, 1.0, 0.0, 0.0]
>>> x = [0.0, 1.0, 0.0, 1.0, 1.0]
>>> norm(x) * norm(y)
2.9999999999999996
同样,如果我们计算欧几里德长度而不是numpy
>>> import math
# with np.dot
>>> math.sqrt(np.dot(x,x)) * math.sqrt(np.dot(y,y))
2.9999999999999996
所以余弦相似度是:
>>> cos_x_y = np.dot(x,y) / (norm(x) * norm(y))
>>> cos_x_y
0.33333333333333337
您也可以直接使用scipy
:
>>> from scipy import spatial
>>> 1 - spatial.distance.cosine(x,y)
0.33333333333333337
另见