2016-11-21 2 views
6

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) 

Antwort

5

Danke fuer die Benutzung text2vec und Berichterstattung der Problem. Es gibt einen Fehler in der Dokumentation (können Sie mir zeigen, wo ich dieses Beispiel anbringe, damit ich es beheben kann?). Stem tokenizer sollte wie folgt aussehen:

stem_tokenizer1 =function(x) { 
    word_tokenizer(x) %>% lapply(function(x) SnowballC::wordStem(x, language="en")) 
} 

Logic folgendes:

  1. Es Charakter Vektor nehmen und es tokenize. Ausgabe ist eine Liste von Zeichenvektoren (jedes Element der Liste = Zeichenvektor ist ein Dokument).
  2. Dann auf uns anwenden ergeben einzelnen Elemente der Liste (wordStem kann auf Zeichenvektor angewendet werden)

So war es meine Syntax Fehler für lapply in Beispiel Sie gefolgt. ohne %>% Bediener im Klar R MB es klar sein wird, wenn wir es so umschreiben, wird es wie folgt aussehen:

stem_tokenizer1 =function(x) { 
    tokens = word_tokenizer(x) 
    lapply(tokens, SnowballC::wordStem, language="en") 
} 

Ich werde auch erklären, warum Sie 10 docs statt 1000 standardmäßig text2vec::itoken geteilte Daten in 10 erhalten Chunks (dies kann in itoken Funktion eingestellt werden) und verarbeiten es Stück für Stück. Wenn Sie also unlist auf jeden Chunk anwenden, werden Sie rekursiv 100 Dokumente aufheben und 1-Zeichen-Vektor erstellen.

+0

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

+0

Mein schlechtes. Verpasstes x in 'word_tokenizer (x)', siehe aktualisierte Antwort. –

+0

Es funktioniert jetzt, danke! – rreedd

Verwandte Themen