计算余弦相似度

时间:2020-05-19 16:21:30

标签: information-retrieval

我试图弄清楚如何计算这两个向量的余弦相似度:

A:(1,1,0,0,0,0,0,0,0)

B:(1,0,0,1,0,0,0,0,1)

据我了解,我需要将A乘以B,然后除以A*B的长度。

我了解第一部分,但是我怎么知道长度是多少?

  • A是一个包含11个单词的文档

  • B是一个包含7个单词的查询

长度是指单词数吗?还是我必须对向量进行“归一化”?我不确定,因为据我所知,余弦已经对向量进行了归一化。

任何帮助和提示将不胜感激。

1 个答案:

答案 0 :(得分:0)

向量运算是在向量空间的元素上定义的(必须预先定义其维数)。

因此,即使我们松散地使用术语sparse vector,也仅是表示dense vector的有效方法...

对于涉及文本向量的示例-文档和查询都不过是密集向量(维数是整个词汇量的大小)。

第一步是将文档和查询转换为密集的矢量表示形式。

如果D = {<the cat sat on the mat>和Q = <cat on mat>

然后词汇量(一组独特的单词)是{cat,mat,on,sat,the}

因此,我们的玩具向量空间为5维。因此,每个向量都由5个数字表示,其中的值表示相应项的存在/不存在或计数。

vec(D) = (1, 1, 1, 1, 2)-因为cat发生一次,所以在D中出现两次,依此类推。

类似地,vec(Q) = (1, 1, 1, 0, 0)-注意与不存在的术语相对应的0,例如术语the

余弦相似度是归一化的内积。

分子只是\ sum_i a_i * b_i,在此示例中为 1.1 + 1.1 + 1.1 + 1.0 + 2.0 = 3

长度如何?为了找到向量的长度(特别是L2范数),只需计算其自身的内积,然后取平方根即可。

Len(D) = sqrt(1.1 + 1.1 + 1.1 + 1.1 + 2.2) = 2sqrt(2)

Len(Q) = sqrt(1.1 + 1.1 + 1.1 + 0.0 + 0.0) = sqrt(3)

因此cosine-sim = 3/(2sqrt(2)*sqrt(3))

最后,例如,

A:(1,1,0,0,0,0,0,0,0) and B:(1,0,0,1,0,0,0,0,1),

A.B = 1
Len(A) = sqrt(A.A) = sqrt(2)
Len(B) = sqrt(A.A) = sqrt(3)

cosine-sim = 1/sqrt(6) = 0.4082