我做的使用topicmodels包R.我创建一个语料库对象,做一些基本的预处理,然后创建一个DocumentTermMatrix主题建模:
corpus <- Corpus(VectorSource(vec), readerControl=list(language="en"))
corpus <- tm_map(corpus, tolower)
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, removeWords, stopwords("english"))
corpus <- tm_map(corpus, stripWhitespace)
corpus <- tm_map(corpus, removeNumbers)
...snip removing several custom lists of stopwords...
corpus <- tm_map(corpus, stemDocument)
dtm <- DocumentTermMatrix(corpus, control=list(minDocFreq=2, minWordLength=2))
然后进行LDA:
LDA(dtm, 30)
这对LDA()最终调用返回错误
"Each row of the input matrix needs to contain at least one non-zero entry".
我认为这意味着是预处理后没有条款中至少有一个文件。 有一种简单的方法来删除包含从DocumentTermMatrix没有条件的文件?
我找了topicmodels包的文档中发现的功能removeSparseTerms,从而消除不出现任何文件条款,但没有模拟去除文档。
"Each row of the input matrix needs to contain at least one non-zero entry"
的错误意味着稀疏矩阵包含没有条目(字)的行。 一种想法是计算单词的由行总和
rowTotals <- apply(dtm , 1, sum) #Find the sum of words in each Document
dtm.new <- dtm[rowTotals> 0, ] #remove all docs without words
agstudy的回答的伟大工程,但使用它一个缓慢的电脑上证明了轻度问题。
tic()
row_total = apply(dtm, 1, sum)
dtm.new = dtm[row_total>0,]
toc()
4.859 sec elapsed
(这是用4000x15000 DTM完成)
瓶颈似乎施加sum()
到稀疏矩阵。
由创建的文档长期矩阵tm
包中包含的名称i和j,这是其中条目是在稀疏矩阵指数。 如果dtm$i
不包含特定的行指数p
,然后排p
是空的。
tic()
ui = unique(dtm$i)
dtm.new = dtm[ui,]
toc()
0.121 sec elapsed
ui
包含所有非零指数,由于dtm$i
已经下令, dtm.new
将在同一数量级dtm
。 性能增益可能无所谓较小的文档词矩阵,但有可能成为较大的矩阵显著。
这只是对agstudy给出的答案阐述。
相反,从DTM矩阵删除空行,我们可以找出在我们的语料库中具有零长度的文件,直接从语料库中删除的文件,只有非空的文件进行第二DTM之前。
这是为了保持1有用:在DTM和语料库之间1的对应关系。
empty.rows <- dtm[rowTotals == 0, ]$dimnames[1][[1]] corpus <- corpus[-as.numeric(empty.rows)]
单从DTM删除稀疏条款和所有将工作做好。
dtm <- DocumentTermMatrix(crude, sparse=TRUE)
只是小编达里奥拉康的答案:
empty.rows <- dtm[rowTotals == 0, ]$dimnames[1][[1]]
将收集的记录的id
,而非订单号。 试试这个:
library(tm)
data("crude")
dtm <- DocumentTermMatrix(crude)
dtm[1, ]$dimnames[1][[1]] # return "127", not "1"
如果您构建具有连续编号您自己的语料,经过数据清理一些文件可以被删除,编号也将被打破。 所以,最好使用id
直接:
corpus <- tm_filter(
corpus,
FUN = function(doc) !is.element(meta(doc)$id, empty.rows))
# !( meta(doc)$id %in% emptyRows )
)