【发布时间】:2011-08-25 19:25:38
【问题描述】:
我有一个大型数据库(可能有数百万条记录),其中包含相对较短的文本字符串(按街道地址、名称等顺序)。
我正在寻找一种去除不精确重复的策略,模糊匹配似乎是首选方法。我的问题:许多文章和 SO 问题都涉及将单个字符串与数据库中的所有记录进行匹配。我希望立即对整个数据库进行重复数据删除。
前者将是一个线性时间问题(将一个值与一百万个其他值进行比较,每次都计算一些相似性度量)。后者是指数时间问题(将每条记录的值与其他每条记录的值进行比较;对于一百万条记录,与前一个选项的 1,000,000 次计算相比,这大约是 5 x 10^11 计算)。
我想知道除了我提到的“蛮力”方法之外,是否还有其他方法。我正在考虑可能生成一个字符串来比较每个记录的值,然后将具有大致相等相似性度量的字符串分组,然后通过这些组运行蛮力方法。我不会达到线性时间,但它可能会有所帮助。此外,如果我正确地考虑这一点,这可能会错过字符串 A 和 B 之间潜在的模糊匹配,因为它们与字符串 C(生成的检查字符串)的相似性非常不同,尽管彼此非常相似。
有什么想法吗?
附注我意识到我可能使用了错误的时间复杂度术语——这是一个我基本掌握的概念,但还不够好,所以我可以当场将算法归入正确的类别。如果我用错了术语,我欢迎更正,但希望我至少能理解我的意思。
编辑
一些评论者问,鉴于记录之间的模糊匹配,我的策略是选择删除哪些记录(即给定“foo”、“boo”和“coo”,它们将被标记为重复并删除)。我应该注意,我不是在这里寻找自动删除。这个想法是在一个 60 多万条记录数据库中标记潜在的重复项,以供人工审查和评估。如果有一些误报是可以的,只要它是一个大致可预测/一致的数量。我只需要了解重复项的普遍性。但是,如果模糊匹配传递需要一个月的时间来运行,那么这甚至不是一个选项。
【问题讨论】:
-
第二种方法会比第一种方法提供更高的准确性...但是您不需要那么多计算。假设您在开始时为每条记录提供了一个唯一标识符,并在匹配某些内容时更改了这些标识符,那么记录的数量会随着时间的推移而减少。
-
但是每条记录可以有多个重复项,我关心的是单次通过的运行时间。因此,我认为更改行 ID 不会节省任何时间。显然,防止未来重复更容易,因为它只是将新插入的记录与所有其他记录进行比较 - O(1) 时间。但第一遍是 O(n^2) 时间,在 6300 万条记录和严重受限的硬件条件下,我们正在延长数月的计算时间来完成单遍。所以我需要一个更快的选择...
标签: algorithm duplicates time-complexity fuzzy record-linkage