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

C# 个人人口统计信息的模糊数据匹配,c#,.net,algorithm,string-matching,data-cleaning,C#,.net,Algorithm,String Matching,Data Cleaning,假设我有一个数据库,里面有以下数据元素的人: PersonID(无意义的代理自动编号) 名字 中首字母 姓氏 NameSuffix 出生日期 备选ID(如SSN、民兵ID等) 我从各种格式中获取了大量的数据源,这些数据源中包含了你所能想到的各种信息。例如: 全名 全名,最后4个SSN 首先,最后,多布 当这些数据进来时,我需要写一些东西来匹配它。我不需要,也不期望,获得超过80%的匹配率。在自动匹配之后,我将在网页上显示不确定的匹配,以便有人手动匹配 其中一些复杂性包括: 某些数据匹配比

假设我有一个数据库,里面有以下数据元素的人:

  • PersonID(无意义的代理自动编号)
  • 名字
  • 中首字母
  • 姓氏
  • NameSuffix
  • 出生日期
  • 备选ID(如SSN、民兵ID等)
我从各种格式中获取了大量的数据源,这些数据源中包含了你所能想到的各种信息。例如:

  • 全名
  • 全名,最后4个SSN
  • 首先,最后,多布
当这些数据进来时,我需要写一些东西来匹配它。我不需要,也不期望,获得超过80%的匹配率。在自动匹配之后,我将在网页上显示不确定的匹配,以便有人手动匹配

其中一些复杂性包括:

  • 某些数据匹配比其他数据匹配更好,我想为这些数据分配权重。例如,如果SSN完全匹配,但由于有人使用中间名,因此名称处于禁用状态,我希望为该匹配指定一个比名称完全匹配但SSN处于禁用状态时高得多的置信值
  • 名称匹配有一些困难。小约翰·多伊与约翰·多伊二世相同,但与老约翰·多伊不同。如果我得到约翰·多伊而没有其他信息,我需要确保系统不会选择一个,因为无法确定选择谁
  • 名字匹配真的很难。你有鲍勃/罗伯特、约翰/乔恩/乔纳森、汤姆/托马斯等
  • 仅仅因为我有一个FullName+DOB的feed,并不意味着每个记录都填充了DOB字段。我不想因为不匹配的DOB杀死匹配的分数而错过一个链接。如果缺少字段,我想将其从可用于匹配的元素中排除
  • 如果有人手动匹配,我希望他们的匹配影响将来的所有匹配。因此,如果我们再次获得相同的精确数据,没有理由不在下次自动匹配它

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

    看看Levenshtein算法,它允许您获得“两个字符串之间的距离,'然后可以将其划分为字符串的长度以获得百分比匹配


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

    有很多方法可以实现这一点,但在我继续之前已经完成了这类工作,并在这里指出,“不正确”会带来很大的风险人与人之间的比赛

    您的输入数据非常稀疏,如果不是所有的值都存在的话,那么它也不是最唯一的

    例如,对于您的名字、姓氏、DOB情况,如果您的所有记录都包含这三个部分,那么匹配将更容易处理。如果不是的话,尽管你会暴露出很多潜在的问题

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

    例如,首先检查名称和SSN的精确匹配,如果存在,则标记它,将其记为100%,然后继续下一组。然后,您可以明确定义模糊的位置,以便了解匹配的潜在分支


    最后,你会有一个带有标志的列表,指示该记录的匹配类型(如果有的话)。

    如果误报没有困扰你,并且你的语言主要是英语,你可以尝试类似的算法。具有内置功能。Soundex并不是最好的,但它确实进行了模糊匹配,并且很受欢迎。另一种选择是变音。

    这就是所谓的问题


    虽然它是针对python库的,但的文档给出了一个很好的答案。

    。我已经把它放在我的工具带里了,以防我从头开始建造它。我希望不要完全从头开始构建:-)实现这一点不会花费太长时间。。当我使用它时只花了一两天时间。什么花了一两天时间,Levenshtein算法还是一个完整的人口统计比较器,它有名称语义、匹配分数和信心评级的细微差别?我想你可能把这件事太简单了。一个通用的字符串比较算法,虽然可能只是解决方案的一部分,但还不够。我必须承认,我正在简化事情。。我就是这么做的。。这次行动比我们走得更远。我们没有对字段进行不同的加权,只是通过一次Levenshtein将源字段与目标字段合并,然后除以字符串长度。Levenshtein是作为SQL函数编写的,整个比较和结果过程都是一个查询,这是我以前见过的一种方法。误报的风险很高,代码也很脆弱,因为很难解释所有的组合。而且,我们系统中的数据非常完整。。。我们从其他供应商那里得到的数据是。。。无论采用何种方法,你的假阳性风险都会很高。但是如果你用一种有条不紊的方法来构建它,你将至少能够知道匹配是如何完成的,以及m