通过在python中使用余弦相似性,返回与查询文档相比最相似的文档

时间:2012-02-28 13:33:53

标签: python vector vocabulary tf-idf cosine-similarity

我有一组文件和一个查询文档。我的目的是通过与每个文档的查询文档进行比较来返回最相似的文档。首先使用余弦相似性我必须将文档字符串映射到矢量。另外我已经创建了一个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 个答案:

答案 0 :(得分:1)

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

中的字词

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

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