1

我正在尝试使用 R 中 topicmodels 包中的 LDA 模型。我需要测量方法的不稳定性,因此我从 Dirichlet 分布中生成了 w = 3000 个单词、t = 8 个主题和 d = 50 个文档的真实参数,其中大约 60 个单词每一个:

Theta = t(rdirichlet(d, alpha))

Phi = t(rdirichlet(t, beta))

docs = matrix(0, nrow = d, ncol = w)

for (i in 1:d)  {   
    curn = rnorm(1, mean = 60, sd = 10)    
    for (j in 1:curn)   {
        curt = rdiscrete(1, Theta[,d], 1:t)
        curw = rdiscrete(1, Phi[,curt], 1:w)
        docs[i, curw] = docs[i, curw] + 1
        }
    }

所以我的 docs 矩阵是一个稀疏矩阵 d * w,几乎所有元素都是 0 或 1。

然后我需要我的文档矩阵成为 DocumentTermMatrix 类的对象,以便在 topicmodels:lda() 中使用它:

docs = as.DocumentTermMatrix(docs, weighting = weightTf)

我需要使用吉布斯采样方法,所以我写

ldafitmodel <- lda(docs, t, method = "Gibbs")

然后我得到:

lda.default(docs, t, method = "Gibbs") 中的错误:nrow(x) 和 length(grouping) 不同

我猜这个 topicmodels 包使用 MASS 包,但是这个分组参数是我无法明确控制的,可以吗?或者我对我的数据做错了什么?

请帮我!

BR,玛丽亚

4

1 回答 1

4

您的确切问题无法重现,因为您没有定义 d、t、w、alpha 或 beta,并且没有为您的rdirichlet()rdiscrete()函数调用加载适当的包。但是,我很确定您的问题是调用lda()MASS 包中的函数 - 这是用于线性判别分析,而不是潜在的狄利克雷分配 - 而不是LDA()topicmodels 包中的函数。R 区分大小写,因此这些大写字母会有所不同。另请注意,如果您认为您将来可能会遇到类似的问题,但对象具有完全相同的名称,那么您可以通过 :: 形式的命名空间指定您想要的确切对象,例如topicmodels::LDA().

无论如何,我无法重现您的示例,但我认为此示例应该说明您的错误和可行的解决方案。

> library(topicmodels)
> data(AssociatedPress)
> docs = AssociatedPress[1:100]
> ldafitmodel <- lda(docs, 4, method = "Gibbs")
Error in lda.default(docs, 4, method = "Gibbs") : 
  nrow(x) and length(grouping) are different
> (ldafitmodel <- LDA(docs, 4, method = "Gibbs"))
A LDA_Gibbs topic model with 4 topics. 
于 2013-04-20T13:13:40.707 回答