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

相对剪枝/词删除导致Structural Topic Modeling报错的解决咨询

问题描述

我正在尝试使用Structural Topic Model(STM)分析YouTube评论的主题变化,在使用相对剪枝或手动删除词汇后运行模型时报错,不使用剪枝则能正常运行。

代码片段

tokens <- data_pr$content %>%
     tokens(what = "word",
     remove_punct = TRUE,
     remove_numbers = TRUE,
     remove_url = TRUE) 

# 应用相对剪枝
dfm <- dfm_trim(dfm(tokens), 
 min_docfreq = 0.02,
 max_docfreq = 0.99,
 docfreq_type = "prop", verbose = TRUE)

# 手动移除额外词汇
dfm = dfm_remove(dfm, c("d", "dass", "war", "haben", "sein", "mal", "gar" ))
dfm <- dfm_replace(dfm, "videos", "video" )

# 训练STM模型
model <- stm(documents = dfm_stm$documents,
         vocab = dfm_stm$vocab, 
         K = 6,
         prevalence = ~year,
         data = data_pr,
         verbose = TRUE)

报错信息

Error in stm(documents = dfm_stm$documents, vocab = dfm_stm$vocab, K = 10,  : 
 number of observations in content covariate (9913) prevalence covariate (9915) and documents    (9913) are not all equal.

报错原因是原始元数据data_pr的观测数与处理后的dfm文档数不一致,想知道解决方法,同时疑惑是否需要在创建dfm前预处理所有数据(但参考教程并未这么做)。


解决方法

1. 同步修剪元数据与dfm文档

dfm_trim会移除所有词汇都被修剪掉的空文档,导致dfm的文档数少于原始data_pr。必须同步修剪元数据,保证两者行数一致:

# 获取dfm中保留的文档名称/索引
keep_indices <- rownames(dfm)
# 修剪元数据,只保留dfm中存在的行
data_pr_trimmed <- data_pr[rownames(data_pr) %in% keep_indices, ]

# 将修剪后的dfm转换为STM格式,同时传入匹配的元数据
dfm_stm <- convert(dfm, to = "stm", docvars = data_pr_trimmed)

# 重新训练模型,使用修剪后的元数据
model <- stm(documents = dfm_stm$documents,
             vocab = dfm_stm$vocab, 
             K = 6,
             prevalence = ~year,
             data = data_pr_trimmed,
             verbose = TRUE)

2. 预处理阶段提前移除空文档

在创建dfm之前,先移除没有有效词汇的空tokens,避免后续剪枝产生空文档:

# 移除空tokens
tokens <- tokens[lengths(tokens) > 0]
# 同步修剪原始元数据(对应tokens的索引)
data_pr <- data_pr[seq_along(tokens), ]

# 再创建dfm并剪枝
dfm <- dfm(tokens) %>% 
  dfm_trim(min_docfreq = 0.02, max_docfreq = 0.99, docfreq_type = "prop")

3. 检查手动词汇移除后的空文档

手动移除词汇后,可能会出现新的空文档,需要再次检查并同步修剪:

# 检查dfm中的空文档
empty_docs <- which(rowSums(dfm) == 0)
if(length(empty_docs) > 0){
  dfm <- dfm[-empty_docs, ]
  data_pr <- data_pr[-empty_docs, ]
}

关于预处理的疑惑说明

参考教程未遇到该问题,大概率是因为其数据集在剪枝后没有丢失文档,或者教程省略了同步修剪元数据的步骤。实际处理中,必须保证STM输入的文档数、元数据行数、协变量观测数三者完全一致,所以剪枝或词汇移除操作后,一定要同步处理元数据,避免观测数不匹配的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 18:32:27