个人人口统计信息的模糊数据匹配

Posted

技术标签:

【中文标题】个人人口统计信息的模糊数据匹配【英文标题】:Fuzzy data matching for personal demographic information 【发布时间】:2011-03-16 23:39:39 【问题描述】:

假设我有一个数据库,其中包含以下数据元素:

PersonID(无意义的代理自动编号) 名字 MiddleInitial 姓氏 名称后缀 出生日期 AlternateID(如 SSN、军事 ID 等)

我从各种格式中获得了大量数据馈送,这些数据包含您能想到的这些信息的每一种合理变化。一些例子是:

全名,出生日期 全名,最后 4 个 SSN 第一名,最后一名,出生日期

当这些数据进来时,我需要写一些东西来匹配它。我不需要或期望获得超过 80% 的匹配率。自动匹配后,我会将不确定的匹配呈现在网页上,供人手动匹配。

其中一些复杂性是:

    某些数据匹配比其他数据更好,我想为这些匹配分配权重。例如,如果 SSN 完全匹配但名称因某人使用中间名而关闭,则与名称完全匹配但 SSN 关闭时相比,我希望为该匹配分配更高的置信度值。 名称匹配有一些困难。 John Doe Jr 与 John Doe II 相同,但与 John Doe Sr. 不同,如果我得到 John Doe 而没有其他信息,我需要确保系统不会选择一个,因为无法确定选择谁。 名字匹配真的很难。你有 Bob/Robert、John/Jon/Jonathon、Tom/Thomas 等。 仅仅因为我有一个包含 FullName+DOB 的提要,并不意味着每条记录都填写了 DOB 字段。我不想因为不匹配的 DOB 杀死匹配的分数而错过一个链接。如果缺少某个字段,我想将其从可匹配的元素中排除。 如果有人手动匹配,我希望他们的匹配影响所有未来的匹配。因此,如果我们再次获得相同的准确数据,下次没有理由不自动匹配它。

我已经看到 SSIS 具有模糊匹配,但我们目前不使用 SSIS,而且我发现它非常笨拙,几乎不可能进行版本控制,因此它不是我的首选工具。但如果这是最好的,请告诉我。否则,是否有任何(最好是免费的,最好是基于 .NET 或 T-SQL 的)工具/库/实用程序/技术用于解决此类问题?

【问题讨论】:

【参考方案1】:

这是一个名为record linkage的问题。

虽然它是针对 python 库的,但 dedupe 的文档提供了 good overview of how to approach the problem comprehensively。

【讨论】:

【参考方案2】:

如果误报没有困扰您并且您的语言主要是英语,您可以尝试像Soundex 这样的算法。 SQL Server 将其作为内置函数。 Soundex 不是最好的,但它确实进行了模糊匹配并且很受欢迎。另一种选择是变音位。

【讨论】:

【参考方案3】:

您可以通过多种方式解决此问题,但在完成此类事情之前,我将继续并在这里提出,您在人与人之间出现“不正确”匹配时会冒很大风险。

您的输入数据非常稀疏,如果不是所有值都存在,那么它并不是最独特的。

例如,对于您的名字、姓氏、出生日期的情况,如果您拥有所有记录的所有三个部分,那么您可以更轻松地进行匹配。如果不是,尽管您将自己暴露在很多潜在的问题中。

从更“粗略”的角度来看,您可能会采取的一种方法是使用一系列查询来简单地创建一个流程,这些查询可以简单地识别和分类匹配的条目。

例如,首先检查姓名和 SSN 是否完全匹配,如果存在标记,请将其标记为 100%,然后继续下一组。然后,您可以明确定义模糊的位置,以便了解匹配的潜在后果。

最后,您将获得一个列表,其中包含指示匹配类型的标志(如果该记录有)。

【讨论】:

这是我过去见过的一种方法。误报的风险很高,而且代码很脆弱,因为很难解释所有的组合。此外,我们系统中的数据非常完整……我们从其他供应商那里获得的数据,嗯……来自其他人。 无论采用何种方法,您的误报风险都会很高。但是,如果您使用有条不紊的方法并将其构建出来,您将至少能够知道匹配是什么/为什么/如何完成并减少误报。【参考方案4】:

看看 Levenshtein 算法,它可以让您获得“两个字符串之间的距离”,然后可以将其除以字符串的长度以获得百分比匹配。

http://en.wikipedia.org/wiki/Levenshtein_distance

我之前已经成功地实现了这一点。它是一家医疗保健公司的供应商门户,供应商在该网站上注册了自己。匹配是通过他们的门户注册并在主要的医疗保健系统中找到相应的记录。参与此操作的处理者将获得最可能的匹配项,按百分比降序排列,并且可以轻松选择正确的帐户。

【讨论】:

好答案。我的工具带里已经有了那个,以防我最终从头开始构建它。不过,我希望不要完全从头开始构建 :-) 实现这个应该不会花太长时间..我用的时候只花了一两天。 什么花了一两天时间,Levenshtein 算法或完整的人口统计比较器与名称语义、匹配分数和置信度评级的所有细微差别?我想你可能把它弄得太简单了。通用字符串比较算法虽然可能是解决方案的一部分,但还不够。 我必须同意我正在简化事情..这就是我所做的.. OP 比我们做得更进一步。我们没有对字段进行不同的加权,只是将源字段与目标字段一起通过 Levenshtein 的一次传递并除以字符串长度。将 Levenshtein 编写为 SQL 函数,整个比较和结果过程就是一个查询。

以上是关于个人人口统计信息的模糊数据匹配的主要内容,如果未能解决你的问题,请参考以下文章

个人页面的 Facebook 见解

如何确定访问您网站的用户的人口统计数据?

数理统计基础 02 - 统计量和三大分布

石墨:总结所有匹配模式的统计数据?

第七次人口普查数据可视化分析实战——基于pyecharts(含数据和源码)

Pandas统计分析基础:DataFrame的数据分析及画图功能(case:京津冀地区的gdp和人口的关系)