相关疑难解决方法(0)

查找近似重复记录的技术

我正在尝试清理一个数据库,这些数据库多年来获得了许多重复记录,名称略有不同.例如,在公司表中,有"Some Company Limited"和"SOME COMPANY LTD!"等名称.

我的计划是将违规表导出为R,将名称转换为小写,替换常见的同义词(如"limited" - >"ltd"),删除非字母字符然后agrep用来查看看起来相似的内容.

我的第一个问题是agrep只接受一个匹配的模式,并且循环每个公司名称以匹配其他公司名称的速度很慢.(有些待清理的表会有数十个,可能有数十万个要检查的名称.)

我已经非常简要地看了一下这个tm包(JSS文章),它看起来非常强大,但它主要用于分析大块文本,而不仅仅是名称.

我有一些相关的问题:

  1. tm包是否适合这类任务?

  2. 有更快的替代方案agrep吗?(所述函数使用Levenshtein编辑距离,传闻速度慢.)

  3. R中还有其他合适的工具,除了agreptm

  4. 我是否应该在R中执行此操作,还是应该直接在数据库中执行此类操作?(这是一个Access数据库,所以如果可能,我宁愿避免触摸它.)

duplicate-data r duplicate-removal fuzzy-comparison

46
推荐指数
3
解决办法
1万
查看次数

高效的字符串相似性分组

设置:我有关于人员及其父母姓名的数据,我想找到兄弟姐妹(父母姓名相同的人).

 pdata<-data.frame(parents_name=c("peter pan + marta steward",
                                 "pieter pan + marta steward",
                                 "armin dolgner + jane johanna dough",
                                 "jack jackson + sombody else"))
Run Code Online (Sandbox Code Playgroud)

这里的预期输出将是一列,表示前两个观察属于X族,而第三和第四列各自属于一个独立的族.例如:

person_id    parents_name                           family_id
1            "peter pan + marta steward",           1
2            "pieter pan + marta steward",          1
3            "armin dolgner + jane johanna dough",  2
4            "jack jackson + sombody else"          3
Run Code Online (Sandbox Code Playgroud)

目前的方法:我对距离度量很灵活.目前,我使用Levenshtein编辑距离匹配obs,允许两个字符的差异.但是,如果它们运行得更快,其他变体如"最大公共子串"将会很好.

对于较小的子样本,我stringdist::stringdist在循环中使用stringdist::stringdistmatrix,但随着样本量的增加,这变得越来越低效.

一旦使用某个样本大小,矩阵版本就会爆炸.我极其低效的循环尝试是:

#create data of the same complexity using random last-names
#(4mio obs and ~1-3 kids per parents) …
Run Code Online (Sandbox Code Playgroud)

string performance r levenshtein-distance

10
推荐指数
4
解决办法
2303
查看次数