2011-08-31 35 views
7

है, मैं आर में टीएम पैकेज का उपयोग करके सादा पाठ दस्तावेजों के कॉर्पस में दस्तावेजों को स्टेम करना चाहता हूं। जब मैं कॉर्पस के सभी दस्तावेजों में स्नोबॉलस्टेमर फ़ंक्शन लागू करता हूं, तो प्रत्येक दस्तावेज़ का अंतिम शब्द केवल होता है उपजी।स्नोबॉल स्टेमर केवल अंतिम शब्द

library(tm) 
library(Snowball) 
library(RWeka) 
library(rJava) 
path <- c("C:/path/to/diretory") 
corp <- Corpus(DirSource(path), 
       readerControl = list(reader = readPlain, language = "en_US", 
            load = TRUE)) 
tm_map(corp,SnowballStemmer) #stemDocument has the same problem 

मुझे लगता है कि यह दस्तावेजों को कॉर्पस में पढ़ने के तरीके से संबंधित है। कुछ सरल उदाहरण के साथ इस उदाहरण देकर स्पष्ट करने के लिए:

> vec<-c("running runner runs","happyness happies") 
> stemDocument(vec) 
    [1] "running runner run" "happyness happi" 

> vec2<-c("running","runner","runs","happyness","happies") 
> stemDocument(vec2) 
    [1] "run" "runner" "run" "happy" "happi" <- 

> corp<-Corpus(VectorSource(vec)) 
> corp<-tm_map(corp, stemDocument) 
> inspect(corp) 
    A corpus with 2 text documents 

    The metadata consists of 2 tag-value pairs and a data frame 
    Available tags are: 
    create_date creator 
    Available variables in the data frame are: 
    MetaID 

    [[1]] 
    run runner run 

    [[2]] 
    happy happi 

> corp2<-Corpus(DirSource(path),readerControl=list(reader=readPlain,language="en_US" , load=T)) 
> corp2<-tm_map(corp2, stemDocument) 
> inspect(corp2) 
    A corpus with 2 text documents 

    The metadata consists of 2 tag-value pairs and a data frame 
    Available tags are: 
    create_date creator 
    Available variables in the data frame are: 
    MetaID 

    $`1.txt` 
    running runner runs 

    $`2.txt` 
    happyness happies 
+0

स्नोबॉल के लिए आर इंटरफ़ेस नहीं है? इसलिए आपको लाइब्रेरी (सिस्टम) चाहिए और tm_map (corp, wordStem) आज़माएं। –

+0

टिप्पणी के लिए धन्यवाद। मैंने कोशिश की और परिणाम एक ही थे। मैं समस्या को और अधिक स्पष्ट करने के लिए ऊपर एक बेहतर उदाहरण शामिल करूंगा। – Christian

उत्तर

3

समस्या मैं देख रहा हूँ कि wordStem शब्दों का एक वेक्टर में ले जाता है, लेकिन कोर्पस plainTextReader मानता है कि दस्तावेजों है कि इसे पढ़ता में, प्रत्येक शब्द अपनी पंक्ति में है। दूसरे शब्दों में, इस plainTextReader भ्रमित के रूप में आप अपने दस्तावेज़

From ancient grudge break to new mutiny, 
Where civil blood makes civil hands unclean. 
From forth the fatal loins of these two foes 

बजाय में 3 "शब्द" के साथ खत्म हो जाएगा दस्तावेज़ होना चाहिए

From 
ancient 
grudge 
break 
to 
new 
mutiny 
where 
civil 
...etc... 

भी ध्यान रखें कि विराम चिह्न भी confuses wordStem तो आपको उन्हें भी बाहर ले जाना होगा।

अपने वास्तविक दस्तावेज़ों को संशोधित किए बिना ऐसा करने का एक और तरीका एक ऐसा कार्य परिभाषित करना है जो अलग-अलग होता है और किसी शब्द के पहले या बाद में दिखाई देने वाले गैर-अल्फान्यूमेरिक्स को हटा देता है। यहां एक सरल है:

wordStem2 <- function(x) { 
    mywords <- unlist(strsplit(x, " ")) 
    mycleanwords <- gsub("^\\W+|\\W+$", "", mywords, perl=T) 
    mycleanwords <- mycleanwords[mycleanwords != ""] 
    wordStem(mycleanwords) 
} 

corpA <- tm_map(mycorpus, wordStem2); 
corpB <- Corpus(VectorSource(corpA)); 

अब अपने सामान्य कॉर्पस के रूप में कॉर्पबी का उपयोग करें।

+0

धन्यवाद, स्टेमिंग अब काम किया। हालांकि वर्डस्टेम और स्नोबॉलस्टेमर लगाने के परिणाम व्यक्तिगत चरित्र वैक्टर हैं। इसका परिणाम यह है कि फ़ंक्शन DocumentTermMatrix अब परिणामी कॉर्पस पर काम नहीं करता है। मैं इसे काम करने के लिए कैसे प्राप्त कर सकता हूं? – Christian

+0

@ क्रिस्टियन मैंने इसके लिए अपना जवाब संपादित किया। यदि कोई आसान तरीका है, तो मुझे यह नहीं पता। –

4

लोड आवश्यक पुस्तकालयों

library(tm) 
library(Snowball) 

बनाने वेक्टर

vec<-c("running runner runs","happyness happies") 

वेक्टर से कोष बनाने

vec<-Corpus(VectorSource(vec)) 

बहुत महत्वपूर्ण बात यह है कि हमारे कोष का वर्ग की जाँच करें और इसे संरक्षित हम चाहते हैं के रूप में करने के लिए है एक मानक कॉर्पस जो आर कार्य

समझता है
class(vec[[1]]) 

vec[[1]] 
<<PlainTextDocument (metadata: 7)>> 
running runner runs 

यह शायद आप सादा पाठ दस्तावेज़

बता तो अब हम हमारे दोषपूर्ण stemDocument समारोह को संशोधित करेगा। सबसे पहले हम अपने सादे पाठ को चरित्र में परिवर्तित करते हैं और फिर हम पाठ को विभाजित करते हैं, स्टेम डॉक्यूमेंट लागू करते हैं जो अब ठीक काम करता है और इसे एक साथ पेस्ट करता है। सबसे महत्वपूर्ण बात यह है कि हम आउटपुट को टीएम पैकेज द्वारा दिए गए प्लेनटेक्स्ट डॉक्यूमेंट में वापस ले जाते हैं।

stemDocumentfix <- function(x) 
{ 
    PlainTextDocument(paste(stemDocument(unlist(strsplit(as.character(x), " "))),collapse=' ')) 
} 

अब हम अपने कोष पर मानक tm_map उपयोग कर सकते हैं

vec1 = tm_map(vec, stemDocumentfix) 

परिणाम

vec1[[1]] 
<<PlainTextDocument (metadata: 7)>> 
run runner run 

सबसे महत्वपूर्ण बात यह तुम्हें याद की जरूरत हमेशा कोष में दस्तावेजों के वर्ग presever करना है। मुझे आशा है कि यह लोड की गई 2 पुस्तकालयों के भीतर से फ़ंक्शन का उपयोग करके आपकी समस्या का एक सरल समाधान है।