Hash 用于索引相似文本的哈希函数

Hash 用于索引相似文本的哈希函数,hash,similarity,Hash,Similarity,我正在搜索一种哈希函数来索引相似的文本。例如,如果我们有两个很长的文本,分别称为“A”和“B”,其中A和B相差不大,那么应用于A和B的散列函数(称为H)应该返回相同的数字 所以H(A)=H(B),其中A和B是相似的文本 我尝试了“双重变音”(我使用意大利语文本),但我发现它非常依赖于字符串前缀。例如: A=“这是我要散列的非常长的文本” B=“这是最重要的” ==>双变音(A)=双变音(B) 这对我来说不太好,因为前缀相同的字符串可以比较为相似的,我不想要这个 有人能给我推荐其他方法吗?对于字符

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

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

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

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

==>双变音(A)=双变音(B)

这对我来说不太好,因为前缀相同的字符串可以比较为相似的,我不想要这个

有人能给我推荐其他方法吗?

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

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

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

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


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

请参见

变音算法可能是我的正确选择,但它在很大程度上取决于文本前缀。具有相同前缀的长文本具有相同的变音码。。。。