如何检测重复数据?

时间:2008-08-28 01:54:19

标签: algorithm language-agnostic duplicate-data

我有一个简单的联系人数据库,但我遇到了用户输入重复数据的问题。我已经实现了一个简单的数据比较,但不幸的是,输入的重复数据并不完全相同。例如,姓名拼写不正确,或者一个人会输入“Bill Smith”,另一个人会为同一个人输入“William Smith”。

那么是否存在某种算法可以给出一个条目与另一个条目的相似程度的百分比?

11 个答案:

答案 0 :(得分:7)

  

还有某种算法   这可以给出百分比   类似的一个条目是另一个?

作为Soundex和Edit距离的算法(如前一篇文章所述)可以解决您的一些问题。但是,如果您认真对待清理数据,这还不够。正如其他人所说,“比尔”听起来并不像“威廉”。

我找到的最佳解决方案是使用缩减算法和表来将名称缩减为其根名称。

在常规地址表中添加名称的Root版本,例如 人(名字,RootFirstName,Surname,Rootsurname ....)

现在,创建一个映射表。 FirstNameMappings(主键名,根名)

通过以下方式填充您的Mapping表: 插入IGNORE(从Person中选择Firstname,“UNDEFINED”)到FirstNameMappings

这会将您在person表中的所有名字与“UNDEFINED”的RootName一起添加

现在,遗憾的是,您必须浏览所有唯一的名字并将它们映射到RootName。例如“Bill”,“Billl”和“Will”都应该被翻译成“William” 这非常耗时,但如果数据质量对您来说非常重要,我认为这是最好的方法之一。

现在使用新创建的映射表来更新Person表中的“Rootfirstname”字段。重复姓氏和地址。完成此操作后,您应该能够检测重复项而不会遇到拼写错误。

答案 1 :(得分:5)

您可以将名称与Levenshtein distance进行比较。如果名称相同,则距离为0,否则由将一个字符串转换为另一个字符串所需的最小操作数给出。

答案 2 :(得分:4)

我认为这个问题很容易理解但是在我第一次阅读时发生的事情是:

  • 单独比较字段
  • 计算那些匹配的(对于可能松散的匹配定义,并且可能以不同方式权衡字段)
  • 目前用于人为干预的任何通过某些门槛的案件

使用现有数据库对阈值进行初步猜测,并在累积经验时更正。

至少在开始时,您可能更倾向于对误报有相当强烈的偏见。

答案 3 :(得分:3)

虽然我没有适合您的算法,但我的第一个动作是查看输入新联系人所涉及的过程。也许用户没有简单的方法来找到他们正在寻找的联系人。就像Stack Overflow的新问题表单一样,您可以建议新联系人屏幕上已存在的联系人。

答案 4 :(得分:3)

答案 5 :(得分:3)

如果您有一个包含字符串字段的大型数据库,则可以使用simhash算法快速找到大量重复项。

答案 6 :(得分:2)

这可能或可能不相关,但Soundex search可能会检测到轻微的拼写错误,例如,这会让您将Britney Spears,Britanny Spares和Britny Spears视为重复。

然而,昵称收缩很难被视为重复,我怀疑它是否明智。肯定会有多个名叫比尔史密斯和威廉史密斯的人,你必须与查尔斯 - >查克,罗伯特 - 鲍勃等人进行迭代。

另外,如果你正在考虑穆斯林使用者,问题会变得更加困难(例如,有太多的穆斯林被称为穆罕默德/穆罕默德)。

答案 7 :(得分:1)

FullContact.com有API可以为您解决此问题,请在此处查看其文档:http://www.fullcontact.com/developer/docs/?category=name

他们有名称标准化的API(Bill into William),Name Deducer(原始文本)和Name Similarity(比较两个名字)。

目前所有API都是免费的,这可能是一个很好的入门方式。

答案 8 :(得分:0)

我不确定它是否适用于名称与昵称问题,但这类区域中最常见的算法是edit distance / Levenshtein distance算法。它基本上是将一个项目转换为另一个项目所需的字符更改,添加和删除次数的计数。

对于名字,我不确定你是否会用纯粹的算法方法取得好成绩 - 你真正需要的是大量的数据。举例来说,谷歌拼写建议比普通桌面应用程序更好。这是因为谷歌可以处理数十亿的网络查询,并查看哪些查询相互引导,“你的意思是什么”链接实际上被点击等。

有一些公司专门从事名称匹配问题(主要用于国家安全和欺诈应用)。我记得的那个,Search Software America似乎已经被这些人http://www.informatica.com/products_services/identity_resolution/Pages/index.aspx买走了,但我怀疑这些解决方案中的任何一种对于联系人应用来说都是昂贵的。

答案 9 :(得分:0)

您可能还想查看概率匹配。

答案 10 :(得分:0)

对于那些在网上徘徊并最终到达这里的人,我建议您尝试使用一个名为Flookup的Google表格插件。 它特别适合名字(手指交叉),它还具有其他一些很棒的功能,我将在下面进行描述: 1.假设您有一个姓名列表,并且有2个人称为“约翰·史密斯”。您可以使用Flookup中的rank参数来指示算法返回第一,第二,第三或第n个最佳匹配。如果您有其他信息可用于标识所需的“ John Smith”,这将很有帮助。 2.假设您还有其他数据库/公寓号码列表。您可以通过键入以下内容来指定所需的“ John Smith”:John Smith & Apartment AJohn Smith & Apartment B作为查找参数,以帮助区分这两个名称。 我希望您发现Flookup和其他人一样有益。