我用Python写了一个非常简单的局部敏感哈希算法的原型。但是,有一些注意事项,你可能也想优化一些部分。我们在看到它们时会提及。假设所有的字符串都存储在
strings
中。
import random
from collections import Counter
MAX_LENGTH = 500
SAMPLING_LENGTH = 10
def bit_sampling(string, indices):
return ''.join([string[i] if i<len(string) else ' ' for i in indices])
indices = random.sample(range(MAX_LENGTH),SAMPLING_LENGTH)
hashes = [bit_sampling(string, indices) for string in strings]
counter = Counter(hashes)
most_common, count = counter.most_common()[0]
while count > 1:
dup_indices = [i for i, x in enumerate(hashes) if x == most_common]
counter.pop(most_common)
most_common, count = counter.most_common()[0]
首先,这是比特采样的一种轻微变体,最适用于汉明距离。理想情况下,如果所有字符串长度相同,则可以为汉明距离提供理论概率界限。当两个字符串的汉明距离很小时,它们具有不同哈希的可能性非常小。这可以由参数SAMPLING_LENGTH指定。较大的SAMPLING_LENGTH将更有可能将类似的字符串哈希到不同的哈希中,但也会降低哈希不太相似的字符串到相同哈希的概率。对于汉明距离,您可以轻松计算这种权衡。
多次运行此代码片段可以增加您对没有相似字符串的信心,因为每次都会在不同的位置进行采样。
为了适应您比较不同长度字符串的目的,一种可能的方法是在较短的字符串左侧填充空格并复制它们。
尽管此代码片段中的所有操作都是线性的(O(n)),但仍可能消耗大量内存和运行时间,并且可能可以减少一个常数因子。
您还可以考虑使用更复杂的局部敏感哈希算法,例如在此处进行调查:
https://arxiv.org/pdf/1408.2927.pdf
ratio
或partial_ratio
从https://pypi.python.org/pypi/fuzzywuzzy对您有用吗?还是您只需要编辑距离? - Tarun LalwaniO(n^2*m)
,假设比率以线性m
时间运行。 - Evan Weissburg