我有一个简单的联系人数据库,但我遇到用户输入重复数据的问题.我已经实现了一个简单的数据比较,但不幸的是,输入的重复数据并不完全相同.例如,名字拼写不正确,或者一个人将放入"Bill Smith",另一个人将为同一个人输入"William Smith".
那么是否存在某种算法可以给出一个条目与另一个条目的相似程度的百分比?
那么是否存在某种算法可以给出一个条目与另一个条目的相似程度的百分比?
作为Soundex和Edit距离的算法(如前一篇文章中所建议的)可以解决您的一些问题.但是,如果您认真对待清理数据,这还不够.正如其他人所说,"比尔"听起来并不像"威廉".
我找到的最佳解决方案是使用简化算法和表来将名称缩减为其根名称.
在常规地址表中,添加名称的根版本,例如Person(Firstname,RootFirstName,Surname,Rootsurname ....)
现在,创建一个映射表.FirstNameMappings(主键名,根名)
通过以下方式填充Mapping表:插入IGNORE(从Person中选择Firstname,"UNDEFINED")到FirstNameMappings
这将添加您在person表中的所有firstnames以及RootName"UNDEFINED"
现在,遗憾的是,您必须浏览所有唯一的名字并将它们映射到RootName.例如"Bill","Billl"和"Will"都应该被翻译成"William"这是非常耗时的,但如果数据质量真的对你很重要,我认为这是最好的方法之一.
现在使用新创建的映射表来更新Person表中的"Rootfirstname"字段.重复姓氏和地址.完成此操作后,您应该能够检测重复项而不会遇到拼写错误.
您可以将名称与Levenshtein距离进行比较.如果名称相同,则距离为0,否则由将一个字符串转换为另一个字符串所需的最小操作数给出.