我有一个庞大的数据库(可能有数百万条记录),其中包含相对较短的文本字符串(例如街道地址、姓名等)。
我正在寻找一种策略来删除不精确的重复项,模糊匹配似乎是最佳选择的方法。问题在于:许多文章和Stack Overflow问题处理将单个字符串与数据库中的所有记录进行匹配。我希望一次性对整个数据库进行去重。
前者将是一个线性时间问题(每次将一个值与其他一百万个值进行比较,计算一些相似度量)。后者是指数时间问题(将每个记录的值与其他记录的每个值进行比较;对于100万条记录,这大约需要5 x 10^11次计算,而前者选项只需要1,000,000次计算)。
我想知道是否有另一种方法可以代替我提到的“蛮力”方法。我考虑可能会生成一个字符串来将每个记录的值进行比较,然后将具有大致相等相似度度量的字符串分组,随后通过这些组运行“蛮力”方法。虽然无法实现线性时间,但这可能有所帮助。此外,如果我思考正确,这可能会因其与检查字符串C的相似度非常不同而错过字符串A和B之间的潜在模糊匹配,尽管它们非常相似。
有什么想法吗?
附言:我意识到我的时间复杂度可能有误 - 这是我基本掌握的概念,但不足以让我立即将算法放在正确的类别中。如果我使用了错误的术语,欢迎更正,但希望我至少能传递我的观点。
编辑
一些评论者问道,在记录之间存在模糊匹配的情况下,我选择哪些记录进行删除的策略是什么(例如,“foo”,“boo”和“coo”,哪一个会被标记为重复并删除)。我应该指出的是,我不是在寻求自动删除。这个想法是为了标记潜在的重复项,并交由人类审查和评估。如果有一些误判也没关系,只要它是大致可预测/一致的数量即可。我只需要了解重复项有多普遍。但是,如果模糊匹配需要一个月的时间才能运行,那么这根本就不是首选。