我不确定你的实现方式,但是两个向量的
余弦距离等于这些向量的归一化点积。
两个矩阵的点积可以表示为a . b = a
Tb。因此,如果矩阵长度不同,则无法通过点积来识别余弦值。
现在,在标准的TF*IDF方法中,矩阵中的术语应该按
term, document
索引,因此在文档中未出现的任何术语都应该在您的矩阵中出现为零。
现在,您设置的方式似乎表明有两个不同的矩阵用于您的两个文档。我不确定这是否是您的意图,但它似乎是不正确的。
另一方面,如果其中一个矩阵应该是您的查询,则它应该是一个向量而不是矩阵,以便转置产生正确的结果。
以下是TF*IDF的完整解释:
在经典的TF-IDF中,您需要构建一个术语-文档矩阵a
。矩阵a
中的每个值都被描述为ai,j,其中i
是术语,j
是文档。该值是局部、全局和归一化权重的组合(如果您对文档进行了归一化,则归一化权重应为1)。因此,ai,j=fi,j*D/di,其中fi,j是单词i
在文档j
中的频率,D
是文档大小,di是包含术语i
的文档数量。
您的查询是一个术语向量,指定为b
。对于查询q
中的每个术语bi,q,它都指代查询q
的术语i
。bi,q=fi,q,其中fi,q是查询q
中术语i
的频率。在这种情况下,每个查询都是一个向量,多个查询形成一个矩阵。
我们可以计算每个向量的单位向量,这样当我们取点积时,它将产生正确的余弦值。为了实现单位向量,我们将矩阵
a
和查询
b
都除以它们的
Frobenius norm。
最后,我们可以通过对给定查询的向量
b
进行转置来执行余弦距离。因此,每次计算只有一个查询(或向量)。这被表示为 b
Ta。最终结果是一个包含每个项得分的向量,其中较高的得分表示更高的文档排名。