我一直在做一个关于句子相似度的项目。我知道它已经在 SO 中被问过很多次,但我只是想知道我的问题是否可以通过我使用的方法来解决,或者我应该改变解决问题的方法。粗略地说,系统应该拆分一篇文章的所有句子,并在提供给系统的其他文章中找到相似的句子。
我正在使用带有 tf-idf 权重的余弦相似度,这就是我的做法。
1-首先,我将所有文章分成句子,然后为每个句子生成三元组并对它们进行排序(我应该吗?)。
2-我计算三元组的 tf-idf 权重并为所有句子创建向量。
3-我计算原始句子和要比较的句子的点积和大小。然后计算余弦相似度。
但是,该系统没有按我预期的那样工作。说到这里,我心里有几个问题。
据我了解 tf-idf 权重,我想它们对于查找类似的“文档”更有用。由于我正在研究句子,因此我通过更改 tf 和 idf 定义公式的一些变量来稍微修改了算法(而不是我试图提出基于句子的定义的文档)。
tf = 句子中 trigram 出现的次数 / 句子中所有 trigram 的数量
idf = 所有文章中所有句子的数量/出现 trigram 的句子数量
你认为对这个问题使用这样的定义可以吗?
另一个是我在计算余弦相似度时看到多次提到归一化。我猜这很重要,因为三元向量的大小可能不同(在我的情况下它们很少)。如果一个三元向量是 x 的大小,另一个是 x+1,那么我将第一个向量视为 x+1 的大小,最后一个值为 0。这就是归一化的意思吗?如果没有,我该如何进行标准化?
除了这些,如果我选择了错误的算法,还有什么可以用于此类问题(最好使用 n-gram 方法)?
先感谢您。