2013-10-08 5 views
6

टीएम पैकेज के साथ मैं इस तरह यह करने के लिए कर सकती हूं:क्या RTextTools पैकेज में कस्टम स्टॉपवर्ड की एक सूची प्रदान करना संभव है?

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

mystopwords अतिरिक्त stopwords मैं निकालना चाहते का एक वेक्टर जा रहा है।

लेकिन मुझे 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 पैकेज का उपयोग करें। दोनों पैकेज एक ही ऑब्जेक्ट से निपटते हैं, इसलिए आप शब्दों को हटाने और RTextTools पैकेज से tm का उपयोग कर सकते हैं। यहां तक ​​कि जब आप 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 

HTH

+0

धन्यवाद! यह पूरी तरह से काम करता है। हालांकि, यह देखते हुए कि RTextTools पैकेज कुछ कार्यक्षमता खो देता है (या एक आसान कार्यान्वयन खो देता है), क्या आप इसका उपयोग करने की सलाह देंगे? (टीएम पैकेज के साथ चिपके हुए) – user2175594

+1

मुझे लगता है कि यह आपके मैट्रिक्स के बाद से निर्भर करता है और शब्द वेक्टर को रोकता है। आम तौर पर मैं समाधान तीन करता हूं, लेकिन यदि मैट्रिक्स और स्टॉप वर्ड वेक्टर बहुत बड़े हैं तो आपको स्मृति समस्याएं मिल सकती हैं। मैं समाधान 2 करूँगा, लाइनों को जोड़ें, इसे नाम दें। 'create_matrix2', लेकिन यह एक फ़ाइल पर और स्रोत है। इससे पहले कि आप 'create_matrix2' का उपयोग उसी तरह पुराने कार्य के साथ कर सकते हैं लेकिन नई सुविधा के साथ। – holzben

0

आप एक ही सूची में अपने स्टॉप शब्द जोड़ सकते हैं। उदाहरण के लिए:

c0 <- tm_map(c0, removeWords, c(stopwords("english"),"mystopwords")) 
संबंधित मुद्दे