2014-02-28 27 views
6

我想转换tmTermDocumentMatrix()创建以下简单的三重态基质从类转换“simple_triplet_matrix”上课“矩阵”

A term-document matrix (317443 terms, 86960 documents) 

Non-/sparse entries: 18472230/27586371050 
Sparsity   : 100% 
Maximal term length: 653 
Weighting   : term frequency (tf) 

[1] "TermDocumentMatrix" "simple_triplet_matrix" 

到一个密集矩阵

dense <- as.matrix(tdm) 

生成错误

Error in vector(typeof(x$v), nr * nc) : vector size cannot be NA 
In addition: Warning message: 
In nr * nc : NAs produced by integer overflow 

我实在无法理解的错误和警告消息。尝试在一个小数据集上复制错误与

library(tm) 
data("crude") 
tdm <- TermDocumentMatrix(crude) 
as.matrix(tdm) 

不会产生相同的问题。我从this answer中看到类似的问题通过slam包得到了解决(即使问题是关于总和操作而不是转换成密集矩阵)。我浏览了slam文档,但我找不到任何特定功能将simple_triplet_matrix类的对象转换为matrix类的对象。

+2

行数乘以列数'nr * nc'对于可用存储空间来说太大。 –

回答

2

因为当你评论达到整数限制的极限,正常的,因为你的文件数量巨大。这重现错误你得到一个错误:这需要一个整数作为参数

as.integer(.Machine$integer.max+1) 
[1] NA 
Warning message: 
NAs introduced by coercion 

功能vector因为第二个参数是NA,所以失败。

一个解决方案是重新定义as.matrix.simple_triplet_matrix而不呼叫vector。例如:

as.matrix.simple_triplet_matrix <- 
function (x, ...) 
{ 
    nr <- x$nrow 
    nc <- x$ncol 
    ## old line: y <- matrix(vector(typeof(x$v), nr * nc), nr, nc) 
    y <- matrix(0, nr, nc) ## 
    y[cbind(x$i, x$j)] <- x$v 
    dimnames(y) <- x$dimnames 
    y 
} 

但我不确定强制使用这种稀疏矩阵(100%)是一个好主意。

编辑

一个想法是使用saparseMatrixMatrix包。这里是一个例子,我比较了每个强制生成的对象。你可以通过使用sparseMatrix来获得10倍的租期(我认为你的稀疏矩阵,你会获得更多)。此外,加法和乘法由稀疏矩阵支持。

require(tm) 
data("crude") 
dtm <- TermDocumentMatrix(crude, 
          control = list(weighting = weightTfIdf, 
             stopwords = TRUE)) 
library(Matrix) 
Dense <- sparseMatrix(dtm$i,dtm$j,x=dtm$v) 
dense <- as.matrix(dtm) 
## check sizes 
floor(as.numeric(object.size(dense)/object.size(Dense))) 
## addistion and multiplication are supported 
Dense+Dense 
Dense*Dense 
+0

嗯,我需要一个密集的矩阵来做一些矩阵运算(特别是)...你是否建议直接在三元矩阵上运行会更好? – CptNemo

+0

是的!它只是一个长格式dtm [i,j,value]的列表。试着看看你能否以这种格式进行矩阵运算。 – agstudy

+0

我尝试了我的tdm函数:'错误:无法分配大小为205.7 Gb的矢量' – CptNemo

0

我刚刚有一个类似的问题。我不确定我的问题是否相同,但是当将稀疏矩阵与密集矩阵组合时,我收到了类似的错误消息NAs produced by integer overflow。我能够通过使用as.single将密集矩阵转换为单精度来修复它。我认为“溢出的整数”是由sparseMatrix包中的操作引起的,它以某种方式截断了留下剩余数字的双精度值。