LDA主题流行度计算脚本报错求助:$运算符不适用于此S4类
解决LDA脚本中
$ operator not defined for this S4 class错误 错误原因
你通过topicmodels包的LDA()生成的res是S4类对象,这类对象不能用$符号访问内部元素(比如主题概率矩阵theta),必须用@符号。而你调用的make.dt()函数内部大概率使用了model$theta这种错误的访问方式,导致触发报错。
解决方案
放弃依赖make.dt(),手动提取主题概率并与元数据合并,具体修改后的脚本如下:
修改后的完整脚本
library(topicmodels) library(tidyverse) lda_dtm <- cast_dtm(data = gruppierte_texte, document = "id", term = "lemma", value = "anzahl") Themen <- seq(5,50,5) # 初始化空数据框,用于存储所有主题数下的结果 praevalenzen_gesamt <- tibble() for(k in Themen){ print(paste("aktuell bei Thema:", k)) set.seed(42) res <- LDA(x = lda_dtm, k = k) # 1. 提取主题-文档概率矩阵(S4对象用@访问内部元素) theta_matrix <- res@theta colnames(theta_matrix) <- paste0("Topic_", 1:k) theta_df <- as_tibble(theta_matrix) %>% mutate(id = rownames(lda_dtm)) # 2. 与元数据合并,整理成目标格式 praevalenzen_mit_metadaten <- theta_df %>% left_join(corpus$meta, by = "id") %>% gather("Topic", "praevalenz", starts_with("Topic_")) %>% mutate(K = k) %>% select(K, Topic, praevalenz, artist, title, record.name, lyrics, year) # 3. 将当前主题数的结果追加到总数据框中 praevalenzen_gesamt <- bind_rows(praevalenzen_gesamt, praevalenzen_mit_metadaten) }
关键修改说明
- 用
res@theta替代错误的model$theta,正确访问S4对象的主题概率矩阵 - 手动构建主题概率数据框,避免依赖兼容性存疑的
make.dt()函数 - 新增初始化的总数据框
praevalenzen_gesamt,解决原脚本循环中覆盖结果的问题(原脚本最终仅保留最后一次循环的k=50数据)
内容的提问来源于stack exchange,提问作者anna1712
相关产品推荐
相关产品推荐

