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

时间:2014-04-06 00:37:58

标签: r gsub topic-modeling

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

例如,如果单词" good"在列表上,"晚安"不在列表中,那么这个文件:

I am having a good time goodnight

会变成:

I am having a good 1234 time goodnight

**我使用此代码(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)
}

然而,问题是我希望gsub只替换整个单词。出现的问题是:&#34;好&#34;是在&#34; goodwords.corpus&#34;列表,然后&#34;晚安&#34;,不在列表中,也受到影响。所以我明白了:

I am having a good 1234 time good 1234night

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

我想用这个:

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

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

有什么建议吗?

2 个答案:

答案 0 :(得分:12)

使用\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)
}

答案 1 :(得分: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"

paste0仅为paste(..., sep='')。)

(我和@MatthewLundberg同时发布了这个帖子,他也是正确的。我实际上更熟悉使用\b \< {{1}},但我认为我是继续使用你的代码。)