tm包错误“由于向量太大,无法将DocumentTermMatrix转换为普通矩阵”

时间:2011-09-11 17:49:01

标签: r tm

我创建了一个DocumentTermMatrix,其中包含1859个文档(行)和25722个(列)。为了对该矩阵进行进一步的计算,我需要将其转换为规则矩阵。我想使用as.matrix()命令。但是,它返回以下错误:无法分配大小为364.8 MB的向量。

> 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上执行常规矩阵运算?

5 个答案:

答案 0 :(得分:10)

快速而肮脏的方法是将数据导出到像Matrix这样的外部包中的稀疏矩阵对象。

> 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)

每个都会给出完全相同的输出。

答案 1 :(得分:0)

DocumentTermMatrix使用sparse matrix表示,因此它不会占用存储所有这些零的所有内存。根据你想要做的事情你可能会对SparseM包有一些运气,它提供了一些使用稀疏矩阵的线性代数例程。

答案 2 :(得分:0)

您是否可以增加R可用的RAM量?请参阅此帖子:Increasing (or decreasing) the memory available to R processes

此外,有时在使用R中的大对象时,我偶尔会调用gc()来释放浪费的内存。

答案 3 :(得分:0)

文档的数量应该不是问题,但您可能想尝试删除稀疏术语,这可以很好地减少文档术语矩阵的维度。

inspect(removeSparseTerms(dtm, 0.7))

删除至少稀疏度为0.7的字词。

您可以使用的另一个选项是在创建文档术语矩阵时指定最小字长和最小文档频率

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

在您的更改之前和之后使用inspect(dtm),您将看到巨大的差异,更重要的是,您不会破坏隐藏在您的文档和条款中的重要关系。

答案 4 :(得分:0)

由于您只有1859个文档,因此您需要计算的距离矩阵相当小。使用slam包(特别是其crossapply_simple_triplet_matrix函数),您可以直接计算距离矩阵,而不是首先将DTM转换为密集矩阵。这意味着您必须自己计算Jaccard相似度。我已成功尝试something similar for the cosine distance matrix on a large number of documents.