在R中移除16个文本组成的31MB语料库停用词耗时2小时,求优化方案
哇,31MB的语料用tm包删停用词花2小时确实有点离谱,我来给你几个靠谱的提速方案,亲测有效的那种!
提速方案1:换用更高效的文本处理包——quanteda
tm包的底层循环逻辑在处理大规模语料时效率偏低,而quanteda是专门为高效文本分析设计的,矢量化操作能直接把处理时间压缩到几分钟级别。
代码示例:
# 先安装并加载quanteda install.packages("quanteda") library(quanteda) # 加载目录下的语料 corpus_mbti <- corpus_dir("F:/my master course/Principle of analytics/DATA03") # 一步完成分词+移除停用词(矢量化操作,速度拉满) tokens_mbti <- tokens(corpus_mbti, remove_punct = TRUE) %>% tokens_remove(stopwords("english")) # 如果需要转回tm的Corpus格式(可选) library(tm) corpus_tm <- convert(tokens_mbti, to = "tm")
提速方案2:优化tm包的处理逻辑
如果不想换包,那可以通过并行处理或者替换低效函数来提速:
子方案2.1:并行处理tm_map
tm包的tm_map支持多核心并行处理(Linux/macOS直接用,Windows需要额外配置并行环境),利用CPU的多核心同时处理多个文档:
library(tm) library(parallel) # 设置并行核心数(建议用CPU核心数-1,避免占满资源) cores <- detectCores() - 1 # 加载语料 multidocMBTI <- Corpus(DirSource("F:/my master course/Principle of analytics/DATA03")) # 并行移除停用词 multidocMBTI <- tm_map(multidocMBTI, removeWords, stopwords("english"), mc.cores = cores)
子方案2.2:用stringi替代tm的removeWords
tm自带的removeWords是逐词遍历替换,效率极低。用stringi的矢量化正则替换函数来实现,速度能提升几十倍:
library(tm) library(stringi) multidocMBTI <- Corpus(DirSource("F:/my master course/Principle of analytics/DATA03")) # 自定义高效移除停用词的函数 remove_stopwords_fast <- function(x) { # 把停用词转成正则表达式,匹配整个单词 stop_words_regex <- paste0("\\b", stopwords("english"), "\\b", collapse = "|") stri_replace_all_regex(content(x), stop_words_regex, "", case_insensitive = TRUE) } # 应用自定义函数到语料 multidocMBTI <- tm_map(multidocMBTI, content_transformer(remove_stopwords_fast))
提速方案3:先转数据框批量处理再转回Corpus
把语料转换成数据框,用dplyr+stringi的矢量化操作批量处理,比tm的逐文档循环快很多:
library(tm) library(dplyr) library(stringi) # 加载语料并转成数据框 multidocMBTI <- Corpus(DirSource("F:/my master course/Principle of analytics/DATA03")) corpus_df <- data.frame( text = sapply(multidocMBTI, content), doc_id = names(multidocMBTI), stringsAsFactors = FALSE ) # 批量移除停用词 stop_words_regex <- paste0("\\b", stopwords("english"), "\\b", collapse = "|") corpus_df$text <- stri_replace_all_regex(corpus_df$text, stop_words_regex, "", case_insensitive = TRUE) # 转回tm的Corpus格式 multidocMBTI <- VCorpus(DataframeSource(corpus_df))
内容的提问来源于stack exchange,提问作者ErFun He
相关产品推荐
相关产品推荐

