2011-09-11 24 views
5

मैंने एक दस्तावेज़TermMatrix बनाया है जिसमें 185 9 दस्तावेज़ (पंक्तियां) और 25722 (कॉलम) शामिल हैं। इस मैट्रिक्स पर और गणना करने के लिए मुझे इसे नियमित मैट्रिक्स में बदलने की आवश्यकता है। मैं as.matrix() कमांड का उपयोग करना चाहता हूं। हालांकि, यह निम्न त्रुटि देता है: आकार 364.8 एमबी के वेक्टर आवंटित नहीं कर सकता है।टीएम पैकेज त्रुटि "वेक्टर बहुत बड़ा है, इसलिए वेक्टर टर्ममैट्रिक्स को सामान्य मैट्रिक्स में परिवर्तित नहीं कर सकते हैं"

> corp 
A corpus with 1859 text documents 
> mat<-DocumentTermMatrix(corp) 
> dim(mat) 
[1] 1859 25722 
> is(mat) 
[1] "DocumentTermMatrix" 
> mat2<-as.matrix(mat) 
Fehler: kann Vektor der Größe 364.8 MB nicht allozieren # cannot allocate vector of size 364.8 MB 
> object.size(mat) 
5502000 bytes 

किसी कारण से ऑब्जेक्ट का आकार नाटकीय रूप से बढ़ता प्रतीत होता है जब भी यह नियमित मैट्रिक्स में परिवर्तित हो जाता है। इससे कैसे बचा जा सकता है?

या क्या DocumentTermMatrix पर नियमित मैट्रिक्स संचालन करने का कोई वैकल्पिक तरीका है?

उत्तर

0

दस्तावेज़ टर्ममैट्रिक्स sparse matrix प्रतिनिधित्व का उपयोग करता है, इसलिए यह उन सभी शून्यों को संग्रहीत करने वाली सभी मेमोरी को नहीं लेता है। आप जो करना चाहते हैं उसके आधार पर आपको SparseM पैकेज के साथ कुछ भाग्य हो सकता है जो स्पैर मैट्रिस का उपयोग करके कुछ रैखिक बीजगणित दिनचर्या प्रदान करता है ..

+0

त्वरित उत्तर के लिए धन्यवाद की कोशिश की है। दुर्भाग्यवश स्पैर्सएम ऐसा प्रतीत नहीं होता है कि यह मददगार होगा क्योंकि मुझे लाइनों की प्रत्येक जोड़ी के बीच जैककार्ड समानता की गणना करने की आवश्यकता है। मैं vegan पैकेज से vegdist() फ़ंक्शन का उपयोग कर ऐसा करता हूं। यह एक स्पैर मैट्रिक्स पर काम नहीं करता है। – Christian

0

क्या आप आर के लिए उपलब्ध रैम की मात्रा बढ़ाने में सक्षम हैं? यह पोस्ट देखें: Increasing (or decreasing) the memory available to R processes

इसके अलावा, कभी-कभी, आर में बड़ी वस्तुओं के साथ काम करते समय, मैं मौत की स्मृति को मुक्त करने के लिए gc() पर कॉल करता हूं।

10

त्वरित और गंदे तरीके से मैट्रिक्स जैसे बाहरी पैकेज से आपके डेटा को एक स्पैर मैट्रिक्स ऑब्जेक्ट में निर्यात करना है।

> attributes(dtm) 
$names 
[1] "i"  "j"  "v"  "nrow"  "ncol"  "dimnames" 

$class 
[1] "DocumentTermMatrix" "simple_triplet_matrix" 

$Weighting 
[1] "term frequency" "tf"    

डीटीएम ऑब्जेक्ट में i, j और v विशेषताएँ हैं जो आपके Documenttermmatrix का आंतरिक प्रतिनिधित्व है। उपयोग करें:

library("Matrix") mat <- sparseMatrix(i=dtm$i, j=dtm$j, x=dtm$v, 
    dims=c(dtm$nrow, dtm$ncol)) 

और आप कर चुके हैं।

एक अपने वस्तुओं के बीच अनुभवहीन तुलना:

> mat[1,1:100] 
> head(as.vector(dtm[1,]), 100) 

प्रत्येक अपने सटीक एक ही आउटपुट दे देंगे।

0

दस्तावेजों की संख्या एक समस्या नहीं होनी चाहिए, लेकिन आप स्पैस शर्तों को हटाने का प्रयास करना चाहेंगे, यह दस्तावेज़ अवधि मैट्रिक्स के आयाम को बहुत कम कर सकता है।

inspect(removeSparseTerms(dtm, 0.7)) 

यह उन शर्तों को हटा देता है जिनमें कम से कम 0.7 की कमी होती है।

एक अन्य विकल्प आप के लिए उपलब्ध है कि आप अधिक महत्वपूर्ण बात है जब आप

a.dtm <- DocumentTermMatrix(a.corpus, control = list(weighting = weightTfIdf, minWordLength = 2, minDocFreq = 5)) 

उपयोग inspect(dtm) से पहले और अपने परिवर्तन के बाद दस्तावेज़ अवधि मैट्रिक्स बनाने के न्यूनतम शब्द लंबाई और न्यूनतम दस्तावेज़ आवृत्ति निर्दिष्ट करते हैं, आप बहुत बड़ा फर्क देखेंगे, तो आप आपके दस्तावेज़ों और शर्तों में छिपे महत्वपूर्ण संबंधों को बर्बाद नहीं करेगा।

0

चूंकि आपके पास केवल 1859 दस्तावेज हैं, इसलिए गणना करने की दूरी मैट्रिक्स आपको काफी छोटी है। स्लैम पैकेज का उपयोग करना (और विशेष रूप से, इसके crossapply_simple_triplet_matrix फ़ंक्शन), आप डीटीएम को पहले घने मैट्रिक्स में परिवर्तित करने के बजाय सीधे दूरी मैट्रिक्स की गणना करने में सक्षम हो सकते हैं। इसका मतलब है कि आपको जैककार्ड समानता की गणना करना होगा।मैंने सफलतापूर्वक something similar for the cosine distance matrix on a large number of documents.