【发布时间】: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 的)工具/库/实用程序/技术用于解决此类问题?
【问题讨论】:
标签: c# .net algorithm string-matching data-cleaning