【问题标题】:hash function to index similar text用于索引相似文本的哈希函数
【发布时间】:2010-07-14 15:17:40
【问题描述】:

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

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

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

A = "这是我要散列的很长的文本" B = "这是非常"

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

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

谁能给我建议?

【问题讨论】:

    标签: hash similarity


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • Metaphone 算法对我来说可能是正确的选择,但它在很大程度上取决于文本前缀。具有相同前缀的长文本具有相同的变音代码....
    【解决方案2】:
    猜你喜欢
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    相关资源
    最近更新 更多