背景
我有一个包含大约1M行文本的数据框。我想替换TM包无法处理的大量自定义停用词。该列表由~37K字组成。我有以下代码,它需要一段时间,但我想用apply函数改进代码。
问题
我不知道如何在适用的应用功能中使用来自两个数据帧的内容。这是我的代码:
stopwords <- read.table("stopwords.csv", header=TRUE, quote="\"", stringsAsFactors=FALSE)
corpus <- read.delim("corpus.txt", header=TRUE, stringsAsFactors=FALSE)
for(i in 1:nrow(stopwords)){
corpus$text <- gsub(paste("\\<",stopwords$list[i],"\\>", sep=""), "", corpus$text)
message(paste(i, stopwords$list[i], sep=" - ")) #Show in console
}
我还在控制台中显示当前计数/单词以跟踪进度,但是一旦我有一个应用函数工作,我将把它包装在pbapply包中以获得正确的进度条。
示例数据
语料库数据框 - 带有&#34; text&#34;的单列作为标题
警察世界采取行动果断的首要迈克贝尔德
警方行动地图影响交通区域实时交通nsw
委员scipione号人质未公开
nsw总理方式避免马丁地方意识到警惕
发生的想法心脏人质受影响的家庭
lindt cafe很棒的勇敢的战士真主ikea dickhead
警方建议公民业务避免市场
停用词数据框 - 带有&#34;列表&#34;的单列作为标题。
AAA
AAAA
aaaaaaand
aaaaand
aaaargh
aaack
aaahh
aaahhhh
aaalll
AAAND
aaarse
亚琛
aadityanath
答案 0 :(得分:1)
您可以尝试以下矢量化方法:
# create a string of stopwords wrapped in `\\<` and `\\>`
x <- paste(paste0("\\<", stopwords$list, "\\>"), collapse = "|")
# use x to replace the words using gsub
corpus$text <- gsub(x, "", corpus$text)
(在没有可重复的例子的情况下未进行测试)
说明paste和paste0的工作原理:
> ( stopwords <- letters[1:5] )
#[1] "a" "b" "c" "d" "e"
paste(paste0("\\<", stopwords, "\\>"), collapse = "|")
#[1] "\\<a\\>|\\<b\\>|\\<c\\>|\\<d\\>|\\<e\\>"
在gsub
中使用此功能将替换任何|用“”分隔停用词而不循环。从本质上讲,它会创建一个包含所有停用词的字符串,每个停用词包含在\\<
和\\>
中,因为它们由逻辑OR(在R中为|
)分隔。