查找接近重复记录的技术
Posted
技术标签:
【中文标题】查找接近重复记录的技术【英文标题】:Techniques for finding near duplicate records 【发布时间】:2011-10-04 17:34:06 【问题描述】:我正在尝试清理一个数据库,该数据库多年来获得了许多重复记录,名称略有不同。例如,在公司表中,有“Some Company Limited”和“SOME COMPANY LTD!”之类的名称。
我的计划是将有问题的表导出到 R 中,将名称转换为小写,替换常见的同义词(如“limited”->“ltd”),去掉非字母字符,然后使用agrep
看看看起来很相似。
我的第一个问题是agrep
只接受一个模式来匹配,并且循环遍历每个公司名称以匹配其他公司名称很慢。 (某些要清理的表将有数万甚至数十万个名称要检查。)
我已经简要地查看了tm
包 (JSS article),它看起来非常强大,但适用于分析大块文本,而不仅仅是名称。
我有几个相关的问题:
tm
包是否适合此类任务?
有没有比agrep
更快的替代方案? (所述功能使用
Levenshtein 编辑距离非常慢。)
除了agrep
和tm
,R 中还有其他合适的工具吗?
我是否应该在 R 中执行此操作,或者此类事情应该是 直接在数据库中完成? (这是一个 Access 数据库,所以我会 尽量避免触摸它。)
【问题讨论】:
相关How to measure similarity between strings? 【参考方案1】:如果您只是做格式相对较好的小批量,那么RecordLinkage
package 中的compare.linkage()
或compare.dedup()
函数应该是一个很好的起点。但是如果你有大批量,那么你可能需要做更多的修补。
我使用RecordLinkage
中的函数jarowinkler()
、levenshteinSim()
和soundex()
来编写我自己的函数,该函数使用我自己的加权方案(同样,您不能将soundex()
用于大数据集RecordLinkage
)。
如果我有两个想要匹配的名称列表(“记录链接”),那么我通常将两者都转换为小写并删除所有标点符号。为了处理“Limited”与“LTD”,我通常从每个列表中创建第一个单词的另一个向量,这允许对第一个单词进行额外的加权。如果我认为一个列表可能包含首字母缩略词(可能是 ATT 或 IBM),那么我将对另一个列表进行首字母缩略词。对于每个列表,我最终都会得到一个字符串数据框,我想将其作为 mysql 数据库中的单独表进行比较。
为了不让我得到太多候选人,我LEFT OUTER JOIN
这两个表在两个列表之间有匹配的东西上(也许那是每个列表中的前三个字母或首字母缩写词中的前三个字母和前三个字母)。然后我使用上述函数计算匹配分数。
您仍然需要进行大量人工检查,但您可以根据分数进行排序以快速排除不匹配的情况。
【讨论】:
+1 用于解释如何规范化文本。所有经常被忽视的“第一步”。降低(),gsub()。通过查看 summary(as.factor(my_vector)) 并查看不匹配的内容,我做了非常相似的事情。有时它真的很简单,写出这些行比尝试使用正则表达式要干净得多。 @AndrewMedico 是的,看起来该软件包在 CRAN 中不再处于活动状态。您可以从存档中获取过去的版本。我有义务成为包维护者吗? @RichardHerron 感谢您指向这些包,它现在在 CRAN 上。如果我只有数字列并且它们因随机波动而不同,并且我想在数字数据中找到匹配项,你有什么建议吗? @Richard 该包似乎不再出现在 CRAN 上。你能调查一下吗?谢谢! @questionmark 你指的是哪个 Richard(Richard 或 RichardHerron)?和哪个包?这个:cran.r-project.org/web/packages/RecordLinkage/index.html 在我看来是在 CRAN 上。【参考方案2】:也许google refine 可以提供帮助。如果你有很多例外但你还不知道它们,它看起来可能更合适。
【讨论】:
我没有使用过谷歌优化,但我对视频印象深刻。它似乎擅长处理模糊匹配,最重要的是,它似乎可以保存底层代码,以便在需要时再次运行它,或者如果想对相似数据运行相同的算法。【参考方案3】:你正在做的事情被称为record linkage,几十年来它一直是一个巨大的研究领域。对你来说幸运的是,有一大堆工具可以为这类事情做好准备。基本上,您可以将它们指向您的数据库,设置一些清理和比较器(如 Levenshtein 或 Jaro-Winkler 或...),它们就会开始为您完成工作。
这些工具通常具有解决性能问题的功能,因此即使 Levenshtein 速度很慢,它们也可以快速运行,因为大多数记录对根本不会进行比较。
上面的 Wikipedia 链接包含许多您可以使用的记录链接工具的链接。我亲自用 Java 编写了一个名为 Duke 的代码,我已经成功地用于此目的。如果您想要大而昂贵的东西,您可以购买主数据管理工具。
【讨论】:
【参考方案4】:在您的情况下,编辑距离计算之类的方法可能会起作用,但如果您需要在较大的基于文本的文档中查找附近的重复项,您可以尝试 http://www.softcorporation.com/products/neardup/
【讨论】:
以上是关于查找接近重复记录的技术的主要内容,如果未能解决你的问题,请参考以下文章