代码之家  ›  专栏  ›  技术社区  ›  Shubh

如何在R中进行近似匹配并替换为正确的单词?

  •  0
  • Shubh  · 技术社区  · 8 年前
    list1 <- c("prmum","prum","primium","prm","prim","primum","prem","premum",
               "wrng","wng",
               "hug","hung",
               "amut",
               "chq","chquked","cheuq","chek","cheq",
               "cus","cust",
               "cbk","cb",
               "ringirng","rining","rigirigi")
    
    
    list2 <- c("premium","wrong","hang","amount","cheque","customer","callback","ringing")
    dat <- as.data.frame(list1)
    for(i in length(list1)){
    t <- agrep(list1[i],list2,value=FALSE)
     dat[t] <- list2[i]
    }
    

    我有两个列表,一个有错误的单词,另一个有正确的单词。 我正在尝试执行以下操作:

    1) 记下第一个单词。
    2) 从正确的单词列表中进行近似匹配并获取索引位置。
    3) 在该特定位置用正确的单词替换错误的单词 在数据帧或列表中。

    1 回复  |  直到 6 年前
        1
  •  0
  •   AshOfFire    8 年前

    您可以使用 stringdistmatrix 来自程序包 stringdist .它像agrep一样使用Levenshtein距离。找到最匹配的单词,并将其替换到原始列表中。

     library(stringdist)
     dist_mat <- stringdistmatrix(list1, list2)
     clean_list1 <- list2[apply(dist_mat, 1, which.min)]
     clean_list1
    

    现在,如果您有很长的列表(假设它们的长度为l1和l2,您将得到大小为l1*l2的矩阵),那么这种解决方案可能不合适。您可能需要进行循环以减少内存消耗。

    clean_list1 <- list1
    for (i in length(list1)){
         dist_vect <- stringdistmatrix(list1[i],list2)
         clean_list1 <- list2[which.min(dist_vect)]
    }