【问题标题】:Find partial matching strings between two vectors in R在 R 中查找两个向量之间的部分匹配字符串
【发布时间】:2019-02-06 18:17:43
【问题描述】:

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

第一个,owner,包含大约 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"     

我想知道 proprietor 的哪些元素也在 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 错误:'Out of memory'”。我从 R 开始,所以 1)我可以看到这个循环不是最简单的方法 2)我不知道如何纠正这个内存不足错误。

  • 我也尝试了这篇文章中给出的解决方案:Find matching strings between two vectors in R,但我无法实现它(错误消息:错误:断言 'tree->num_tags == num_tags' failed in execution regexp: file 'tre-compile. c',第 634 行。我找不到它的来源。)

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

【问题讨论】:

    标签: r


    【解决方案1】:

    我会使用 stringdist 包中的函数 adist

    最小的工作示例:

    创建一个无义词向量并调用向量a:

    a &lt;- c("gkhk", "ololsol", "tyuil", "tyuio", "etytyuli")

    修改一些词(或多或少的修改)并将那个向量称为b:

    b &lt;- c("gwrwkhk", "olseotyuioplsol", "thsyuil", "tasyuio", "etytyuli")

    然后计算元素之间的距离

    yourdistance &lt;- 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。

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

    您可能想在以下网址了解更多信息:

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

    希望对你有帮助。

    【讨论】:

    • 效果很好,非常感谢!!对于链接,我也很感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 2011-05-15
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多