1

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

这是一个例子:我们有用户查询“cat food beef”。假设它的向量是 (0,1,0,1,1)。(假设向量中只有 5 个方向,一个用于查询和文档中的每个唯一单词)我们有一个文档“牛肉好吃”它的向量是 (1,1,1,0,0)。我们想要找到查询和文档向量之间的余弦相似度。

4

1 回答 1

1

余弦相似度只是一个分数,其中

  • 分子是两个向量之间的点积
  • 分母是两个向量大小的乘积
    • 即欧几里得长度,即向量与自身的点积的平方根

对于分子,例如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

也可以看看

于 2017-11-06T10:13:16.997 回答