我从来没有建立一个算法用于匹配的前真的不知道从哪里开始。因此,这里是我的基本设立和我为什么要这样做。随时纠正我,如果我不是要问正确的问题。

我有一个数据库的姓名和独特的标识符为的人。几产生的标识符(内部产生和一些第三方)、姓名和出生日期是主要的,我会被使用。

几次全年我收到的名单从一个第三方,需要加以进口和绑到现有的人在我的数据库,而该数据是不干净的矿。Id可能会改变,出生日期可能有拼写错误,名称可能有拼写错误,最后一名可能的变化等。

每个进口可能有20 000名的记录,因此,即使是99%准确,仍然有200记录我要去手动和比赛。我认为我在寻找更像是99.9%的精确度的时候到匹配入的人民对我的用户。

所以,我怎么去做的算法,可以图出这个?

PS甚至如果你没有一个确切的答案,但不知道一些材料为准也将是有益的。

PPS的一些例子将类似于什么m3rLinEz写道:

ID: 9876234 Fname: Jose     LName: Guitierrez       Birthdate:01/20/84  '- Original'

ID: 9876234 Fname: Jose     LName: Guitierrez       Birthdate:10/20/84  '- Typo in birth date'
ID: 0876234 Fname: Jose     LName: Guitierrez       Birthdate:01/20/84  '- Wrong ID'
ID: 9876234 Fname: Jose     LName: Guitierrez-Brown Birthdate:01/20/84  '- Hyphenated last name'
ID: 9876234 Fname: Jose, A. LName: Guitierrez       Birthdate:01/20/84  '- Added middle initial'
ID: 3453555 Fname: Joseph   LName: Guitierrez       Birthdate:01/20/84  '- Probably someone else with same birthdate and same last name'
有帮助吗?

解决方案

你可能会感兴趣 Levenshtein distance.

The Levenshtein之间的距离两个 串被定义为最低 数量的编辑内容所需的改变 一串到其他的 允许编辑操作 插入、删除或替换 的一个角色。它命名 后弗拉基米尔*Levenshtein谁 审议了这个距离在1965年。1

它可以比较每一个的领域和计算的总的距离。和通过试错你可能会发现合适的阈值,以允许记录被解释为匹配。还没有实现这个我自己但只是觉得这个想法:}

例如:

  • 记录-ID:4831213321,名称:Jane
  • 记录B-ID:431213321,名称:Jann
  • 记录C-ID:4831211021,名称:约翰

的A和B之间的距离将低于A和C/B和C,这表明更好地匹配。

其他提示

当谈到这样的事情,不推倒重来。该Levehstein距离大概是你最好的选择,如果你要自己做,但在其他方面,做对现有的解决方案,做数据库查询和模糊搜索一些研究。他们已经比你长这样做,它可能会更好,太..

祝你好运!

如果你处理的数据集这种规模和不同的资源被导入,您可能希望寻找到身份管理解决方案。我主要是熟悉与Sun身份管理器,但它可能是矫枉过正你想要做什么。这可能是值得探讨的。

如果您是从第三方获得的数据是一致的(相同的格式每次)我可能会创建一个表中的每个要从中获取数据的第三方的。然后,每次导入每个新的数据集到同一个表。我知道有一种方法可以再加入基于每个公共列使用SQL语句的两个表。这样,你可以进行SQL查询,并从多个表中的数据,但使它看起来像它从一个单一的统一表来了。同样添加的记录没有比赛两个表中可以发现,然后手动配对。你把你的“干净”的数据通过这种方式从你从第三方获得的垃圾分开。如果你想要一个真正的进口然后你可以使用连接表创建一个包含所有数据的第三个表。

我要开始用简单的近100%确定匹配和处理它们的第一个,所以现在你有一个列表说,200,需要固定。

对于剩余的行可以使用的简化版本 贝叶斯定理.

每个无与伦比的行中,计算 可能性 它是一个比赛中的每一行数据集的假定数据包含有某些改变而发生的某些概率。例如,一个人改变其姓氏与率0.1%(可能还取决于性别),改变他们的名字概率为0.01%,并且是一个具有单一的输入错误用probility0.2%(使用 Levenshtein的距离 数字错误).其他领域也有改变与某些概率。为每个行计算梯次的行匹配,考虑到所有领域,已经改变。然后挑选的一个具有最高的概率是一个匹配。

例如行只有一个小错误中的一个领域,但同所有其他人会有0.2%的机会相匹配,而行其不同之处在许多领域可能只有一个0.0000001%的机会。所以你选择的行与小错字。

正则表达式是你需要什么,为什么另起炉灶?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top