如何基于topicmodels包自动移除语料中跨主题高频无意义词汇?
自动识别并移除跨主题高频共有词汇的实现方法
核心思路
先提取各主题指定数量的Top词汇,找出所有主题的共有词汇,再从文档-词矩阵(DTM)中剔除这些词汇,最后重新训练LDA模型。以下是具体的R代码实现:
步骤1:提取各主题的前20个词汇
用terms()函数提取每个主题的前20个词汇,转换为列表便于后续处理:
# 提取每个主题的前20个词汇 top_terms_per_topic <- lapply(1:3, function(topic) { terms(model, 20)[, topic] })
步骤2:找出所有主题共有的词汇
通过Reduce()结合intersect计算所有主题Top词汇的交集:
# 计算跨主题共有的词汇 shared_terms <- Reduce(intersect, top_terms_per_topic) # 查看结果(可选) print(shared_terms)
步骤3:从DTM中移除共有词汇
假设dat_dtm是tm包的DocumentTermMatrix对象,直接过滤目标词汇:
# 过滤DTM,移除共有词汇 dat_dtm_filtered <- dat_dtm[, !colnames(dat_dtm) %in% shared_terms] # 可选:移除过滤后无词汇的空文档 dat_dtm_filtered <- dat_dtm_filtered[rowSums(as.matrix(dat_dtm_filtered)) > 0, ]
步骤4:重新训练LDA模型
用过滤后的DTM重新训练模型:
# 重新训练LDA模型 model_filtered <- LDA(dat_dtm_filtered, method = "VEM", k = 3, control = list(alpha = 0.1)) # 查看新模型的Top词汇 terms(model_filtered, 5)
额外说明
- 若使用
quanteda包的DTM对象,可改用dfm_select()函数排除shared_terms,逻辑一致。 - 可根据分析需求调整提取Top词汇的数量(比如将20改为其他数值),平衡词汇覆盖度与计算效率。
- 若没有跨主题共有词汇,
shared_terms会是空向量,此时过滤后的DTM与原DTM一致,无需额外处理。
内容的提问来源于stack exchange,提问作者Jonnytheriver
相关产品推荐
相关产品推荐

