大文档术语矩阵 - 计算文档的字符数时出错

时间:2015-01-31 11:16:53

标签: r matrix text-mining tm

我使用包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

1 个答案:

答案 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保持为稀疏矩阵,然后您应该能够保持在内存限制内。