针对大量联系人的重复数据删除算法

时间:2013-10-04 11:54:12

标签: algorithm duplicates fuzzy-logic record-linkage

我正在开发一个必须能够找到的应用程序。合并在sql server DB中存储的数十万个联系信息中的重复项。我必须比较表中的所有列,每列都有一个权重值。比较必须基于重量值。根据比较结果&等价程度我必须决定自动合并联系人或请求用户注意。我知道有许多用于重复数据删除的模糊逻辑算法。

http://www.melissadata.com/中阅读有关N-gram或基于Q-gram的算法。这个算法对大量数据是否可行?如果没有,任何人都可以用一些算法指导我,或者告诉我从哪里开始?

我想要实现的一个例子,

Gonzales = Gonzalez (two different spelling of different name)
Smith = Smyth (Phonetic sound the same)
123 Main st = 123 Main street (abbrevation)
Bob Smith = Robert Smith (synonym)

3 个答案:

答案 0 :(得分:6)

整个研究领域通常被称为记录联系(具有讽刺意味的是,它有大约十几个重复的名称)。有很多工具可以让您配置特定数据的匹配,浏览数据,并为您输出重复项。如果您回答有关潜在匹配正确性的一些问题,有些工具甚至会为您创建匹配。

Q / N-gram比较(和索引)是解决这个问题的一种可能方法,但是还有很多其他的。您会很快发现不同类型的比较器适用于不同类型的数据。我自己没有尝试过Q-gram索引,但该领域的研究人员对我描述它相对较慢。

至于与语音键功能(如Soundex或Metaphone或其他)的比较,这仅适用于您有小文本字段,例如给定名称,姓氏,中间名等的单独字段。即使这样,这些功能往往是相当粗糙。并提防Soundex。它不仅非常粗糙,将非常不同的名称转换为相同的键,而且还错过了许多应该被视为相同的相似名称。 Metaphone要好得多。

记录链接的维基百科页面曾经有一个工具列表,但编辑删除了它。我写了一个名为Duke的开源工具来解决这类问题。它有一个遗传算法可以帮助您创建配置,或者您可以手动编写一个。其他工具也存在。

我建议你使用已经存在的工具之一,而不是试图从头开始解决这个问题。

答案 1 :(得分:1)

我认为重复名称的最佳方法是phonetic encoder。 语音编码器将能够重复使用相同名称的替代拼写,这里有一些常见名称的例子:

Group: Kathryn names: [Kathryn, Katharine, Katherin, Katherynn, Kathrynn, Katherynne, Kathrynne, Catherine, Cathryn, Catharine, Catherin, Catherynn, Cathrynn, Catherynne, Cathrynne]
Group: Assaf names: [Assaf, Asaf]
Group: Megan names: [Megan, Meagan, Meghan, Meaghan]
Group: Allison names: [Allison, Alyson, Allyson, Alison, Allisyn]
==============================================================
Phonetic Encoder: Caverphone2
---- Names Group: Kathryn ----
Encoded names: {KTRN111111=16}
---- Names Group: Assaf ----
Encoded names: {ASF1111111=3}
---- Names Group: Megan ----
Encoded names: {MKN1111111=5}
---- Names Group: Allison ----
Encoded names: {ALSN111111=6}
==============================================================
Phonetic Encoder: DoubleMetaphone
---- Names Group: Kathryn ----
Encoded names: {K0RN=16}
---- Names Group: Assaf ----
Encoded names: {ASF=3}
---- Names Group: Megan ----
Encoded names: {MKN=5}
---- Names Group: Allison ----
Encoded names: {ALSN=6}
==============================================================
Phonetic Encoder: Nysiis
---- Names Group: Kathryn ----
Encoded names: {CATRYN=7, CATARA=6, CATARY=5}
---- Names Group: Assaf ----
Encoded names: {ASAF=3}
---- Names Group: Megan ----
Encoded names: {MAGAN=5}
---- Names Group: Allison ----
Encoded names: {ALASAN=3, ALYSAN=3, ALASYN=2}
==============================================================
Phonetic Encoder: Soundex
---- Names Group: Kathryn ----
Encoded names: {K365=8, C365=9}
---- Names Group: Assaf ----
Encoded names: {A210=3}
---- Names Group: Megan ----
Encoded names: {M250=5}
---- Names Group: Allison ----
Encoded names: {A425=6}
==============================================================
Phonetic Encoder: RefinedSoundex
---- Names Group: Kathryn ----
Encoded names: {C30609080=5, K3060908=5, K30609080=4, C3060908=5}
---- Names Group: Assaf ----
Encoded names: {A0302=3}
---- Names Group: Megan ----
Encoded names: {M80408=5}
---- Names Group: Allison ----
Encoded names: {A070308=6}
==============================================================

在示例中,您可以看到CaverphoneDoubleMetaphone所有名称都编码为相同的字符串。您应该看到对您的数据有意义,使用的编码器取决于名称的语言和词源(即英文名称,德语名称......)

答案 2 :(得分:1)

使用simhash算法找到部分解决方案。在http://simhash.codeplex.com/

找到了一个很好的例子