2013-10-08 33 views
6

Z pakietem tm jestem w stanie zrobić to tak:Czy jest możliwe podanie listy niestandardowych przerwań w pakiecie RTextTools?

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

mystopwords jest wektorem dodatkowych stopwords Chcę usunąć.

Ale nie mogę znaleźć równoważnego sposobu, aby to zrobić za pomocą pakietu RTextTools. Na przykład:

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) 

Czy można to zrobić? Bardzo podoba mi się interfejs RTextTools i szkoda byłoby wrócić do tm.

Odpowiedz

3

Istnieją trzy (lub możliwe nawet więcej) do rozwiązania problemu:

pierwsze, użycie pakietu tm tylko do usuwania słowa. Oba pakiety mają do czynienia z tymi samymi obiektami, dlatego można użyć tm tylko do usuwania słów i do pakietu RTextTools. Nawet gdy zaglądasz do funkcji create_matrix, używa ona funkcji tm.

Po drugie, zmodyfikuj funkcję create_matrix. Na przykład dodać parametr wejściowy jak own_stopwords=NULL i dodaj następujące linie:

# 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)) 

trzecie, napisać własną funkcję, coś jak to:

# 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))]) 
} 

przejdźmy rzucić okiem, czy to działa:

# 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

Dzięki! To działa idealnie. Chociaż, biorąc pod uwagę, że pakiet RTextTools traci część funkcjonalności (lub traci łatwą implementację), czy poleciłbyś je wszystkie? (Nad trzymaniem się pakietu tm) – user2175594

+1

Myślę, że to zależy od od twojej matrycy i zatrzymania wektora słowa. Ogólnie rzecz biorąc, zrobiłbym rozwiązanie trzecie, ale jeśli macierz i wektor słowa zatrzymania są zbyt duże, mogą wystąpić problemy z pamięcią. Następnie chciałbym zrobić rozwiązanie 2, dodać linie, nazwać je np. 'create_matrix2', ale plik i źródło. Niż można użyć 'create_matrix2' w taki sam sposób jak poprzednią funkcję, ale z nową funkcją. – holzben

0

Możesz dodać stopu słowa w tej samej liście. Na przykład:

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