-->

从DocumentTermMatrix R中topicmodels删除空文件?(Remove emp

2019-07-05 19:35发布

我做的使用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,从而消除不出现任何文件条款,但没有模拟去除文档。

Answer 1:

"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


Answer 2:

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 。 性能增益可能无所谓较小的文档词矩阵,但有可能成为较大的矩阵显著。



Answer 3:

这只是对agstudy给出的答案阐述。

相反,从DTM矩阵删除空行,我们可以找出在我们的语料库中具有零长度的文件,直接从语料库中删除的文件,只有非空的文件进行第二DTM之前。

这是为了保持1有用:在DTM和语料库之间1的对应关系。

empty.rows <- dtm[rowTotals == 0, ]$dimnames[1][[1]] corpus <- corpus[-as.numeric(empty.rows)]



Answer 4:

单从DTM删除稀疏条款和所有将工作做好。

dtm <- DocumentTermMatrix(crude, sparse=TRUE)


Answer 5:

只是小编达里奥拉康的答案:

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 )
)


文章来源: Remove empty documents from DocumentTermMatrix in R topicmodels?