我是文本挖掘主题的入门者。当我在具有996165观测值的大型数据集上运行LDA()时,它显示以下错误:
LDA(dtm, k, method = "Gibbs", control = list(nstart = nstart, :输入矩阵的每一行至少需要包含一个非零条目。
我很确定我的语料库中没有缺失的值。"DocumentTermMatrix"和"simple_triplet_matrix"的表是:
table(is.na(dtm[[1]]))
#FALSE
#57100956
table(is.na(dtm[[2]]))
#FALSE
#57100956
有点困惑"57100956"是如何来的。但是由于我的数据集非常大,我不知道如何检查为什么会发生此错误。我的 LDA 命令是:
ldaOut<-LDA(dtm,k, method="Gibbs", control=list(nstart=nstart, seed = seed, best=best, burnin = burnin, iter = iter, thin=thin))
任何人都可以提供一些见解吗?谢谢。
在我看来,问题不在于缺少值的存在,而在于存在所有 0 行。要检查它:
raw.sum=apply(table,1,FUN=sum) #sum by raw each raw of the table
然后,您可以删除所有都是0的原始数据:
table=table[raw.sum!=0,]
现在表应该包含所有"非 0"原始数据。
我遇到了同样的问题。在您的情况下,设计矩阵 dtm 的行全为零,因为圆顶文档不包含某些单词(即它们的频率为零)。我想这以某种方式导致了沿线某处的奇异矩阵问题。我通过为每个文档添加一个常用词来解决此问题,以便每行至少有一个非零条目。至少,LDA成功运行并分类了每个文件。希望这有帮助!
另一个简单的解决方案是,创建一个rowSums列表(表示每个文档的术语数),并使用该列表按具有非零条目的行过滤df。
rowWords <- apply(df, 1, sum)
df <- df[rowWords > 0,]