tm包0.7版本DocumentTermMatrix不保留词内连字符问题咨询
解决tm包0.7+版本中DocumentTermMatrix丢失词内连字符的问题
首先明确:这不是bug,是tm包0.7版本后对默认文本预处理流程的调整。0.6-2版本里,默认设置会自动保留词内连字符,但0.7+版本的默认分词逻辑把连字符当成了分隔符,而且你之前尝试的preserve_intra_word_dashes只作用于标点移除环节,没触碰到核心的分词问题,所以没效果。
下面给你两个可行的解决方案:
方案1:显式指定分词器并配置标点保留参数
直接在DocumentTermMatrix的控制参数里,指定使用scan_tokenizer(这个分词器会保留带连字符的完整单词),同时配合removePunctuation的保留参数:
# 加载tm 0.7+版本 library("tm", lib.loc="~/R/x86_64-pc-linux-gnu-library/3.3/tm_0.7-3") # 重新创建语料库(卸载包后需重新生成) myCorpus <- Corpus(VectorSource(two_strings)) # 配置控制参数生成正确的DocumentTermMatrix dtm_fixed <- DocumentTermMatrix(myCorpus, control = list( tokenize = scan_tokenizer, removePunctuation = list(preserve_intra_word_dashes = TRUE) )) # 查看结果,连字符已被保留 inspect(dtm_fixed)
方案2:自定义预处理管道
如果需要更灵活的文本处理控制,可以先自定义预处理函数,确保每一步都保留连字符,再生成矩阵:
myCorpus <- Corpus(VectorSource(two_strings)) # 自定义预处理:先保留连字符移除其他标点,再用指定分词器 myCorpus <- tm_map(myCorpus, content_transformer(function(text) { # 移除标点但保留词内连字符 cleaned_text <- removePunctuation(text, preserve_intra_word_dashes = TRUE) return(cleaned_text) })) # 生成矩阵时指定分词器 dtm_fixed <- DocumentTermMatrix(myCorpus, control = list(tokenize = scan_tokenizer)) inspect(dtm_fixed)
补充说明版本变更背景
tm包0.7版本重构了文本处理的底层逻辑,默认采用的MC_tokenizer会把连字符视为单词分隔符,这是为了适配更通用的文本挖掘场景,但牺牲了向下兼容性。你可以查看tm包的更新日志,里面明确提到了这个行为变更——要恢复0.6-2版本的保留连字符行为,必须显式指定分词器和标点保留参数。
内容的提问来源于stack exchange,提问作者lportina
相关产品推荐
相关产品推荐

