4

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

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

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

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

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

这对我来说不是很好,因为具有相同前缀的字符串可以被比较为相似,我不想要这个。

谁能建议我任何其他方式?

4

2 回答 2

2

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

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

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

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

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

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

于 2010-07-14T15:31:54.193 回答
1

http://en.wikipedia.org/wiki/Locality_sensitive_hashing

于 2010-12-20T19:31:00.243 回答