在 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 中使用余弦相似度返回与查询文档相比最相似的文档的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用lsa包计算余弦相似度(Cosine Similarity)实战:两个向量的余弦相似度矩阵的余弦相度