我以前从未构建过匹配算法,也不知道从哪里开始。所以这是我的基本设置以及我为什么这样做。如果我没有问正确的问题,请随意纠正我。
我有一个人名的名字和唯一标识符数据库。几个生成的标识符(内部生成的和一些第三方),姓氏,名字和出生日期是我将使用的主要标识符。
全年多次收到第三方列表,该列表需要导入并绑定到我数据库中的现有人员,但数据从未像我一样干净。 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'
答案 0 :(得分:10)
您可能对Levenshtein distance感兴趣。
两个人之间的Levenshtein距离 字符串定义为最小值 转换所需的编辑次数 一个字符串进入另一个,用 允许的编辑操作 插入,删除或替换 单个字符。它被命名 在Vladimir Levenshtein之后 在1965年考虑了这个距离。1
可以比较每个字段并计算总距离。通过反复试验,您可以发现适当的阈值,以便将记录解释为匹配。我自己没有实现这个,只是想到了这个想法:}
例如:
A和B之间的距离将低于A和C / B和C,这表示更好的匹配。
答案 1 :(得分:1)
说到这样的事情,不要重新发明轮子。 Levehstein距离可能是你最好的选择,如果你自己必须这样做,但除此之外,做一些研究现有的数据库查询和模糊搜索的解决方案。他们做得比你长,也可能更好......
祝你好运!答案 2 :(得分:0)
如果您正在处理此大小的数据集和导入的不同资源,您可能需要查看身份管理解决方案。我对Sun身份管理器非常熟悉,但对于您正在尝试的操作可能有些过分。可能值得研究。
答案 3 :(得分:0)
如果您从第三方获得的数据是一致的(每次都是相同的格式),我可能会为您从中获取数据的每个第三方创建一个表。然后每次将每组新数据导入同一个表。我知道有一种方法可以使用SQL语句基于每个表中的公共列来连接两个表。这样,您可以执行SQL查询并从多个表中获取数据,但使其看起来像是来自一个统一的表。类似地,可以找到在两个表中没有匹配的添加的记录,然后手动配对。这样您就可以将“干净”的数据与第三方的垃圾分开。如果您想要真正导入,则可以使用该连接表创建包含所有数据的第三个表。
答案 4 :(得分:0)
我会从容易接近100%的确定匹配开始并首先处理它们,所以现在你有一个200的需要修复的列表。
对于剩余的行,您可以使用简化版Bayes' Theorem。
对于每个不匹配的行,计算似然它是否与数据集中的每一行匹配,假设数据包含某些概率发生的某些更改。例如,一个人改变他们的姓氏的概率为0.1%(可能也取决于性别),改变他们的名字的概率为0.01%,并且是一个错字率为0.2%(使用Levenshtein's distance来计算错别字)。其他领域也随着某些概率而变化。对于每一行,考虑所有已更改的字段,计算行匹配的可能性。然后选择匹配概率最高的那个。
例如,在一个字段中只有一个小错字但在所有其他字段上相等的行将有0.2%的匹配机会,而在许多字段中有所不同的行可能只有0.0000001%的机会。所以你选择了一个小错字行。
答案 5 :(得分:-5)
你需要正则表达式,为什么重新发明轮子?