在 R 中查找两个向量之间的部分匹配字符串

2024-01-10

我正在 R 中使用两个字符串向量。

第一个,业主,包含大约 100,000 个元素,如下所示:

> proprietor
 [1] "GERALD RICA LIMITED"                                             
 [2] "EUROMASTER STUDIO SRL"                                           
 [3] "CENTRE D'ECHANGES INTERNATIONAUX (CEI)"                          
 [4] "RONTEC SERVICE STATION 1A LIMITED"                               
 [5] "MOORGARTH PROPERTIES (LUXEMBOURG) S.A.R.L"                       
 [6] "BEAVRON INVESTMENTS LIMITED"                                     
 [7] "MITRALI LIMITED" 

另一个,name,包含大约700,000个相似元素:

> name 
 [1] "MULTIPOINT HOLDINGS LIMITED"                                     
 [2] "NYASA PROPERTY LIMITED"                                          
 [3] "WHITE LODGE HOLDINGS LIMITED"                                    
 [4] "MULTIPOINT HOLDINGS LIMITED"                                     
 [5] "MULTIPOINT HOLDINGS LIMITED"                                     
 [6] "JBL INVESTMENT LIMITED"                                          
 [7] "DIMBLEBY LIMITED"                                                
 [8] "LIDL U.K. GMBH"     

我想知道其中的哪些元素业主也在name,考虑到可能存在一些拼写错误,或者像“LIMITED”这样的单词也可以写成“LTD”。

我已经尝试过的:

  • proprietor %in% name返回一个空元素,我知道情况并非如此

  • intersect(proprietor, name)不起作用,因为我的向量中有重复项

  • 主要是,我尝试做一个循环agrep()允许部分匹配:

    for (i in 1:97034) {
      if (is.null(agrep(proprietor[i], name, max.distance=0.1, value=TRUE, useBytes=TRUE, costs=NULL, ignore.case=TRUE))=="TRUE") {
        test[i] <- 1
      } else {
        test[i] <- agrep(proprietor[i], name, max.distance=0.1, value=TRUE, useBytes=TRUE, costs=NULL, ignore.case=TRUE)
      }
    }

它返回错误“regcomp 错误:‘内存不足’”。我从 R 开始,所以 1)我可以看到这个循环不是最简单的方法 2)我不知道如何纠正这个内存不足错误。

  • 我也尝试了这篇文章中给出的解决方案:在 R 中查找两个向量之间的匹配字符串 https://stackoverflow.com/questions/38371321/find-matching-strings-between-two-vectors-in-r但我无法实现它(错误消息:错误:断言'tree->num_tags == num_tags'执行正则表达式失败:文件'tre-compile.c',第634行。我找不到它来自哪里.)

任何有关如何解决此问题的建议将不胜感激!


我会使用这个功能adist从包装中stringdist.

最小工作示例:

创建一个无意义词向量并将该向量称为 a:

a <- c("gkhk", "ololsol", "tyuil", "tyuio", "etytyuli")

修改一些单词(或多或少的修改程度)并将该向量称为向量 b:

b <- c("gwrwkhk", "olseotyuioplsol", "thsyuil", "tasyuio", "etytyuli")

然后计算元素之间的距离

yourdistance <- adist(x = a, y = b, ignore.case = TRUE)

yourdistance将是一个计算元素之间距离的矩阵。

     [,1] [,2] [,3] [,4] [,5]
[1,]    3   15    7    7    8
[2,]    7    8    6    7    7
[3,]    7   10    2    3    5
[4,]    7   10    3    2    5
[5,]    8   11    5    5    0

例如,a [5,] 中的“etytyuli”和 b [5] 中的“etytyuli”之间的距离将为 0,因为我没有将该字符串从 a 修改为 b。

一旦你有了这个矩阵,你就可以决定什么对你来说“足够接近”,并只选择那些元素。您还可以使用参数成本,它允许您为插入、删除或替换提供不同的成本。

您可能想了解更多相关信息:

https://www.r-bloggers.com/fuzzy-string-matching-a-survival-skill-to-tackle-unstructured-information/

希望能帮助到你。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 R 中查找两个向量之间的部分匹配字符串 的相关文章

随机推荐