基于词表的文本分析中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
相关产品推荐
相关产品推荐

