在 python 中使用余弦相似度返回与查询文档相比最相似的文档

Posted

技术标签:

【中文标题】在 python 中使用余弦相似度返回与查询文档相比最相似的文档【英文标题】:Return the most similar document compared to a query document by using Cosine similarity in python 【发布时间】:2012-03-17 23:29:49 【问题描述】:

我有一组文件和一个查询文档。我的目的是通过与每个文档的查询文档进行比较来返回最相似的文档。要首先使用余弦相似度,我必须将文档字符串映射到向量。另外我已经创建了一个计算每个文档的 tf-idf 函数。

要获取字符串的索引,我有一个类似的函数;

def getvectorKeywordIndex(self, documentList):
    """ create the keyword associated to the position of the elements within the    document vectors """
    #Mapped documents into a single word string
    vocabularyString = " ".join(documentList)
    vocabularylist= vocabularyString.split(' ')
    vocabularylist= list(set(vocabularylist))
    print 'vocabularylist',vocabularylist
    vectorIndex=
    offset=0
    #Associate a position with the keywords which maps to the dimension on the vector used to represent this word
    for word in vocabularylist:
        vectorIndex[word]=offset
        offset+=1
  print vectorIndex
  return vectorIndex,vocabularylist  #(keyword:position),vocabularylist

对于余弦相似度,我的功能是;

 def cosine_distance(self,index, queryDoc):

    vector1= self.makeVector(index)
    vector2= self.makeVector(queryDoc)

    return numpy.dot(vector1, vector2) / (math.sqrt(numpy.dot(vector1, vector1)) * math.sqrt(numpy.dot(vector2, vector2)))

TF-IDF 是 ;

def tfidf(self, term, key):

    return (self.tf(term,key) * self.idf(term))

我的问题是如何使用索引和词汇列表以及此函数内部的 tf-idf 创建 makevector。 欢迎任何答案。

【问题讨论】:

【参考方案1】:

您也应该将vectorIndex 传递给makeVector,并使用它来查找文档和查询中术语的索引。忽略未出现在vectorIndex 中的术语。

请注意,在处理文档时,您确实应该使用 scipy.sparse 矩阵而不是 Numpy 数组,否则您将很快耗尽内存。

(或者,考虑在 scikit-learn 中使用 Vectorizer 为您处理所有这些,使用 scipy.sparse 矩阵并计算 tf-idf 值。免责声明:我编写了该类的一部分。)

【讨论】:

以上是关于在 python 中使用余弦相似度返回与查询文档相比最相似的文档的主要内容,如果未能解决你的问题,请参考以下文章

与 BigQuery SQL 的余弦相似度?

如何编写返回两个文档之间余弦相似度的方法

如何使用python通过余弦相似度有效地检索前K相似文档?

R语言使用lsa包计算余弦相似度(Cosine Similarity)实战:两个向量的余弦相似度矩阵的余弦相度

如何使用Tensorflow获得数组的所有元素与同一数组中的所有其他元素的余弦相似度

Python中N-Gram、tf-idf和余弦相似度的简单实现