我正在尝试创建一种机制,通过该机制,我可以根据数据集与数据库中现有记录的相似性对数据集中的每条记录进行评分。我的目标是在我的新列表中标识重复项或潜在/可能重复项,方法是给它们一个分数,表明它们与我表中已存在的记录的相似性。
我将用于识别可能匹配的字段是CompanyName,AddressLine1,Postcode,TelephoneNumber。
我做了一些研究,发现了许多方法都能很好地处理少量记录(包括各种编辑距离方法,三元组比较,双重Metaphone评分),但我们正在努力实现这些,或者类似的方法,对较大批量的记录。我发现的算法都是标量函数,这可能是我问题的根源。不幸的是,我在这方面的专业知识有限,所以我不知道从哪里开始。
对数字有所了解:我的表中有大约120,000条记录,大约需要25,000条记录。
我很感激有关进一步研究和示例方法的指示,我将如何处理我的任务,并提出一个不需要数小时才能执行的解决方案!
如果此处需要更多详细信息,请与我们联系。
答案 0 :(得分:1)
我已多次这样做,所以我可以给你一些指示。
关键是使用例如比较每对字段的完整比较。 Levenshtein距离在计算上是昂贵的。因此,您需要尽可能避免这样做。
例如,有120,000条记录与25,000条记录相匹配,这就是30亿条记录的比较。如果你能在1ms内完成每次比较,那还需要一个月的时间。
所以要做的第一件事就是看你的实际需求。由于你还没有给出,我会补上它们。
<强>要求强>
报告所有对,其中至少有两个给定字段紧密匹配。
关闭匹配定义为:
电话:相似性是共同位置的位数。少于区号+前4位是失败。
邮政编码:相似性是共同的前导数字。少于3是失败。
地址1:相似性是共同的词语
公司名称:相似度为Levenstein距离。
一般方法
所以诀窍是避免尽可能多的工作。对于每个匹配测试,您希望将其(如果可能的话)分解为廉价的&#34;广泛阶段&#34;以及完整的狭窄阶段&#34;测试。广泛的阶段尽可能地丢弃尽可能多的可能性而不做太多的工作,只有那些通过测试的人才能进入狭窄的阶段。
最贵的支票是公司名称,所以只有在至少有一个其他字段匹配时才这样做。
邮政编码基于前导数字,因此我们可以使用索引。
可以预处理电话号码,删除扩展名(如果有),并提取号码+区号。完成后,可以使用索引。
为每个测试创建候选表
所以创建一个&#34;候选电话匹配表&#34;区域+4位匹配的每对PK。这不需要是完全相似性得分,如果相似性测试成功,它应该保证成功,但是会丢弃很大比例的失败对。
对Postcode执行相同的操作
对于地址(&#34;共同词和#34;),您需要预处理以创建&#34;地址词&#34;表,然后您可以查询以获取候选人。
一旦你有三个候选表,你可以忽略任何至少一个没有出现的输入记录(因为你需要两个匹配)。
最终的候选表可以填充前三个对的并集,而昂贵的Levenstein距离只能在这些对上计算。
全部放在一起
使用其他表中显示的所有行填充最终候选表,并附上一个标志以说明满足哪些测试。您现在可以对每个匹配的维度执行完整的窄阶段测试。
通过这种方式,您应该可以将1个月的时间范围缩短到几个小时甚至几分钟。