【问题标题】:Making gsub only replace entire words?让 gsub 只替换整个单词?
【发布时间】:2014-05-18 07:01:42
【问题描述】:

(我正在使用 R。)对于称为“goodwords.corpus”的单词列表,我正在遍历语料库中的文档,并将列表“goodwords.corpus”中的每个单词替换为单词 + 一个数字。

例如,如果“good”一词在列表中,而“goodnight”不在列表中,则此文档:

I am having a good time goodnight

会变成:

I am having a good 1234 time goodnight

**我正在使用此代码(编辑-使其可重现):

goodwords.corpus <- c("good")
test <- "I am having a good time goodnight"
for (i in 1:length(goodwords.corpus)){
test <-gsub(goodwords.corpus[[i]], paste(goodwords.corpus[[i]], "1234"), test)
}

但是,问题是我希望 gsub 只替换整个单词。出现的问题是:“good”在“goodwords.corpus”列表中,但是不在列表中的“goodnight”也受到影响。所以我明白了:

I am having a good 1234 time good 1234night

无论如何我可以告诉 gsub 只替换整个单词,而不是可能是其他单词一部分的单词吗?

我想用这个:

test <-gsub("\\<goodwords.corpus[[i]]\\>", paste(goodwords.corpus[[i]], "1234"), test)
}

我读过 \ 会告诉 gsub 只查找整个单词。但显然这不起作用,因为 goodwords.corpus[[i]] 在引号中时不起作用。

有什么建议吗?

【问题讨论】:

  • 请让您的示例可重现:stackoverflow.com/questions/5963269/…
  • 是的。请做。你在这里有机会。 GG 是公认的正则表达式解决方案大师。
  • 刚刚用可重现的代码编辑了原始帖子。非常感谢!!

标签: r gsub topic-modeling


【解决方案1】:

如此接近得到这个。您已经在使用paste 来形成替换字符串,为什么不使用它来形成模式字符串?

goodwords.corpus <- c("good")
test <- "I am having a good time goodnight"
for (i in 1:length(goodwords.corpus)){
    test <-gsub(paste0('\\<', goodwords.corpus[[i]], '\\>'), paste(goodwords.corpus[[i]], "1234"), test)
}
test
# [1] "I am having a good 1234 time goodnight"

paste0 只是paste(..., sep='')。)

(我和@MatthewLundberg同时发布了这个,他也是正确的。我实际上更熟悉使用\b\&lt;,但我想我会继续使用你的代码。)

【讨论】:

    【解决方案2】:

    使用\b 表示单词边界:

    > text <- "good night goodnight"
    > gsub("\\bgood\\b", paste("good", 1234), text)
    [1] "good 1234 night goodnight"
    

    在你的循环中,像这样:

    for (word in goodwords.corpus){
      patt <- paste0('\\b', word, '\\b')
      repl <- paste(word, "1234")
    
      test <-gsub(patt, repl, test)
    }
    

    【讨论】:

      猜你喜欢
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 2014-12-22
      相关资源
      最近更新 更多