n-gram句子相似度与余弦相似度测量

时间:2010-10-27 19:59:58

标签: similarity cosine n-gram

我一直致力于一个关于句子相似性的项目。我知道它已被多次询问,但我只是想知道我的问题是否可以通过我使用的方法来实现,或者我应该改变我对问题的处理方法。粗略地说,系统应该拆分文章的所有句子,并在其他文章中找到与系统相似的句子。

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

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

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

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

但是,系统无法正常工作。在这里,我脑子里有一些问题。

据我所知,关于tf-idf权重,我猜它们对于找到类似的“文档”更有用。由于我正在处理句子,我通过改变tf和idf定义公式的一些变量来修改算法(而不是文档,我试图提出基于句子的定义)。

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

idf =所有文章中所有句子的数量/出现trigram的句子数

你认为对这个问题使用这样的定义是否可以?

另一个是我在计算余弦相似度时多次提到归一化。我猜这很重要,因为三卦矢量可能不是相同的大小(在我的情况下它们很少)。如果三元组向量的大小为x而另一个是x + 1,那么我将第一个向量视为x + 1的大小,最后一个值为0.这是归一化的意思吗?如果没有,我该如何进行规范化?

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

提前谢谢。

1 个答案:

答案 0 :(得分:5)

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

话虽如此,三卦并不是一个好选择,因为比赛的机会很多。对于高k,你将有更好的结果来自k个连续单词,而不是k-gram。请注意,订单在包内无关紧要,一套。你使用k = 3 k-gram,但这似乎偏高,特别是句子。从1开始,下降到二克或使用不同长度的袋子。最好同时使用两者。

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

为了计算向量x和y之间的余弦相似度,您计算点积并除以x和y的范数。 矢量x的2范数可以计算为平方分量之和的平方根。但是你也应该尝试你的算法而不需要任何标准化来进行比较。通常它工作正常,因为在计算术语频率(tf)时,你已经在处理句子的相对大小。

希望这有帮助。