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

时间:2010-07-16 13:56:18

标签: c# .net algorithm string-matching data-cleansing

假设我的数据库中包含以下数据元素:

  • PersonID(无意义的代理自动编号)
  • MiddleInitial
  • 名字
  • NameSuffix
  • DATEOFBIRTH
  • AlternateID(如SSN,Militarty ID等)

我从各种格式中获取了大量数据,并且您可以想到这些信息的各种合理变化。一些例子是:

  • FullName,DOB
  • FullName,Last 4 SSN
  • 首先,最后,DOB

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

一些复杂性是:

  1. 有些数据匹配比其他数据更好,我想为这些数据赋予权重。例如,如果SSN完全匹配,但由于有人使用中间名,该名称已关闭,我希望为该匹配分配一个更高的置信度值,而不是名称匹配但SSN已关闭。
  2. 名称匹配有一些困难。 John Doe Jr与John Doe II相同,但与John Doe Sr.不同,如果我得到John Doe而没有其他信息,我需要确定系统没有选择一个因为没有办法确定谁来挑选。
  3. 名字匹配真的很难。你有Bob / Robert,John / Jon / Jonathon,Tom / Thomas等。
  4. 仅仅因为我有一个包含FullName + DOB的Feed并不意味着每个记录都填充了DOB字段。我不想因为无与伦比的DOB杀死匹配分数而错过联动。如果缺少某个字段,我想将其从可用于匹配的元素中排除。
  5. 如果有人手动匹配,我希望他们的匹配会影响以后的所有比赛。因此,如果我们再次获得相同的确切数据,则没有理由不在下次自动匹配。
  6. 我已经看到SSIS有模糊匹配,但是我们目前没有使用SSIS,而且我发现它非常糟糕且几乎不可能进行版本控制,因此它不是我首选的工具。但如果它是最好的,请告诉我。否则,你是否有任何(最好是免费的,最好是基于.NET或T-SQL的)工具/库/实用程序/技术用于此类问题?

4 个答案:

答案 0 :(得分:3)

你可以通过多种方式解决这个问题,但是在我继续进行之前已经完成了这类事情,并且在这里发现你在人与人之间进行“不正确”的比赛时会冒很大的风险。

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

例如,使用您的名字,姓氏,DOB情况,如果您拥有所有记录的所有三个部分,那么匹配将使您更容易使用。如果没有,你会暴露自己很多潜在的问题。

您可能采取的一种方法是,在更“原始”的方面,只需使用一系列查询来创建流程,这些查询只需识别和分类匹配的条目。

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

最后,你会得到一个带有标志的列表,表明匹配类型,如果该记录有任何匹配类型。

答案 1 :(得分:1)

看看Levenshtein Algoritm,它允许你得到'两个字符串之间的距离',然后可以将其分成字符串的长度以获得百分比匹配。

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

我之前已经实现了这一目标,取得了巨大成功。它是医疗保健公司的提供商门户网站,提供商在网站上注册了自己。匹配是进行门​​户网站注册并在主要医疗保健系统中找到相应的记录。参加此活动的处理者获得了最可能的匹配,按百分比递减排序,并且可以轻松选择正确的帐户。

答案 2 :(得分:1)

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

虽然它适用于python库,但dedupe的文档会提供good overview of how to approach the problem comprehensively

答案 3 :(得分:0)

如果误报不会让您感到烦恼并且您的语言主要是英语,则可以尝试使用Soundex之类的算法。 SQL Server将其作为内置函数。 Soundex不是最好的,但它确实做了模糊匹配并且很受欢迎。另一种选择是metaphone。