我正在尝试使用TF-IDF将文档分类。我已经计算了一些文档的tf_idf,但是当我尝试计算两个这些文档之间的余弦相似度时,出现了一个回溯错误:
#len(u)==201, len(v)==246
cosine_distance(u, v)
ValueError: objects are not aligned
#this works though:
cosine_distance(u[:200], v[:200])
>> 0.52230249969265641
将向量切片以使len(u)==len(v)是正确的方法吗?我认为余弦相似度可以处理长度不同的向量。
我正在使用这个函数:
def cosine_distance(u, v):
"""
Returns the cosine of the angle between vectors v and u. This is equal to
u.v / |u||v|.
"""
return numpy.dot(u, v) / (math.sqrt(numpy.dot(u, u)) * math.sqrt(numpy.dot(v, v)))
另外,tf_idf向量中的值的顺序是否重要?它们应该被排序吗,还是对于此计算来说无关紧要?
Doc1*Doc1
的点积时,您需要到达Doc1
的完整长度,但不需要超过。对于Doc2*Doc2
,则需要到达Doc2
的完整长度,但不需要超过。在点积的这一部分中,不要截断较长的向量,但无需填充较短的向量。但是,在计算Doc1*Doc2
时,您可以安全地截断较长的向量。因此,您的代码应该设计为让“点积”函数做出关于填充/截断的决策,而不是让“余弦相似性”函数做出这些决策。 - Ken Bloom