5

我创建了一个 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 上执行常规矩阵运算?

4

5 回答 5

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)

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

于 2012-12-12T17:24:58.007 回答
0

由于您只有 1859 个文档,因此您需要计算的距离矩阵相当小。使用 slam 包(特别是它的 crossapply_simple_triplet_matrix 函数),您可能能够直接计算距离矩阵,而不是先将 DTM 转换为密集矩阵。这意味着您必须自己计算 Jaccard 相似度。我已经成功地在大量文档上尝试了类似的余弦距离矩阵。

于 2014-10-02T13:07:45.467 回答
0

DocumentTermMatrix uses sparse matrix representation, so it doesn't take up all that memory storing all those zeros. Depending what it is you want to do you might have some luck with the SparseM package which provides some linear algebra routines using sparse matrices..

于 2011-09-11T18:26:50.993 回答
0

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

inspect(removeSparseTerms(dtm, 0.7))

它会删除至少稀疏度为 0.7 的项。

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

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

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

于 2014-06-18T21:05:27.667 回答
0

您是否能够增加 R 可用的 RAM 量?请参阅这篇文章:增加(或减少)R 进程可用的内存

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

于 2011-09-12T12:38:38.093 回答