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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:31:15