我有一个简单的联系人数据库,但我遇到了用户输入重复数据的问题。我已经实现了一个简单的数据比较,但不幸的是输入的重复数据并不完全相同。例如,姓名拼写错误,或者一个人会输入“Bill Smith”,而另一个人会为同一个人输入“William Smith”。
那么是否有某种算法可以给出一个条目与另一个条目的相似程度的百分比?
我有一个简单的联系人数据库,但我遇到了用户输入重复数据的问题。我已经实现了一个简单的数据比较,但不幸的是输入的重复数据并不完全相同。例如,姓名拼写错误,或者一个人会输入“Bill Smith”,而另一个人会为同一个人输入“William Smith”。
那么是否有某种算法可以给出一个条目与另一个条目的相似程度的百分比?
那么是否有某种算法可以给出一个条目与另一个条目的相似程度的百分比?
Soundex 和编辑距离等算法(如上一篇文章中所建议的)可以解决您的一些问题。但是,如果您认真对待清理数据,这还不够。正如其他人所说,“比尔”听起来不像“威廉”。
我发现的最佳解决方案是使用缩减算法和表将名称缩减为它的根名称。
在您的常规地址表中,添加名称的根版本,例如 Person (Firstname, RootFirstName, Surname, Rootsurname....)
现在,创建一个映射表。FirstNameMappings(主键名、根名)
通过以下方式填充您的映射表:将 IGNORE(从 Person 中选择 Firstname,“UNDEFINED”)插入 FirstNameMappings
这会将您在个人表中的所有名字与“未定义”的 RootName 一起添加
现在,可悲的是,您将不得不检查所有唯一的名字并将它们映射到一个 RootName。例如“Bill”、“Bill”和“Will”都应该翻译成“William”。这非常耗时,但如果数据质量对你来说真的很重要,我认为这是最好的方法之一。
现在使用新创建的映射表来更新 Person 表中的“Rootfirstname”字段。重复姓氏和地址。完成此操作后,您应该能够检测到重复项而不会出现拼写错误。
您可以将名称与Levenshtein distance进行比较。如果名称相同,则距离为 0,否则由将一个字符串转换为另一个字符串所需的最小操作数给出。
我想这个问题很好理解,但我在第一次阅读时想到的是:
使用您现有的数据库对阈值进行良好的初步猜测,并在您积累经验时进行纠正。
你可能更喜欢对误报有相当强烈的偏见,至少一开始是这样。
如果您有一个带有字符串字段的大型数据库,您可以使用simhash算法非常快速地找到大量重复项。
虽然我没有适合您的算法,但我的第一个动作是查看输入新联系人所涉及的过程。也许用户没有一种简单的方法来找到他们正在寻找的联系人。就像 Stack Overflow 的新问题表一样,您可以建议新联系人屏幕上已经存在的联系人。
如果您有权访问 SSIS,请查看模糊分组和模糊查找转换。
http://www.sqlteam.com/article/using-fuzzy-lookup-transformations-in-sql-server-integration-services
这可能相关也可能不相关,但通过Soundex 搜索可能会检测到轻微的拼写错误,例如,这将允许您将 Britney Spears、Britanny Spares 和 Britny Spears 视为重复项。
然而,昵称缩写很难被视为重复,我怀疑这是否明智。肯定会有多个名为 Bill Smith 和 William Smith 的人,您必须使用 Charles->Chuck、Robert->Bob 等对其进行迭代。
此外,如果您正在考虑穆斯林用户,那么问题会变得更加困难(例如,有太多的穆斯林被称为 Mohammed/Mohammad)。
我不确定它是否适用于名称与昵称问题,但这类领域中最常见的算法是编辑距离/Levenshtein 距离算法。它基本上是对将一个项目变成另一个项目所需的字符更改、添加和删除次数的计数。
对于名称,我不确定您是否会通过纯算法方法获得好的结果——您真正需要的是大量数据。举个例子,谷歌拼写建议比普通桌面应用程序好多少。这是因为谷歌可以处理数十亿个网络查询,并查看哪些查询会导致彼此,“你的意思是什么”链接实际被点击等等。
有几家公司专门研究名称匹配问题(主要用于国家安全和欺诈应用)。我记得的那个,Search Software America 似乎已经被这些家伙买断了http://www.informatica.com/products_services/identity_resolution/Pages/index.aspx,但我怀疑这些解决方案中的任何一个都离我很远对于联系人应用程序来说太昂贵了。
FullContact.com 有可以为您解决这个问题的 API,请在此处查看他们的文档:http ://www.fullcontact.com/developer/docs/?category=name 。
他们有用于名称规范化(Bill into William)、名称推断器(用于原始文本)和名称相似性(比较两个名称)的 API。
目前所有 API 都是免费的,这可能是一个很好的入门方式。
您可能还想研究概率匹配。
对于那些在网上闲逛并最终来到这里的人,我是否建议您尝试使用我创建的名为 Flookup 的 Google 表格插件。它的名字特别好,它还有一些其他很棒的功能,我将在下面描述:
rank
Flookup 中的参数来指示算法返回第一个、第二个、第三个或第 n 个最佳匹配。如果您有其他信息可用于识别您想要的“John Smith”,这将很有帮助。John Smith & Apartment A
或John Smith & Apartment B
作为查找参数来指定您想要的“John Smith”,以帮助区分这两个名称。我希望您发现 Flookup 和其他人一样有益。