寻找附近的重复记录技术寻找附近的重复记录技术(Techniques for finding near

2019-05-13 09:56发布

我试图清理,多年来,已获得许多重复记录的数据库,以稍微不同的名称。 例如,在公司的表,也有像“有些有限公司”和姓名“有些COMPANY LTD!”。

我的计划是有问题的表导出为R,转换名称为小写,代替普通的同义词(如“限” - >“有限公司”),剥离非字母字符,然后使用agrep看什么长相相似。

我的第一个问题是, agrep只接受单一的模式来匹配,并遍历每家公司的名字来匹配其他人慢。 (要清洗一些表将有几十,甚至几百个几千名来检查的。)

我很简单看了一下tm封装( JSS文章 ),而且看起来很强大,但对分析文本的大块,而不是仅仅名称为目标。

我有几个相关的问题:

  1. tm封装适合这种任务的?

  2. 是否有一个更快的替代agrep ? (该函数使用的Levenshtein编辑距离是闲谈慢。)

  3. 是否有其他合适的工具R,除了agreptm

  4. 应我甚至在R上这样做,还是应该这样的事情可以直接在数据库中做了什么? (这是一个Access数据库,所以我宁愿尽可能避免触碰它。)

Answer 1:

如果你只是在做的比较好,形成小批量,那么compare.linkage()compare.dedup()的函数RecordLinkage包装应该是一个很好的起点。 但如果你有大批量,那么你可能需要做一些更多的修修补补。

我使用的功能jarowinkler() levenshteinSim()soundex()RecordLinkage写我自己的函数,用我自己的权重方案(也,不如说是,你不能用soundex()用于大数据集的RecordLinkage )。

如果我有,我想匹配(“记录链接”)名称的两个列表,然后我通常都转换为小写,并删除所有标点。 为了照顾“有限”与“有限公司”我通常创建从每个列表,它允许在第一个字额外加权的第一个字的另一种载体。 如果我认为一个列表可能包含首字母缩写词(也许ATT或IBM),那么我会缩写-IZE其他列表。 对于每个列表我结束了,我想比较,我写在MySQL数据库中成为独立的表字符串的数据帧。

所以,我不会有太多的考生结束了,我LEFT OUTER JOIN的东西, 两个列表之间的匹配(也许这是每个列表中的前三个字母或前三个字母的前三个字母这两个表的缩写)。 然后我计算使用上述功能的匹配分数。

你仍然需要做大量的人工检查的,但你可以排序的比分迅速排除不匹配。



Answer 2:

也许谷歌细化可能会有帮助。 如果你有很多例外的,你不知道他们都还没有它看起来也许多个镶嵌。



Answer 3:

你在做什么是所谓的连接记录 ,并且它一直是研究的一个巨大的领域已经结束了几十年。 幸运的是,还有的工具,有现成的了这样的事情一大堆。 基本上,你可以在你的数据库,设置了一些清洁和比较器(像莱文斯坦或哈罗 - 温克勒或......)点他们,他们会熄灭,并为你做的工作。

这些工具通常有地方解决了性能问题,所以,即使是莱文斯坦慢,他们能跑多快,因为大多数记录对从未在所有获得比较功能。

上面的维基百科链接有链接到一个号码,你可以使用记录联动工具。 我个人写一个叫杜克在Java中,我已经成功地用于正是这一点。 如果你想要的东西又大又贵,你可以买一个主数据管理工具。



Answer 4:

在您的情况大概就像编辑距离计算的工作,但如果你需要找到附近的重复在更大的基于文本的文档,你可以尝试http://www.softcorporation.com/products/neardup/



文章来源: Techniques for finding near duplicate records