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

时间:2019-02-06 18:17:43

标签: r

我正在使用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)我没有得到纠正内存不足错误的方法。

  • 我还尝试了本文中给出的解决方案:Find matching strings between two vectors in R,但我无法实现(错误消息:错误:断言'tree-> num_tags == num_tags'在执行正则表达式时失败:文件'tre- compile.c',第634行。我找不到它的来源。)

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

1 个答案:

答案 0 :(得分:0)

我将使用软件包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

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

一旦有了此矩阵,您就可以确定对您来说“足够接近”的元素,然后仅选择那些元素。您还可以使用参数cost进行操作,该参数允许您为插入,删除或替换提供不同的成本。

您可能想了解更多有关此的信息:

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

希望有帮助。