我正在开发一个必须能够找到的应用程序。合并在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)
答案 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} ==============================================================
在示例中,您可以看到Caverphone和DoubleMetaphone所有名称都编码为相同的字符串。您应该看到对您的数据有意义,使用的编码器取决于名称的语言和词源(即英文名称,德语名称......)
答案 2 :(得分:1)
使用simhash算法找到部分解决方案。在http://simhash.codeplex.com/
找到了一个很好的例子