2013-10-08 4 views
6

С пакетом тм я в состоянии сделать это так:Возможно ли предоставить список пользовательских паролей в пакет RTextTools?

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

mystopwords как вектор дополнительных стоп-слов, которые я хочу, чтобы удалить.

Но я не могу найти эквивалентный способ сделать это, используя пакет RTextTools. Например:

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) 

Возможно ли это? Мне очень нравится интерфейс RTextTools, и было бы очень жаль возвращаться к tm.

ответ

3

Есть три (или возможно даже больше) решения вашей проблемы:

Во-первых, использовать tm пакет только для удаления слов. Оба пакета имеют дело с одними и теми же объектами, поэтому вы можете использовать tm только для удаления слов и пакета RTextTools. Даже если вы заглянете внутрь функции create_matrix, она использует функции tm.

Во-вторых, измените функцию create_matrix. Например добавить входной параметр, как own_stopwords=NULL и добавьте следующие строки:

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

В-третьих, написать свою собственную функцию, что-то вроде этого:

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

давайте посмотрим, работает ли он:

# 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 

НТН

+0

Спасибо! Это прекрасно работает. Хотя, учитывая, что пакет RTextTools теряет часть функциональности (или теряет простую реализацию), вы бы рекомендовали использовать все это? (Над прилипанием к пакету tm) – user2175594

+1

Я думаю, что это зависит от того, что из-за вашей матрицы и остановит вектор-слово. В общем, я бы сделал решение три, но если матрица и вектор стоп-слова слишком велики, вы можете получить проблемы с памятью. Чем я буду делать решение 2, добавьте строки, назовите его, например. 'create_matrix2', но это на файл и его источник. Чем вы можете использовать 'create_matrix2' так же, как и старая функция, но с новой функцией. – holzben

0

Вы можете добавить стоп-слова в том же списке. Например:

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