相对剪枝/词删除导致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
相关产品推荐
相关产品推荐

