gpt4 book ai didi

java余弦相似度问题

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:58:02 26 4
gpt4 key购买 nike

我开发了一些java程序来计算基于TF*IDF的余弦相似度。它运作良好。但是有一个问题.... :(

例如:如果我有以下两个矩阵并且我想计算余弦相似度它不起作用,因为行的长度不相同

doc 1
1 2 3
4 5 6

doc 2
1 2 3 4 5 6
7 8 5 2 4 9

如果行和列的长度相同,那么我的程序运行良好,但如果行和列的长度不同,则程序运行不正常。

有什么建议吗???

最佳答案

我不确定你的实现,但 cosine distance两个 vector 的点积等于这些 vector 的归一化点积。

两个矩阵的点积可以表示为 a 。 b = aTb。因此,如果矩阵的长度不同,则无法通过点积来确定余弦。

现在,在标准的 TF*IDF 方法中,矩阵中的术语应由 term, document 索引,因此任何未出现在文档中的术语在矩阵中都应显示为零。

现在您设置它的方式似乎表明您的两个文档有两个不同的矩阵。我不确定这是否是您的意图,但它似乎不正确。

另一方面,如果您的一个矩阵应该是您的查询,那么它应该是一个 vector 而不是矩阵,以便转置产生正确的结果。

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 的术语 vector 。对于查询中的每个术语 bi,q 都引用查询 q 的术语 i。 bi,q = fi,q 其中 fi,q 是查询中术语 i 的频率q。在这种情况下,每个查询都是一个 vector ,多个查询形成一个矩阵。

然后我们可以计算每个 vector 的单位 vector ,这样当我们进行点积时,它会产生正确的余弦值。为了获得单位 vector ,我们将矩阵 a 和查询 b 除以它们的 Frobenius norm。 .

最后,我们可以通过对给定查询的 vector b 进行转置来计算余弦距离。因此每次计算一个查询(或 vector )。这表示为 bTa。最终结果是一个 vector ,其中包含每个术语的得分,其中得分越高表示文档排名越高。

关于java余弦相似度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2315987/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com