如何从tm包生成的Corpus中移除list()相关冗余内容?
问题解决思路
为啥会出现这些奇怪词汇?
你碰到的list(language = "portuguese")、list()和带.txt的文件名,根本原因是你把整个Corpus对象的结构信息当成文本内容处理了。直接用as.character(docs)会把Corpus的框架(包括你设置的readerControl参数、文档ID也就是文件名)都转成字符串,这些无关内容自然就混进文本里了。
怎么改?
1. 先正确提取文档的纯内容
别直接转整个Corpus,用sapply把每个文档的实际文本抽出来:
# 只提取每个文档里的纯文本,忽略元数据 docs_content <- sapply(docs, function(x) x$content)
2. 再做词干提取
把抽出来的纯文本传给ptstem:
docs_stemmed <- ptstem(docs_content, algorithm = "rslp")
3. 补个保险:提前清掉无关词
如果还有漏网的list、language这类词,在预处理阶段加一步移除:
# 放在移除停用词之后 docs <- tm_map(docs, removeWords, c("list", "language", "portuguese", "txt"))
完整修正后的代码
library(tm) library(magrittr) library(Rstem) docs <- Corpus(DirSource("FILE PATH"), readerControl = list(language = "portuguese")) toSpace <- content_transformer(function(x, pattern) { return (gsub(pattern, " ", x))}) docs <- tm_map(docs, toSpace, "-") docs <- tm_map(docs, toSpace, ":") docs <- tm_map(docs, toSpace, "'") docs <- tm_map(docs, toSpace, " -") removeSpecialChars <- function(x) gsub('[[:punct:]]',"",x) docs <- tm_map(docs, removeSpecialChars) docs %<>% tm_map(removePunctuation) %>% tm_map(content_transformer(tolower)) %>% tm_map(removeNumbers) %>% tm_map(removeWords, stopwords("portuguese")) %>% # 新增移除无关词汇 tm_map(removeWords, c("list", "language", "portuguese", "txt")) %>% tm_map(stripWhitespace) docs %<>% tm_map(content_transformer(gsub), pattern = "WORD1", replacement = " WORD2 ") %>% tm_map(content_transformer(gsub), pattern = "WORD 3 WORD4", replacement = " WORD5 ") %>% tm_map(stripWhitespace) # 正确提取纯文本内容 docs_content <- sapply(docs, function(x) x$content) # 执行词干提取 docs_stemmed <- ptstem(docs_content, algorithm = "rslp")
额外提醒
要是之后要生成DTM,直接用处理好的docs Corpus对象就行,不用转成字符:
dtm <- DocumentTermMatrix(docs)
内容的提问来源于stack exchange,提问作者Carla
相关产品推荐
相关产品推荐

