计算余弦相似性

问题描述 投票:0回答:1

我想知道如何计算这两个向量的余弦相似度。

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

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

根据我的理解,我需要将这两个向量的余弦相似度乘以 AB 然后除以 A*B.

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

  • A 是一个有11个字的文档

  • B 是一个有7个字的查询

长度是指字数吗?还是我必须对向量进行 "归一化"?我不确定,因为根据我的理解,余弦已经对向量进行了归一化。

任何帮助和提示都将被感激。

information-retrieval
1个回答
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) - 因为猫出现一次,所以D中出现两次,以此类推。

同理。vec(Q) = (1, 1, 1, 0, 0) - 请注意,0对应的是不存在的术语,例如,术语 the.

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

分母是简单的 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
© www.soinside.com 2019 - 2024. All rights reserved.