2011-09-11 40 views
5

我創建了一個包含1859個文檔(行)和25722(列)的DocumentTermMatrix。爲了在這個矩陣上執行進一步的計算,我需要把它轉換成一個規則矩陣。我想使用as.matrix()命令。但是,它返回以下錯誤:無法分配大小爲364.8 MB的向量。tm包錯誤「無法將DocumentTermMatrix轉換爲正常矩陣,因爲矢量太大」

> 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

DocumentTermMatrix使用sparse matrix表示法,所以它不佔用存儲所有這些零的所有內存。根據你想要做什麼,你可能會有一些運氣,SparseM包使用稀疏矩陣提供了一些線性代數例程。

+0

感謝您的快速回答。不幸的是,SparseM似乎並不會有幫助,因爲我需要計算每對線之間的Jaccard相似度。我通過使用純素包中的vegdist()函數來做到這一點。這不適用於稀疏矩陣。 – Christian

10

快速和骯髒的方法是將您的數據從外部包如矩陣導出到稀疏矩陣對象。

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

$class 
[1] "DocumentTermMatrix" "simple_triplet_matrix" 

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

dtm對象具有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)前和更改後創建的文檔詞矩陣,你會看到巨大的差異,更重要的是你不會破壞隱藏在您的文檔和條款中的重要關係。