Entfernen Sie leere Dokumente aus DocumentTermMatrix in R topicmodels?
Ich mache das Thema Modellierung mit der topicmodels Paket in R. ich bin die Schaffung eines Corpus Objekt, dabei einige grundlegende Vorverarbeitung, und dann die Erstellung eines 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))
Werden und dann LDA:
LDA(dtm, 30)
Diesem letzten Aufruf von LDA() gibt den Fehler zurück
"Each row of the input matrix needs to contain at least one non-zero entry".
Ich nehme an, dies bedeutet, dass es mindestens ein Dokument, das keine Geschäftsbedingungen in es nach der Vorverarbeitung. Gibt es eine einfache Möglichkeit, entfernen Sie die Dokumente enthalten, keine Begriffe aus einem DocumentTermMatrix?
Sah ich Sie in der Dokumentation für die topicmodels Paket und fand die Funktion removeSparseTerms, die entfernt Begriffe, die nicht in Erscheinung, aber es gibt keine Entsprechung für das entfernen von Dokumenten.
InformationsquelleAutor der Frage Bill M | 2012-12-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Fehler bedeutet, dass sparse-matrix enthält eine Zeile ohne Einträge(Wörter). eine Idee ist zum berechnen der Summe der Wörter von Zeile
InformationsquelleAutor der Antwort agstudy
agstudy Antwort funktioniert Super, aber benutze es auf einem langsamen computer erwies sich als gelinde gesagt problematisch.
(dies wurde mit einer 4000x15000 dtm)
Den Engpass scheint die Anwendung
sum()
zu einer sparse matrix.Einer Dokument-term-matrix erstellt, indem die
tm
Paket enthält die Namen i und j die Indizes für die, wo die Einträge sind in der sparse-matrix. Wenndtm$i
nicht enthalten eine bestimmte Zeile indexp
dann Zeilep
leer ist.ui
enthält alle nicht-null-indices, und dadtm$i
ist bereits bestellt,dtm.new
werden in der gleichen Reihenfolge wiedtm
. Der performance-Gewinn mag nicht für kleinere Dokument-term-Matrizen, kann aber wichtig werden bei größeren Matrizen.InformationsquelleAutor der Antwort SylphFeather
Dies ist nur zu erarbeiten, die Antwort agstudy.
Statt entfernen der leeren Zeilen aus der dtm-matrix, die wir identifizieren können, werden die Dokumente in unserem Korpus, die haben die Länge null, und entfernen Sie die Dokumente direkt aus dem corpus, vor dem durchführen einer zweiten dtm mit nur nicht-leere Dokumente.
Dies ist nützlich, um zu halten eine 1:1 Korrespondenz zwischen der dtm und der corpus.
empty.rows <- dtm[rowTotals == 0, ]$dimnames[1][[1]]
corpus <- corpus[-as.numeric(empty.rows)]
InformationsquelleAutor der Antwort Dario Lacan
Entfernen Sie einfach die spärlichen Begriffe aus der DTM und alles wird gut.
InformationsquelleAutor der Antwort Arijay Chaudhry
Nur ein kleiner Nachtrag auf die Antwort von Dario Lacan:
sammeln Datensatz
id
anstatt um zahlen. Versuchen Sie dies:Wenn Sie erstellen Sie Ihre eigenen Korpus mit Nummerierung, nach der Datenbereinigung einige Dokumente entfernt werden können und die Nummerierung auch gebrochen werden. Also, es ist besser
id
direkt:InformationsquelleAutor der Antwort Bernitske