制作gsub只能取代整个单词?

use*_*557 10 r gsub topic-modeling

(我正在使用R.)对于一个名为"goodwords.corpus"的单词列表,我循环遍历语料库中的文档,并将单词"goodwords.corpus"中的每个单词替换为单词+ a数.

因此,例如,如果列表中包含"good"一词,并且列表中没有"晚安",则此文档:

I am having a good time goodnight
Run Code Online (Sandbox Code Playgroud)

会变成:

I am having a good 1234 time goodnight
Run Code Online (Sandbox Code Playgroud)

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

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)
}
Run Code Online (Sandbox Code Playgroud)

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

I am having a good 1234 time good 1234night
Run Code Online (Sandbox Code Playgroud)

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

我想用这个:

test <-gsub("\\<goodwords.corpus[[i]]\\>", paste(goodwords.corpus[[i]], "1234"), test)
}
Run Code Online (Sandbox Code Playgroud)

我读过\ <和\>会告诉gsub只查找整个单词.但显然这不起作用,因为当引用时,goodwords.corpus [[i]]将不起作用.

有什么建议?

Mat*_*erg 13

使用\b指示字边界:

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

在你的循环中,这样的事情:

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

  test <-gsub(patt, repl, test)
}
Run Code Online (Sandbox Code Playgroud)


r2e*_*ans 8

你是如此接近这个.您已经在使用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"
Run Code Online (Sandbox Code Playgroud)

(paste0仅仅是paste(..., sep='').)

(我在@MatthewLundberg的同时发布了这个帖子,他也是正确的.我实际上更熟悉使用\b恶习\<,但我想我会继续使用你的代码.)