搜索引擎中查询和文档之间的余弦相似度

时间:2017-11-05 17:58:32

标签: nlp ranking information-retrieval cosine-similarity ranking-functions

我正在阅读Manning的信息检索书。目前我处于余弦相似性的部分。有一点我不清楚。
 假设我有查询和文档的tf-idf向量。我想计算两个向量之间的余弦相似度。当我计算文档向量的大小时,我是否对向量中的所有项的平方或仅查询中的项进行求和?

这是一个例子:我们有用户查询"猫食牛肉" 。 让我们说它的向量是(0,1,0,1,1)。(假设在向量中只有5个方向,对于查询和文档中的每个唯一字一个) 我们有一份文件"牛肉很美味" 它的向量是(1,1,1,0,0)。我们想要找到查询和文档向量之间的余弦相似性。

1 个答案:

答案 0 :(得分:0)

余弦相似性只是

的一个分数
  • 分子是2个向量之间的点积
  • 分母是2个向量的大小的乘积
    • 即。欧几里德长度,即矢量与其自身的点积的平方根

表示分子,例如在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

另见