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

Posted

技术标签:

【中文标题】tm 包错误“无法将 DocumentTermMatrix 转换为普通矩阵,因为向量太大”【英文标题】:tm package error "Cannot convert DocumentTermMatrix into normal matrix since vector is too large" 【发布时间】:2011-11-14 20:38:06 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

感谢您的快速回答。不幸的是,SparseM 似乎没有帮助,因为我需要计算每对线之间的 Jaccard 相似度。我通过使用 vegan 包中的 vegdist() 函数来做到这一点。这不适用于稀疏矩阵。【参考方案2】:

您能否增加 R 可用的 RAM 量?看到这个帖子:Increasing (or decreasing) the memory available to R processes

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

【讨论】:

【参考方案3】:

快速而肮脏的方法是将数据从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)

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

【讨论】:

【参考方案4】:

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

inspect(removeSparseTerms(dtm, 0.7))

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

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

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于tm 包错误“无法将 DocumentTermMatrix 转换为普通矩阵,因为向量太大”的主要内容,如果未能解决你的问题,请参考以下文章

R包之tm:文本挖掘包

大型术语文档矩阵/ simple_triplet_matrix 的行总和? tm 包

r 使用包“tm”(文本挖掘)在R中的tfidf

r 将简单三元组矩阵(tm包)转换为R中的稀疏矩阵

package:tm

R tm 包余弦相似度