gpt4 book ai didi

similarity - 使用余弦相似度测量的 n 元句子相似度

转载 作者:行者123 更新时间:2023-12-03 01:41:47 25 4
gpt4 key购买 nike

我一直在从事一个关于句子相似度的项目。我知道它已经被问过很多次了,但我只是想知道我的问题是否可以通过我正在做的方式使用的方法来完成,或者我应该改变我解决问题的方法。粗略地说,系统应该分割一篇文章的所有句子,并在输入系统的其他文章中找到相似的句子。

我使用余弦相似度和 tf-idf 权重,这就是我的做法。

1-首先,我将所有文章分成句子,然后为每个句子生成三元组并对它们进行排序(应该吗?)。

2-我计算三元组的 tf-idf 权重并为所有句子创建向量。

3-我计算原始句子和要比较的句子的点积和大小。然后计算余弦相似度。

但是,系统并没有按照我的预期运行。说到这里,我心里有一些疑问。

据我读过有关 tf-idf 权重的内容,我想它们对于查找类似的“文档”更有用。由于我正在处理句子,因此我通过更改 tf 和 idf 定义公式的一些变量(而不是我尝试提出基于句子的定义的文档)来稍微修改了算法。

tf = 句子中三元出现的次数/句子中所有三元的数量

idf = 所有文章中的所有句子数/出现三元组的句子数

你认为用这样的定义来解决这个问题可以吗?

还有一个是我在计算余弦相似度时看到多次提到归一化。我猜这很重要,因为三元组向量可能大小不同(在我的情况下很少有)。如果一个三元向量的大小为 x,另一个向量的大小为 x+1,那么我将第一个向量视为 x+1 的大小,最后一个值为 0。这就是归一化的含义吗?如果不是,我该如何进行标准化?

除了这些,如果我选择了错误的算法,还有什么可以用于解决此类问题(最好使用 n-gram 方法)?

提前谢谢您。

最佳答案

我不知道你为什么要对每个句子的卦进行排序。计算余弦相似度时,您需要关心的是两个句子中是否出现相同的三元词以及出现的频率。从概念上讲,您在所有可能的三元组中定义了一个固定且通用的顺序。请记住,所有句子的顺序必须相同。如果可能的三元组数为 N,那么对于每个句子,您将获得一个维度为 N 的向量。如果某个三元组没有出现,则将向量中的相应值设置为零。您实际上并不需要存储零,但在定义点积时必须处理它们。

话虽如此,三元组并不是一个好的选择,因为匹配的机会很少。对于高 k,您将从 k 个连续单词的包中获得更好的结果,而不是 k-gram。请注意,袋子内的顺序并不重要,它是一套。您使用的是 k=3 k-gram,但这似乎偏高,尤其是对于句子。要么下降到二元组,要么使用不同长度的袋子,从 1 开始。最好两者都使用。

我相信您已经注意到,不使用精确三元组的句子在您的方法中具有 0 相似度。 K-词袋会有所缓解,但并不能彻底解决问题。因为现在你需要句子来分享实际的单词。两个句子可能相似,但不使用相同的单词。有几种方法可以解决这个问题。使用 LSI(潜在语义索引)或单词聚类并使用聚类标签来定义余弦相似度。

为了计算向量 x 和 y 之间的余弦相似度,您需要计算点积并除以 x 和 y 的范数。向量 x 的 2-范数可以计算为分量平方和的平方根。但是,您还应该在没有任何标准化的情况下尝试您的算法进行比较。通常它工作得很好,因为在计算术语频率 (tf) 时,您已经考虑了句子的相对大小。

希望这有帮助。

关于similarity - 使用余弦相似度测量的 n 元句子相似度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4037174/

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