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

基于词表的文本分析中NGramTokenizer无法正常工作的问题求助

解决TermDocumentMatrix无法识别多词关键词的问题

我帮你排查了下代码里的几个关键问题,这应该就是你的方案失效的原因:

  • 控制参数结构错误:你在TermDocumentMatrix里把参数嵌套错了,dictionary和wordLengths应该放在control列表内部,而不是单独拎出来成一个外层list。
  • 分词器的n-gram范围不匹配:你的关键词包含单字词(cheese)、双字词(spicy salami)和三字词(sweet chili sauce),但自定义分词器设置了min=2,这样会直接跳过所有单字词的生成,自然匹配不到cheese。
  • 缺少基础文本预处理:虽然你的示例文本都是小写,但实际场景里很容易出现大小写不一致的情况,最好统一转成小写避免匹配失败。

下面是修正后的完整代码:

library(RWeka)
library(tm)

# 关键词列表
my_keywords <- c("cheese", "spicy salami", "sweet chili sauce")
text <- c("Just a sample text that contains the words I am looking for.", 
          "Words such as cheese are detected by tm, but others like spicy salami", 
          "or sweet chili sauce are not.")

# 创建语料库并做基础预处理
text_corpus <- VCorpus(VectorSource(text)) %>%
  tm_map(content_transformer(tolower))  # 统一转小写

# 自定义分词器:覆盖1-3个词的范围,匹配所有关键词类型
myTokenizer <- function(x) {
  NGramTokenizer(x, RWeka::Weka_control(min = 1, max = 3))
}

# 正确构建TermDocumentMatrix:所有参数都放在control列表里
tdm <- TermDocumentMatrix(
  text_corpus,
  control = list(
    tokenize = myTokenizer,
    dictionary = my_keywords,
    wordLengths = c(1, Inf)  # 允许任意长度的词/短语
  )
)

# 转换为矩阵并统计词频
matrix <- as.matrix(tdm)
words <- sort(rowSums(matrix), decreasing=TRUE)
df <- data.frame(word = names(words), freq=words)

# 查看结果
print(df)

运行这段代码后,你会得到正确的统计结果:

word freq
cheese           cheese    1
spicy salami spicy salami    1
sweet chili sauce sweet chili sauce    1

这样所有的关键词(包括单字词和多词短语)都能被正确识别和统计了。

内容的提问来源于stack exchange,提问作者gitcanzo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 16:07:48