2013-10-08 8 views
6

mit dem TM-Paket Ich bin der Lage, es so zu tun:Ist es möglich, dem RTextTools-Paket eine Liste mit benutzerdefinierten Stoppwörtern bereitzustellen?

c0 <- Corpus(VectorSource(text)) 
c0 <- tm_map(c0, removeWords, c(stopwords("english"),mystopwords)) 

mystopwords ein Vektor der zusätzlichen Stoppwörter zu sein ich entfernen möchten.

Aber ich kann keine gleichwertige Möglichkeit finden, es mit dem RTextTools-Paket zu tun. Zum Beispiel:

dtm <- create_matrix(text,language="english", 
      removePunctuation=T, 
      stripWhitespace=T, 
      toLower=T, 
      removeStopwords=T, #no clear way to specify a custom list here! 
      stemWords=T) 

Ist es möglich, dies zu tun? Ich mag die RTextTools Schnittstelle sehr und es wäre schade, dass ich zurück zu tm wechseln müsste.

Antwort

3

Es gibt drei (oder möglich, noch mehr) Lösungen für Ihr Problem:

Verwenden Sie zuerst das tm Paket nur für Worte zu entfernen. Beide Pakete befassen sich mit den gleichen Objekten, daher können Sie tm nur zum Entfernen von Wörtern und als RTextTools Paket verwenden. Auch wenn Sie in die Funktion create_matrix schauen, werden tm Funktionen verwendet.

Zweitens, ändern Sie die create_matrix Funktion. Zum Beispiel einen Eingabeparameter wie own_stopwords=NULL hinzufügen und fügen Sie die folgenden Zeilen:

# existing line 
corpus <- Corpus(VectorSource(trainingColumn), 
        readerControl = list(language = language)) 
# after that add this new line 
if(!is.null(own_stopwords)) corpus <- tm_map(corpus, removeWords, 
              words=as.character(own_stopwords)) 

Drittens, eine eigene Funktion, so etwas schreiben:

# excluder function 
remove_my_stopwords<-function(own_stw, dtm){ 
    ind<-sapply(own_stw, function(x, words){ 
    if(any(x==words)) return(which(x==words)) else return(NA) 
    }, words=colnames(dtm)) 
    return(dtm[ ,-c(na.omit(ind))]) 
} 

lass uns einen Blick, ob es funktioniert:

# let´s test it 
data(NYTimes) 
data <- NYTimes[sample(1:3100, size=10,replace=FALSE),] 
matrix <- create_matrix(cbind(data["Title"], data["Subject"])) 

head(colnames(matrix), 5) 
# [1] "109"   "200th"  "abc"   "amid"  "anniversary" 


# let´s consider some "own" stopwords as words above 
ostw <- head(colnames(matrix), 5) 

matrix2<-remove_my_stopwords(own_stw=ostw, dtm=matrix) 

# check if they are still there 
sapply(ostw, function(x, words) any(x==words), words=colnames(matrix2)) 
#109  200th   abc  amid anniversary 
#FALSE  FALSE  FALSE  FALSE  FALSE 

HTH

+0

Vielen Dank! Das funktioniert perfekt. Auch wenn das RTextTools-Paket einen Teil der Funktionalität verliert (oder eine einfache Implementierung verliert), empfehlen Sie, alles zu verwenden? (Überkleben mit dem tm-Paket) – user2175594

+1

Ich denke, es hängt von der seit Ihrer Matrix und Stop-Word-Vektor. Im Allgemeinen würde ich Lösung drei tun, aber wenn die Matrix und der Stoppwortvektor zu groß sind, können Speicherprobleme auftreten. Dann würde ich Lösung 2 machen, die Zeilen hinzufügen, sie z. B. benennen. 'create_matrix2', aber es in einer Datei und Quelle es. Dann können Sie 'create_matrix2' genauso verwenden wie die alte Funktion, aber mit der neuen Funktion. – holzben

0

Sie können Ihre Stoppwörter in der gleichen Liste hinzuzufügen. Zum Beispiel:

c0 <- tm_map(c0, removeWords, c(stopwords("english"),"mystopwords"))