代码之家  ›  专栏  ›  技术社区  ›  Max TC

在R中匹配并替换字符串中拼写错误的单词

  •  1
  • Max TC  · 技术社区  · 7 年前

    我有一个短语列表,其中我想用一个类似的单词替换某些单词,以防拼写错误。

    library(stringr)
    a4 <- "I would like a cheseburger and friees please"
    badwords.corpus <- c("cheseburger", "friees")
    goodwords.corpus <- c("cheeseburger", "fries")
    
    vect.corpus <- goodwords.corpus
    names(vect.corpus) <- badwords.corpus
    
    str_replace_all(a4, vect.corpus)
    # [1] "I would like a cheeseburger and fries please"
    

    一切都很完美,直到它找到一个相似的字符串,并用另一个单词替换它

    如果我有如下模式:

    "plea" ,正确的是 "please" ,但当我执行时,它会将其删除并替换为 "pleased" .

    我要寻找的是,如果一个字符串已经正确,它将不再被修改,以防它找到类似的模式。

    2 回复  |  直到 7 年前
        1
  •  1
  •   MKR    7 年前

    也许您需要执行渐进式替换。e、 g.您应该有多套 badwords goodwords . 首次替换为 坏话 有更多的字母,这样匹配的模式就找不到了,然后再去找更小的。

    根据您提供的列表,我将创建两个集,如下所示:

    goodwords1<-c( "three", "teasing") 
    badwords1<- c("thre", "teeasing") 
    
    goodwords2<-c("tree", "testing") 
    badwords2<- c("tre", "tesing") 
    

    首先更换第一套,然后更换第二套。您可以创建许多这样的集合。

        2
  •  0
  •   acylam    7 年前

    str_replace_all 将regex作为模式,因此您可以 paste0 单词边界 \\b 围绕每个 badwords 因此,只有当整个单词匹配时,才会进行替换:

    library(stringr)
    string <- c("tre", "tree", "teeasing", "tesing") 
    goodwords <- c("tree", "three", "teasing", "testing") 
    badwords <- c("tre", "thre", "teeasing", "tesing") 
    
    # Paste word boundaries around badwords
    badwords <- paste0("\\b", badwords, "\\b")
    
    vect.corpus <- goodwords 
    names(vect.corpus) <- badwords 
    
    str_replace_all(string, vect.corpus) 
    [1] "tree"    "tree"    "teasing" "testing"
    

    这样做的好处是,您不必跟踪哪些字符串是较长的字符串。

    这是什么 坏话 粘贴后看起来像:

    > badwords
    [1] "\\btre\\b"      "\\bthre\\b"     "\\bteeasing\\b" "\\btesing\\b"