从类“simple_triplet_matrix”转换为类“matrix”

时间:2014-02-28 05:32:31

标签: r matrix tm

我正在尝试转换使用TermDocumentMatrix()包<{1}}创建的以下简单三联色矩阵

tm

的课程

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

不会产生同样的问题。我从this answer看到,通过library(tm) data("crude") tdm <- TermDocumentMatrix(crude) as.matrix(tdm) 包解决了类似的问题(即使问题是关于求和操作而不是转换为密集矩阵)。我浏览了slam文档,但是找不到任何特定的函数来将类slam的对象转换为类simple_triplet_matrix的对象。

2 个答案:

答案 0 :(得分: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%)。

编辑

一个想法是使用saparseMatrix包中的Matrix。这里是一个例子,我比较每个强制生成的对象。通过使用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

答案 1 :(得分:0)

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