2011-04-04 32 views
3

我有两个格式不同的数据库。每个数据库都包含人员数据,如姓名,出生日期和地址。它们都相当大,一个是〜50,000个参与者,另一个〜150万个。基于名称,DoB,地址等匹配人

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

+1

有很多策略可以做到这一点,很多公司提供这种服务。根据数据质量的不同,问题从非常容易到非常困难。有时候,当数据不好(例如打错的姓名)并且结果必须100%准确时,才会包含最终的“手动”通行证。我想我们可以帮助更多,如果你在你的数据和你的预期结果中指定一些条件 – 2011-04-04 08:53:15

+0

我很确定我还需要最后的手动传球。我很可能会生成一个报告,两三个人将不得不通过。 不幸的是我对自己的数据还不太了解。我熟悉的大约150万个条目数据集是因为这是我们的数据,但其他的最终规范还没有最终规范,我甚至没有收到关于它将如何构建或者它将包含哪些内容的提示。 ATM我只是想要规划这个程序。 – kutuzof 2011-04-04 14:42:55

+0

假设错误输入或替换(即中间首字母)名称完全可能,并且100%准确匹配是(可能不可能的)目标。关于如何去做这件事,你会有什么想法? – kutuzof 2011-04-04 14:47:29

回答

6

让我们试着将几个想法放在一起。一般情况太宽泛了,这些只是指南/技巧/其他。

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

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

每种比赛都应该分配一个权重和一个分数,并将其加起来作为该对的总分。

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

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

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

通常会设置一个窗口阈值,这样如果在处理完一对并在y的最大值中获得小于x的分数后,该对将被丢弃。

如果你知道某些领域必须匹配才能考虑一对候选人,那通常会加速整个事情。

用于比较的数据结构很关键,但我并不觉得我的特殊体验会适合你,因为我在大型机中总是这样做:超高速磁盘,大量内存和大量并行性。如果你对此有所帮助,那么我可以认为与一般情况有关。

HTH!

PS:几乎是一个笑话:在几年前我管理的一个大项目中,我们在两个数据库中都有母亲姓氏,并且我们给这样一个事实赋予了重要分数=两个姓氏匹配(个人和他的母亲的)。士气:所有Smith-> Smith都是同一个人:)

0

你可以尝试使用全文搜索功能,也许,如果你的DBMS支持它?全文搜索建立其索引,并可找到类似的单词。

这样可以吗?

+0

数据目前不在实际的数据库中,它们只是从旧的非关系型数据库。使用LILKE函数或类似的东西将它们加载到现代数据库中将是一个选项,但如果我可以自己实现仅使用两个平面文件的东西,那将会更简单。 – kutuzof 2011-04-04 09:08:29