R语言使用gsub移除停用词时出现tre-compile.c正则错误如何解决?
错误原因
你遇到的报错是R内置的默认TRE正则引擎无法处理超长多分支匹配正则导致的解析失败:你拼接的停用词正则包含数百个分支且存在大量重复内容,超出了TRE引擎的解析长度限制。
解决方案
方案1:更换正则引擎(修改成本最低)
开启PCRE正则引擎即可兼容长正则匹配,同时你当前代码中不需要用lapply遍历,gsub本身支持向量化处理整列字符串,另外先对停用词去重可以大幅缩短正则长度,修改后的代码如下:
# 先对停用词去重,避免冗余内容增加正则长度 unique_stopwords <- unique(stop_words$word) sw <- paste0("\\b(", paste0(unique_stopwords, collapse="|"), ")\\b") # 增加perl=TRUE参数启用PCRE引擎,直接向量化处理整列 dat1$Comments <- gsub(pattern=sw, replacement=" ", x=dat1$Comments, perl = TRUE)
方案2:改用无正则的停用词过滤逻辑(稳定性最高)
你后续本来就要用tidytext做分词统计,直接先拆词再过滤停用词可以完全避开正则限制,逻辑更稳定:
library(dplyr) library(tidytext) # 先拆分单词、过滤停用词,再按行拼接回字符串 dat_clean <- dat1 %>% mutate(row_id = row_number()) %>% unnest_tokens(word, Comments) %>% anti_join(stop_words, by = "word") %>% group_by(row_id) %>% summarise(Comments = paste(word, collapse = " ")) %>% ungroup() # 后续用dat_clean做高频短语统计即可 top_phrases <- dat_clean %>% unnest_tokens(bigram, Comments, 'ngrams', n = 2, to_lower = TRUE) %>% # n值替换为你需要的短语长度 count(bigram, sort = TRUE)
其他代码优化建议
- 你原有移除空格的逻辑存在冗余:
trimws已经可以直接移除字符串首尾的空格,不需要再执行第二行的首尾空格替换。 unnest_tokens参数中的Length需要替换为你实际需要的短语长度数值,比如统计二元短语填n=2、三元短语填n=3,如果未提前定义Length变量会触发额外报错。
内容的提问来源于stack exchange,提问作者Victor Gatica
相关产品推荐
相关产品推荐

