散列函数来索引类似的文本

时间:2010-07-14 15:17:40

标签: hash similarity

我正在搜索一种哈希函数来索引类似的文本。因此,例如,如果我们有两个非常长的文本称为“A”和“B”,其中A和B的差别不大,则应用于A和B的哈希函数(称为H)应该返回相同的数字。

所以H(A)= H(B)其中A和B是相似的文本。

我尝试了“DoubleMetaphone”(我使用意大利语文本),但我看到它依赖于字符串前缀非常强大。例如:

A =“这是我要散列的非常长的文本” B =“这是非常”

==> doubleMetaPhone(A)= doubleMetaPhone(B)

这对我来说不太好,因为具有相同前缀的字符串可以比较相似,我不希望这样。

有人可以建议我吗?

2 个答案:

答案 0 :(得分:2)

对于字符串之间的许多距离函数,你的问题是(接近)不可解决。

大多数距离函数(例如edit distance)允许您通过一系列1距离变换将字符串转换为另一个字符串:

"AAAA" -> "AAAB" -> "AAABC"

根据您的要求,第一个和第二个字符串应具有相同的哈希值。但第二个和第三个必须如此,依此类推。因此,所有字符串必须具有相同的散列,如果我们允许距离= 1的对具有相同的散列值。

即使我们对距离施加更高的阈值(可能与字符串长度有关),我们最终也会得到一个混乱的结果。

更好的(IMO)方法是在字符串集上找到equivalence relation,这样每个等价类中的每个字符串都具有相同的哈希值。可能性是通过它们到预定义字符串的距离来定义类(例如,编辑距“AAAAA”的距离),并且距离本身将是散列值。可能这种方法在你的情况下不是最好的,但也许有一些关于这个问题的额外信息,我们可以提出更好的等价关系。

答案 1 :(得分:1)