4

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

  • PersonID(无意义的代理自动编号)
  • 中间初始
  • 名称后缀
  • 出生日期
  • AlternateID(如 SSN、军事 ID 等)

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

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

当这些数据进来时,我需要写一些东西来匹配它。我不需要或期望获得超过 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 的提要,并不意味着每条记录都填写了 DOB 字段。我不想因为不匹配的 DOB 杀死匹配的分数而错过一个链接。如果缺少某个字段,我想将其从可用于匹配的元素中排除。
  5. 如果有人手动匹配,我希望他们的匹配影响所有未来的匹配。因此,如果我们再次获得相同的准确数据,下次没有理由不自动匹配它。

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

4

4 回答 4

3

有很多方法可以解决这个问题,但是在我做完这类事情之前我会继续在这里提出,你会冒很大的风险在人与人之间进行“不正确”的匹配。

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

例如,对于您的名字、姓氏、出生日期情况,如果您拥有所有记录的所有三个部分,那么匹配会变得更容易处理。如果不是,尽管您将自己暴露在很多潜在的问题中。

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

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

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

于 2010-07-16T14:03:12.977 回答
1

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

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

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

于 2010-07-16T14:02:23.823 回答
1

这是一个称为记录链接的问题。

虽然它是针对 python 库的,但重复数据删除的文档很好地概述了如何全面解决问题

于 2016-09-24T02:51:23.737 回答
0

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

于 2010-07-17T03:43:13.747 回答