使用step_tokenfilter函数时R会话崩溃问题求助
解决tidymodels中step_tokenfilter导致R会话崩溃的问题
先复现你遇到的崩溃场景:
library(tidymodels) library(textrecipes) # 含特殊字符的测试数据 text_data <- tibble( text = c("Hello! @#$%^&*()_+", "World~`{}[]|\\:;\"'<>,.?/", "Test text with 特殊字符"), label = factor(c("a", "b", "a")) ) # 触发崩溃的预处理流程 text_rec <- recipe(label ~ text, data = text_data) %>% step_tokenize(text) %>% step_tokenfilter(text, max_tokens = 10) %>% step_tf(text) # 调用prep会导致R会话崩溃 prep(text_rec)
以下是几个可行的解决方法:
提前清理特殊字符
在分词前过滤掉非文字/数字的特殊符号,避免生成异常token导致崩溃:text_rec <- recipe(label ~ text, data = text_data) %>% step_mutate(text = stringr::str_replace_all(text, "[^\\w\\s]", " ")) %>% step_mutate(text = stringr::str_squish(text)) %>% step_tokenize(text) %>% step_tokenfilter(text, max_tokens = 10) %>% step_tf(text) prep(text_rec) # 可正常运行更换分词引擎
默认分词器对特殊字符兼容性差,换成spacyr或其他引擎(需提前安装对应依赖):# 先安装并初始化spacyr # install.packages("spacyr") # spacyr::spacy_install() # spacyr::spacy_initialize() text_rec <- recipe(label ~ text, data = text_data) %>% step_tokenize(text, engine = "spacyr") %>% step_tokenfilter(text, max_tokens = 10) %>% step_tf(text) prep(text_rec)升级相关包
该问题大概率是旧版本包的bug,更新tidymodels生态的核心包:update.packages(c("tidymodels", "textrecipes", "tokenizers", "dplyr"))更新后重新测试原代码,多数版本兼容问题会被修复。
手动指定保留的token
绕过step_tokenfilter的自动逻辑,先手动筛选高频token再传入:# 提前提取高频token token_counts <- text_data %>% mutate(tokens = map(text, ~ tokenizers::tokenize_words(.)[[1]])) %>% unnest(tokens) %>% count(tokens, sort = TRUE) %>% top_n(10) %>% pull(tokens) # 在recipe中只保留筛选后的token text_rec <- recipe(label ~ text, data = text_data) %>% step_tokenize(text) %>% step_tokenfilter(text, keep_tokens = token_counts) %>% step_tf(text) prep(text_rec)
内容的提问来源于stack exchange,提问作者saxonryan
相关产品推荐
相关产品推荐

