【问题标题】:n-gram sentence similarity with cosine similarity measurement带有余弦相似度测量的 n-gram 句子相似度
【发布时间】: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


    【解决方案1】:

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

    话虽如此,三元组并不是一个好的选择,因为匹配的机会要少得多。对于高 k,你会从 k 个连续单词的袋子中获得更好的结果,而不是 k-gram。请注意,袋子内的顺序无关紧要,它是一组。您正在使用 k=3 k-gram,但这似乎偏高,尤其是对于句子。从 1 开始下拉到二元或使用不同长度的袋子。最好同时使用。

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

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

    希望这会有所帮助。

    【讨论】:

    • @Ahmet 如果有什么需要我澄清的,请告诉我。
    • 感谢您的回答。首先,我对向量进行排序的原因是我得到了更好的结果。我尝试了你的建议,但没有运气。但是我刚刚意识到,相似的词通常是长度相似的词。这种余弦相似度在我看来有点随机,因为我们没有检查 n-gram 之间的连接,而是检查 n-gram 的频率而不考虑它们是什么。也许仍然,我错过了一些东西。
    • 当然,如果你不注意它们是否匹配,余弦相似度看起来是随机的,因为在这种情况下你正在计算的内容与余弦相似度无关。你做错了,在这种情况下它将根据定义是随机的。再试一次并严格按照说明进行操作,它会起作用。
    • 您好,感谢您的建议。现在它正在工作。这是我应该注意的一个重要细节。实际上我实现算法的方式是错误的,这就是我正在寻找的答案。我在某处读到的算法(我真的不记得确切的位置)没有提到匹配部分。所以,由于排序步骤,我有点等待神奇的东西。然后我考虑使用骰子系数,因为它更有意义。现在,余弦相似度很好。再次感谢您。
    • @AhmetKeskin 你能否让我清楚 tf 在这种情况下真正意味着什么? “句子中三元组的出现次数”不是几乎一直都是1吗?请你让我更清楚吗?
    猜你喜欢
    • 1970-01-01
    • 2020-08-12
    • 2011-01-01
    • 2014-02-25
    • 2011-03-21
    • 2013-05-24
    • 1970-01-01
    • 2011-01-23
    相关资源
    最近更新 更多