寻找近似重复logging的技术
我试图清理一个数据库,多年来,已经获得了许多重复logging,名称略有不同。 例如,在公司表中,有“Some Company Limited”和“Some Company LTD!”这样的名称。
我的计划是将违规表导出为R,将名称转换为小写,replace常见的同义词(如“limited” – >“ltd”), agrep
非字母字符,然后使用agrep
来查看相似的内容。
我的第一个问题是, agrep
只接受一个匹配的模式,并且循环每个公司名称以匹配其他公司是慢的。 (有些表格需要清理,有几十个,可能有几十万个名字需要检查。)
我非常简单地看了一下tm
包( JSS文章 ),它看起来非常强大,但是适用于分析大块文本,而不仅仅是名称。
我有几个相关的问题:
-
tm
包是否适合这类任务? -
有更快的select
agrep
? (所述函数使用Levenshtein编辑距离,这是非常慢的)。 -
除了
agrep
和tm
之外,R中还有其他合适的工具吗? -
我甚至应该在R中这样做,还是应该直接在数据库中完成这种事情呢? (这是一个Access数据库,所以如果可能的话,我宁愿避免碰它。)
如果你只是做相对良好的小批量,那么RecordLinkage
包中的compare.linkage()
或compare.dedup()
函数应该是一个很好的起点。 但如果你有大批量的话,那么你可能需要做更多的修补。
我使用RecordLinkage
的函数jarowinkler()
, levenshteinSim()
和soundex()
来编写我自己的使用我自己的权重scheme的函数(也就是说,不能使用soundex()
用于具有RecordLinkage
大数据集)。
如果我有两个我想匹配的名称列表(“logging链接”),那么我通常会将它们都转换为小写字母,并删除所有的标点符号。 为了照顾“有限”而不是“有限公司”,我通常从每个列表创build第一个单词的另一个vector,这允许对第一个单词进行额外的加权。 如果我认为一个列表可能包含首字母缩略词(可能是ATT或IBM),那么我将首字母缩写为另一个列表。 对于每个列表,我最终都会得到一个string数据框,我想比较一下,我将它们作为单独的表格写入MySQL数据库中。
所以,我不会有太多的候选人,我LEFT OUTER JOIN
这两个表LEFT OUTER JOIN
这两个列表必须匹配的东西(也许这是每个列表中的前三个字母或前三个字母和前三个字母在首字母缩写词)。 然后我使用上面的函数来计算比赛分数。
您仍然需要进行大量的人工检查,但是您可以根据分数sorting以快速排除不匹配。
也许谷歌精炼可以帮助。 如果你有很多的例外情况,而且你还不知道,那么看起来可能更合适。
你所做的就是所谓的logging连接 ,在过去的几十年里它一直是一个巨大的研究领域。 幸运的是,这里有一大堆工具可以为这种事情做好准备。 基本上,你可以把它们指向你的数据库,设置一些清理和比较(比如Levenshtein或者Jaro-Winkler或者…),然后他们就会为你做这个工作。
这些工具通常具有解决性能问题的function,所以尽pipeLevenshtein速度很慢,但它们可以快速运行,因为大多数logging对从来没有得到过比较。
上面的维基百科链接可以链接到许多可以使用的logging链接工具。 我亲自写了一个叫做Duke的Java,我已经成功地使用了这个。 如果你想要一个大而昂贵的东西,你可以购买一个主数据pipe理工具。
在你的情况下,编辑距离计算可能会起作用,但是如果你需要在较大的基于文本的文档中find接近重复的东西,你可以试试http://www.softcorporation.com/products/neardup/