I'm trying to use 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值的顺序重要吗?应该对它们进行分类吗——或者对这个计算来说不重要吗?
最佳答案
你在计算术语向量的余弦相似性吗?术语向量的长度应该相同。如果文档中没有单词,则该词的值应为0。
我不确定你要对哪些向量应用余弦相似性,但是当做余弦相似性时,你的向量应该总是相同的长度和顺序,这非常重要。
例子:
Term | Doc1 | Doc2
Foo .3 .7
Bar | 0 | 8
Baz | 1 | 1
这里有两个向量(.3,0,1)和(.7,8,1),可以计算它们之间的余弦相似性。如果你比较(.3,1)和(.7,8),你会比较BAZ的DOC1分数和BAR的DOC2分数,这是没有意义的。
关于python - 不同长度矢量的余弦相似度?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3121217/