algorithm - 在不到指数时间内进行模糊匹配重复数据删除?

标签 algorithm duplicates time-complexity fuzzy record-linkage

我有一个大型数据库(可能有数百万条记录),其中包含相对较短的文本字符串(按照街道地址、姓名等的顺序)。

我正在寻找一种删除不精确重复项的策略,模糊匹配似乎是首选方法。我的问题:许多文章和 SO 问题都涉及将单个字符串与数据库中的所有记录进行匹配。我希望一次对整个数据库进行重复数据删除。

前者将是一个线性时间问题(将一个值与一百万个其他值进行比较,每次都计算一些相似性度量)。后者是一个指数时间问题(将每条记录的值与其他所有记录的值进行比较;对于一百万条记录,这大约是 5 x 10^11 次计算,而前一个选项是 1,000,000 次计算)。

我想知道除了我提到的“蛮力”方法之外是否还有其他方法。我正在考虑可能生成一个字符串来比较每个记录的值,然后将具有大致相同的相似性度量的字符串分组,然后在这些组中运行蛮力方法。我不会达到线性时间,但它可能会有所帮助。此外,如果我考虑得当,这可能会错过字符串 A 和 B 之间潜在的模糊匹配,因为它们与字符串 C(生成的检查字符串)的相似性非常不同,尽管彼此非常相似。

有什么想法吗?

附言我意识到我可能对时间复杂度使用了错误的术语——这是我基本掌握的概念,但还不够好,所以我可以当场将算法归入适当的类别。如果我使用的术语有误,欢迎纠正,但希望至少我的观点得到了理解。

编辑

一些评论者问,给定记录之间的模糊匹配,我的策略是选择要删除的记录(即给定“foo”、“boo”和“coo”,它们将被标记为重复和删除)。我应该注意,我不是在这里寻找自动删除。这个想法是在 60+ 百万记录数据库中标记潜在的重复项,以供人工审查和评估。如果有一些误报也没关系,只要它是一个大致可预测/一致的数量。我只需要了解重复项的普遍程度。但是,如果模糊匹配传递需要一个月的时间才能运行,那么这根本就不是一个选择。

最佳答案

看看http://en.wikipedia.org/wiki/Locality-sensitive_hashing .一种非常简单的方法是将每个地址(或其他地址)划分为一组重叠的 n-gram。这个 STACKOVERFLOW 变成集合 {STACKO, TACKO, ACKOV, CKOVE..., RFLOW}。然后使用大型哈希表或排序合并来查找冲突的 n-gram 并使用模糊匹配器检查冲突。因此 STACKOVERFLOW 和 SXACKOVRVLOX 将发生冲突,因为两者都与冲突的 n-gram ACKOV 相关联。

复杂程度的下一个层次是选择一个随机哈希函数 - 例如具有任意键的 HMAC,以及您找到的 n-gram,仅保留具有最小散列值的那个。然后你必须跟踪更少的 n-gram,但只有在两种情况下的最小散列值都是 ACKOV 时才会看到匹配。 n-gram 的长度和错误命中的概率之间显然存在权衡。事实上,人们所做的似乎是通过在同一记录中连接多个哈希函数的结果来使 n 非常小并获得更高的精度,因此您需要同时在多个不同的哈希函数中进行匹配 -我认为这样可以更好地计算出概率。尝试在谷歌上搜索“重复检测 minhash”

关于algorithm - 在不到指数时间内进行模糊匹配重复数据删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7196053/

相关文章:

java - 给定一个项目列表(不同类型),我如何将它们分开,以便每个组只包含相同类型的项目

c++ - 将一个值限制在一个范围内(某种程度上)

algorithm - 我怎样才能使这个算法更有效率?

java - 优化 Java 中的递归函数

algorithm - 在两个排序数组的合并数组中查找中位数

c++ - std::find 多个元素和逻辑运算符

javascript - 用于过滤无模式集合的最快数据结构

javascript - 删除数组中的重复元素

python - 从数组中提取重复值和位置的列表

python - 从列表中删除重复元素