You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:53:15