Nlp 搜索引擎中查询和文档的余弦相似性

Nlp 搜索引擎中查询和文档的余弦相似性,nlp,ranking,information-retrieval,cosine-similarity,ranking-functions,Nlp,Ranking,Information Retrieval,Cosine Similarity,Ranking Functions,我正在翻阅信息检索手册。目前我正在做关于余弦相似性的部分。有一件事我不清楚。 假设我有用于查询和文档的tf idf向量。我想计算两个向量之间的余弦相似性。当我计算文档向量的大小时,我是要求向量中所有项的平方和,还是只求查询中的项的平方和 下面是一个例子:我们有用户查询“猫粮牛肉”。 假设它的向量是(0,1,0,1,1)。(假设向量中只有5个方向,查询和文档中的每个唯一单词对应一个方向) 我们有一份文件“牛肉很好吃” 它的向量是(1,1,1,0,0)。我们希望找到查询和文档向量之间的余弦相似性。余

我正在翻阅信息检索手册。目前我正在做关于余弦相似性的部分。有一件事我不清楚。
假设我有用于查询和文档的tf idf向量。我想计算两个向量之间的余弦相似性。当我计算文档向量的大小时,我是要求向量中所有项的平方和,还是只求查询中的项的平方和

下面是一个例子:我们有用户查询“猫粮牛肉”。 假设它的向量是(0,1,0,1,1)。(假设向量中只有5个方向,查询和文档中的每个唯一单词对应一个方向) 我们有一份文件“牛肉很好吃”
它的向量是(1,1,1,0,0)。我们希望找到查询和文档向量之间的余弦相似性。

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

  • 分子是两个向量之间的点积
  • 分母是两个向量大小的乘积
    • i、 e.欧几里德长度,即向量与其自身的点积的平方根
对于分子,例如在
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
>>> 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
>>> from scipy import spatial
>>> 1 - spatial.distance.cosine(x,y)
0.33333333333333337
类似地,如果我们将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
计算大小:

>>> 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
>>> 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
>>> from scipy import spatial
>>> 1 - spatial.distance.cosine(x,y)
0.33333333333333337
类似地,如果我们计算不带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
使用余弦距离函数:

>>> 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
>>> 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
>>> from scipy import spatial
>>> 1 - spatial.distance.cosine(x,y)
0.33333333333333337
另见


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

    • 分子是两个向量之间的点积
    • 分母是两个向量大小的乘积
      • i、 e.欧几里德长度,即向量与其自身的点积的平方根
    对于分子,例如在
    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
    
    >>> 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
    
    >>> from scipy import spatial
    >>> 1 - spatial.distance.cosine(x,y)
    0.33333333333333337
    
    类似地,如果我们将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
    计算大小:

    >>> 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
    
    >>> 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
    
    >>> from scipy import spatial
    >>> 1 - spatial.distance.cosine(x,y)
    0.33333333333333337
    
    类似地,如果我们计算不带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
    使用余弦距离函数:

    >>> 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
    
    >>> 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
    
    >>> from scipy import spatial
    >>> 1 - spatial.distance.cosine(x,y)
    0.33333333333333337
    
    另见

    跨站点副本:,跨站点副本:,