【发布时间】:2011-05-01 12:46:35
【问题描述】:
我一直在做一个关于句子相似度的项目。我知道它已经在 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 方法)?
提前谢谢你。
【问题讨论】:
标签: similarity trigonometry n-gram