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

Posted

技术标签:

【中文标题】大量联系人的重复数据删除算法【英文标题】:Data Deduplication algorithm for large number of contacts 【发布时间】:2013-10-11 09:53:53 【问题描述】:

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

在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)

【问题讨论】:

我需要进行相似度比较。比如说如果 2 个人有相同的电子邮件地址并且有像“Pravin”和“Praveen”这样的名字,我必须能够找到这些记录。 史密斯先生和史密斯先生在我的场景中也可能是重复的。 数据是否以任何方式结构化:名字:Bob,Surename:Smith,地址:123 Main Street,电子邮件:bob.smith@***.com?还是只有一行:“Bob Smith, 123 Main Street, bob.smith@***.com” 是的,按照规定,数据是一个sql表,形式为(名字、姓氏、电子邮件、电话等) 【参考方案1】:

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

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

至于与语音键功能(如 Soundex 或 Metaphone 或其他)的比较,这仅适用于具有小文本字段的情况,如名字、姓氏、中间名等的单独字段。即使这样,这些功能也往往是比较粗糙。并提防 Soundex。它不仅非常粗糙,将非常不同的名称变成了相同的键,而且还遗漏了许多应该被相同对待的相似名称。变音器要好得多。

用于记录链接的***页面曾经有一个工具列表,但编辑删除了它。我写了一个名为Duke 的开源工具来解决这种事情。它有一个遗传算法可以帮助您创建配置,或者您可以手动编写一个。还有其他工具。

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

【讨论】:

【参考方案2】:

我相信对名称进行重复数据删除的最佳选择是使用phonetic encoder。 语音编码器将能够对同名的替代拼写进行去重,以下是一些常用名称的示例:

组:凯瑟琳名称:[凯瑟琳,凯瑟琳,凯瑟琳,凯瑟琳,凯瑟琳,凯瑟琳,凯瑟琳,凯瑟琳,凯瑟琳,凯瑟琳,凯瑟琳,凯瑟琳,凯瑟琳,凯瑟琳,凯瑟琳] 组:Assaf 名称:[Assaf,Asaf] 组:梅根 姓名:[梅根,梅根,梅根,梅根] 组:艾莉森名称:[艾莉森,艾莉森,艾莉森,艾莉森,艾莉森] ==================================================== ============= 语音编码器:Caverphone2 ---- 姓名组:凯瑟琳 ---- 编码名称:KTRN111111=16 ---- 名称组:Assaf ---- 编码名称:ASF1111111=3 ---- 姓名组:梅根 ---- 编码名称:MKN1111111=5 ---- 姓名组:艾莉森 ---- 编码名称:ALSN111111=6 ==================================================== ============= 语音编码器:DoubleMetaphone ---- 姓名组:凯瑟琳 ---- 编码名称:K0RN=16 ---- 名称组:Assaf ---- 编码名称:ASF=3 ---- 姓名组:梅根 ---- 编码名称:MKN=5 ---- 姓名组:艾莉森 ---- 编码名称:ALSN=6 ==================================================== ============= 语音编码器:Nysiis ---- 姓名组:凯瑟琳 ---- 编码名称:CATRYN=7, CATARA=6, CATARY=5 ---- 名称组:Assaf ---- 编码名称:ASAF=3 ---- 姓名组:梅根 ---- 编码名称:MAGAN=5 ---- 姓名组:艾莉森 ---- 编码名称:ALASAN=3, ALYSAN=3, ALASYN=2 ==================================================== ============= 语音编码器:Soundex ---- 姓名组:凯瑟琳 ---- 编码名称:K365=8, C365=9 ---- 名称组:Assaf ---- 编码名称:A210=3 ---- 姓名组:梅根 ---- 编码名称:M250=5 ---- 姓名组:艾莉森 ---- 编码名称:A425=6 ==================================================== ============= 语音编码器:RefinedSoundex ---- 姓名组:凯瑟琳 ---- 编码名称:C30609080=5, K3060908=5, K30609080=4, C3060908=5 ---- 名称组:Assaf ---- 编码名称:A0302=3 ---- 姓名组:梅根 ---- 编码名称:M80408=5 ---- 姓名组:艾莉森 ---- 编码名称:A070308=6 ==================================================== =============

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

【讨论】:

'Mr John' 和 'John' 会被视为同一个字符串吗?我认为在使用语音算法时不会。而且我不会单独比较名称。我必须比较表中的所有列,每列都有一个权重值。根据比较,我必须决定自动合并联系人或请求用户注意。 在比较名称时,您并不真正关心标题。只需删除您找到的任何标题。不需要算法来做到这一点。从名称的开头删除“先生”、“夫人”、“女士”、“Eng”、“Dr”、“Prf”或您知道的任何其他常见头衔 如果您交换名称,语音相似性匹配会失败。将“Mark Smith”写成“Smith, Mark”是很常见的。您必须使用基于令牌的匹配。 编辑了我的问题。基于令牌的匹配是否适用于我指定的所有情况?【参考方案3】:

使用 simhash 算法找到了部分解决方案。在这里找到了一个很好的例子http://simhash.codeplex.com/

【讨论】:

以上是关于大量联系人的重复数据删除算法的主要内容,如果未能解决你的问题,请参考以下文章

向数据库里插入大量数据,怎么实现不插入重复的记录

如何删除列表视图中重复的联系人?

使用实体框架删除大量项目[重复]

何时使用重复数据删除技术?

删除重复的数据(完全一致的重复)

是否应该在运行 EM 记录链接算法之前删除重复条目?