【问题标题】:Matching people based on names, DoB, address, etc根据姓名、DoB、地址等匹配人员
【发布时间】:2011-04-04 08:42:42
【问题描述】:

我有两个格式不同的数据库。每个数据库都包含个人数据,例如姓名、出生日期和地址。它们都相当大,一个是约 50,000 个条目,另一个是约 150 万个条目。

我的问题是比较条目并找到可能的匹配项。理想情况下,生成某种百分比,表示数据匹配的接近程度。我已经考虑了涉及生成多个索引或基于 Levenshtein 距离进行搜索的解决方案,但这些似乎都不是最佳的。索引很容易错过近距离匹配,而 Levenshtein 距离对于这种数据量来说似乎太昂贵了。

【问题讨论】:

  • 有很多策略可以做到这一点,也有很多公司提供这种服务。根据数据质量,问题的范围从非常简单到非常困难。有时,当数据错误(例如输入错误的名称)并且结果必须 100% 准确时,会包含最终的“手动”传递。我想如果您对数据和预期结果指定一些条件,我们可能会提供更多帮助
  • 我很确定我还需要最终的手动通行证。我很可能会生成一份报告,需要两三个人才能完成。不幸的是,我自己还不太了解这些数据。我熟悉的大约 150 万个条目数据集,因为这是我们的数据,但另一个决赛还没有最终规范,我什至没有收到关于它的结构或具体包含什么的提示。 ATM 我只是想计划一下程序。
  • 假设输入错误或替代(即中间名首字母)名称是完全可能的,并且 100% 准确匹配是(可能是不可能的)目标。对于如何解决这个问题,您的第一个想法是什么?
  • @kutusof 好的。让我明确回答。这个问题太广泛了,我不想写一本书:)让我们看看我是否可以把一些想法放在一起

标签: algorithm search compare


【解决方案1】:

让我们尝试将一些想法放在一起。一般情况太宽泛了,这些只是指南/提示/无论如何。

通常您需要的不是真/假匹配关系,而是每个候选匹配的得分。那是因为你永远不能完全确定候选人是否真的匹配。

分数是一对多的关系。您应该准备好将小型数据库的每条记录与主数据库的几条记录进行排名。

每种匹配都应该分配一个权重和一个分数,以相加得到该对的总分。

您应该尝试比较尽可能小的片段以检测部分匹配。不要比较 [address],而是尝试比较 [city] [state] [street] [number] [apt]。

有些字段需要特殊处理,但是这个问题对于这个答案来说太宽泛了。只是一些提示。名称和前缀中的中间首字母可以增加一些分数,但应保持在最低限度(因为它们被多次跳过)。电话号码可能具有可变前缀和后缀,因此有时需要子字符串匹配。根据数据质量,姓名和姓氏必须转换为 soundex 或类似名称。街道名称通常是标准化的,但它们可能缺少前缀或后缀。

如果您需要高质量的输出,请为长时间运行做好准备。

通常会设置一个潜在阈值,以便在处理部分对后,如果在 y 的最大值中获得小于 x 的分数,则丢弃该对。

如果您知道某些字段必须匹配才能将一对视为候选,这通常会大大加快整个过程。

用于比较的数据结构很关键,但我觉得我的特定经验不会对你有好处,因为我总是在大型机中做这种事情:非常高速的磁盘、大量的内存和大量的并行性.如果您对此有所帮助,我可以认为与一般情况相关的是什么。

HTH!

PS:几乎是个笑话:在几年前我管理的一个大型项目中,我们在两个数据库中都有母亲未婚的姓氏,我们给两个姓氏匹配的事实打了很高的分数(个人和他母亲的)。士气:所有的 Smith->Smith 都是同一个人 :)

【讨论】:

    【解决方案2】:

    如果您的 DBMS 支持,您可以尝试使用全文搜索功能吗?全文搜索建立它的索引,并且可以找到相似的词。

    这对你有用吗?

    【讨论】:

    • 数据当前不在实际数据库中,它们只是从旧的非关系数据库中转储的数据块。使用 LILKE 函数或类似的方法将它们加载到现代数据库中是一种选择,但如果我可以自己实现一些只适用于两个平面文件的东西,它会简单得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    相关资源
    最近更新 更多