我使用包RTextTools
构建了一个大文档术语矩阵。
现在我正在尝试计算矩阵行中的字符数,以便在执行主题建模之前删除空文档。
当我将代码应用于我的语料库样本,获得更小的矩阵时,我的代码没有错误,但是当我尝试计算从我的整个语料库(~75000条推文)生成的矩阵中文档的行长度时,我收到以下错误消息:
Error in vector(typeof(x$v), nr * nc) :
the dimension of the vector no cannot be NA
And: Warning message:
In nr * nc : NA produced by integer overflow
这是我的代码:
matrix <- create_matrix(data$clean_text, language="french", stemWords=TRUE, removeStopwords=TRUE, removeNumbers=TRUE, stripWhitespace=TRUE, toLower=TRUE, removePunctuation=TRUE, minWordLength=3)
rowTotals <- apply(matrix, 1, sum)
如果我尝试使用25000个文档的矩阵,我会收到以下错误:
message: rowTotals <- apply(matrix, 1, sum)
Errore: cannot allocate vector of size 7.1 Gb
答案 0 :(得分:1)
如果将数据保存在dtm中,您可能可以解决此问题,dtm使用的稀疏矩阵表示比常规矩阵具有更高的内存效率。
apply
函数给出错误的原因是因为它将稀疏矩阵转换为常规矩阵(Q-btw中的matrix
对象,它提供数据的风格很差对象名称也是函数的名称,尤其是基函数。这意味着R必须为dtm中的所有零分配内存(通常大多数为0,因此其中包含大量内存为0)。对于稀疏矩阵,R不需要存储任何零。
这里是apply
来源的前几行,请参阅此处的最后一行以转换为常规矩阵:
apply
function (X, MARGIN, FUN, ...)
{
FUN <- match.fun(FUN)
dl <- length(dim(X))
if (!dl)
stop("dim(X) must have a positive length")
if (is.object(X))
X <- if (dl == 2L)
as.matrix(X) # this is where your memory gets filled with zeros
那么如何避免转换呢?这是在保持稀疏矩阵格式的同时循环行以获取其总和的一种方法:
sapply(seq(nrow(matrix)), function(i) sum(matrix[i,]))
[1] 2 1 2 2 1
以这种方式子集保留稀疏格式,并且不会将对象转换为更昂贵的常见矩阵表示。我们可以查看代表:
str(matrix[1,])
List of 6
$ i : int [1:2] 1 1
$ j : int [1:2] 1 3
$ v : num [1:2] 1 1
$ nrow : int 1
$ ncol : int 6
$ dimnames:List of 2
..$ Docs : chr "1"
..$ Terms: chr [1:6] "document" "file" "first" "second" ...
- attr(*, "class")= chr [1:2] "DocumentTermMatrix" "simple_triplet_matrix"
- attr(*, "weighting")= chr [1:2] "term frequency" "tf"
所以在sapply
函数中,我们总是在处理稀疏矩阵。即使sum
(或者你在那里使用的任何函数)进行某种转换,它只会转换dtm的一行,而不是整个事物。
在R中使用较大的文本数据时的一般原则是将dtm保持为稀疏矩阵,然后您应该能够保持在内存限制内。