Каждая строка входной матрицы должна содержать хотя бы одну ненулевую запись - PullRequest
3 голосов
/ 18 января 2020

У меня есть эта проблема, когда я запускаю этот кусок кода

text_lda <- LDA(text_dtm, k = 2, method = "VEM", control = NULL)

У меня следующая ошибка "Каждая строка входной матрицы должна содержать хотя бы одну ненулевую запись"

Затем я попытался решить эту проблему с помощью этих строк

row_total = apply(text_dtm, 1, sum)
empty.rows <- text_dtm[rowTotals == 0, ]$dimnames[1][[1]]

Но я получил следующую проблему

не может выделить вектор размером 3890,8 ГБ

Это размер моего DTM:

DocumentTermMatrix documents: 1968850, terms: 265238
Non-/sparse entries: 29766814/522184069486
Sparsity           : 100%
Maximal term length: 4000
Weighting          : term frequency (tf)

Ответы [ 2 ]

1 голос
/ 18 января 2020

Попробуйте:

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

Или используйте tm для генерации dtm, а затем:

ui = unique(text_dtm$i)
text_dtm.new = text_dtm[ui,]
0 голосов
/ 20 января 2020

Я бы рекомендовал использовать класс dgCMatrix для вашего DTM. Он поставляется с R как часть широко используемого пакета Matrix, работает с topicmodels::LDA и многими другими пакетами НЛП (textmineR, text2vec, tidytext, et c.), Имеет методы, которые позволяют вы работаете с ним, как если бы это была плотная матрица.

library(tm)
library(topicmodels)
library(Matrix)

# grab a character vector of text. Your source may be different
text <- textmineR::nih_sample$ABSTRACT_TEXT

text_corpus <- SimpleCorpus(VectorSource(text))

text_dtm <- DocumentTermMatrix(text_corpus,
                               control = list(tolower=TRUE,
                                              removePunctuation = TRUE, 
                                              removeNumbers= TRUE,
                                              stopwords = TRUE,
                                              sparse=TRUE))

text_dtm2 <- cast_sparse(text_dtm)

text_dtm2 <- Matrix::sparseMatrix(i=text_dtm$i, 
                                  j=text_dtm$j,
                                  x=text_dtm$v, 
                                  dims=c(text_dtm$nrow, text_dtm$ncol), 
                                  dimnames = text_dtm$dimnames)

doc_lengths <- Matrix::rowSums(text_dtm2)

text_dtm3 <- text_dtm2[doc_lengths > 0, ]

text_lda <- LDA(text_dtm3,  k = 2, method = "VEM", control = NULL)
...