Ich benutze text2vec in R und habe Schwierigkeiten beim Schreiben einer Stemming-Funktion, die mit der Itoken-Funktion im text2vec-Paket arbeitet. Die text2vec-Dokumentation schlägt diese Stemming-Funktion vor:Stemming-Funktion für text2vec
stem_tokenizer1 =function(x) {
word_tokenizer(x) %>% lapply(SnowballC::wordStem(language='en'))
}
Diese Funktion funktioniert jedoch nicht. Dies ist der Code I RAN (aus früheren Stackoverflow Antworten entlehnt):
library(text2vec)
library(data.table)
library(SnowballC)
data("movie_review")
train_rows = 1:1000
prepr = tolower
stem_tokenizer1 =function(x) {
word_tokenizer(x) %>% lapply(SnowballC::wordStem(language='en'))
}
tok = stem_tokenizer1
it <- itoken(movie_review$review[train_rows], prepr, tok, ids = movie_review$id[train_rows])
Dies ist der Fehler, den es erzeugt:
Fehler in {: Argument "Worte" fehlt, ohne Standard
Ich glaube, das Problem ist, dass WordStem einen Zeichenvektor benötigt, aber Word_Tokenizer erzeugt eine Liste von Zeichenvektoren.
mr<-movie_review$review[1]
stem_mr1<-stem_tokenizer1(mr)
Fehler in SnowballC :: Wortstamms (language = "en"): Argument "Worte" fehlt, ohne Standard
um dieses Problem zu beheben, schrieb ich diese Funktion ergeben:
stem_tokenizer2 = function(x) {
list(unlist(word_tokenizer(x)) %>% SnowballC::wordStem(language='en'))
}
Diese Funktion funktioniert jedoch nicht mit der Funktion create_vocabulary.
data("movie_review")
train_rows = 1:1000
prepr = tolower
stem_tokenizer2 = function(x) {
list(unlist(word_tokenizer(x)) %>% SnowballC::wordStem(language='en'))
}
tok = stem_tokenizer2
it <- itoken(movie_review$review[train_rows], prepr, tok, ids = movie_review$id[train_rows])
v <- create_vocabulary(it) %>% prune_vocabulary(term_count_min = 5)
Kein Fehler, aber wenn Sie auf der Dokumentenanzahl betrachten, ist die Anzahl der Dokumente anders als die 1000 in den Daten, und so können Sie kein Dokument Begriff Matrix erstellen oder eine LDA laufen.
v$document_count
[1] 10
Dieser Code:
dtm_train <- create_dtm(it, vectorizer)
dtm_train
Producess dieser Fehler:
10 x 3809 Sparse Matrix der Klasse "dgCMatrix" Fehler in validObject (x): ungültige Klasse "dgCMatrix" Objekt: Länge (Dimnam es [1]) unterscheidet sich von Dim [1], das ist 10
Meine Fragen sind: ist etwas falsch mit der Funktion, die ich schrieb, und warum würde die Funktion, die ich schrieb, diesen Fehler mit create_vocabulary? Ich vermute, es ist ein Problem mit dem Format der Ausgabe meiner Funktion, aber es sieht identisch mit dem Ausgabeformat der word_tokenizer Funktion, und das funktioniert gut mit Itoken und create_vocabulary:
mr<-movie_review$review[1]
word_mr<-word_tokenizer(mr)
stem_mr<-stem_tokenizer2(mr)
str(word_mr)
str(stem_mr)
Vielen Dank für Ihre schnelle Antwort. Ich habe den Code ausgeführt, und das Dokument hat 30 Punkte. Ist das das gleiche Problem, das Sie beim Erstellen eines 1-Zeichen-Vektors erwähnt haben? code: 'data (" movie_review ") train_rows = 1: 1000 prepr = tolower stem_tokenizer1 = funktion (x) { word_tokenizer%>% lapply (funktion (x) SnowballC :: wordStem (x, language =" de ")) } tok = stem_tokenizer1 es <- Itoken (movie_review $ Bewertung [train_rows], Prepr, tok, ids = movie_review $ id [train_rows]) v <- create_vocabulary (it)%>% prune_vocabulary (term_count_min = 5) v $ document_count' – rreedd
Mein schlechtes. Verpasstes x in 'word_tokenizer (x)', siehe aktualisierte Antwort. –
Es funktioniert jetzt, danke! – rreedd