使用R语言tm包清洗语料后停用词'the'仍残留,求解析removeWords逻辑
为什么
tm包的removeWords没法彻底清除所有"the"实例? 我来帮你拆解这个问题,核心是文本预处理的顺序和操作生效性出了问题,咱们一步步捋清楚:
首先看你最初代码里的关键错误
你写了这行代码:
tm_map(shakespeare, content_transformer(tolower)) #taken directly from tm documentation
但你没有把结果赋值回shakespeare!也就是说,这行代码根本没改变你的语料库——文本里依然保留着大写的The、THE这些变体,而removeWords默认是精确匹配小写的"the",所以这些大写的实例自然不会被移除。
加上你后续的处理顺序是先做词干提取、再移除标点,这又导致了另一个问题:比如文本里的the,、the.这种带标点的"the",因为还没移除标点,removeWords识别不出这是"the",所以也会残留。
调整顺序后还剩残留的原因
你把removeWords移到第一步并加了"The",虽然解决了部分大小写问题,但还是没处理带标点的"the"——比如the’、the-这类和特殊字符粘连的情况,此时removeWords依然没法匹配。另外,stopwords("english")本身已经包含"the",你额外加"the"、"The"其实有点冗余,但没覆盖所有大小写变体(比如"THE")。
彻底解决的方案:修正预处理顺序 + 确保操作生效
正确的文本预处理流程应该遵循「先统一格式,再清理杂质,最后处理词汇」的逻辑,给你调整后的代码:
library(RCurl) library(tm) # 获取语料 url <- "https://raw.githubusercontent.com/angerhang/statsTutorial/master/src/textMining/data/1.txt" file1 <- getURL(url) url <- "https://raw.githubusercontent.com/angerhang/statsTutorial/master/src/textMining/data/2.txt" file2 <- getURL(url) url <- "https://raw.githubusercontent.com/angerhang/statsTutorial/master/src/textMining/data/3.txt" file3 <- getURL(url) shakespeare <- VCorpus(VectorSource(c(file1,file2,file3))) # 正确的预处理步骤:顺序不能乱! shakespeare <- tm_map(shakespeare, content_transformer(tolower)) # 1. 先统一转小写,必须赋值! shakespeare <- tm_map(shakespeare, removePunctuation, preserve_intra_word_dashes = FALSE) # 2. 移除标点,包括连字符 shakespeare <- tm_map(shakespeare, stripWhitespace) # 3. 清理多余空白,让单词边界清晰 shakespeare <- tm_map(shakespeare, removeWords, stopwords("english")) # 4. 移除停用词(已经包含"the") shakespeare <- tm_map(shakespeare, stemDocument) # 5. 词干提取放最后,避免干扰停用词匹配 # 检查结果 result <- inspect(DocumentTermMatrix(shakespeare, list(dictionary = c("the","thee")))) print(result)
要是还有极少量残留怎么办?
如果还是有零星的"the"没被清掉,大概率是文本里有特殊字符伪装的"the"(比如全角的the、带隐藏空格的t h e),这时候可以用正则表达式强制匹配所有变体:
# 用正则移除所有大小写的"the",只匹配独立单词(不会误删"there"里的"the") shakespeare <- tm_map(shakespeare, content_transformer(function(x) { gsub("\\b(the)\\b", "", x, ignore.case = TRUE) }))
这里\\b代表单词边界,ignore.case=TRUE忽略大小写,能覆盖所有单独出现的"the"变体。
内容的提问来源于stack exchange,提问作者MPJ567




