R 大文档术语矩阵-计算文档字符数时出错
我用包R 大文档术语矩阵-计算文档字符数时出错,r,matrix,text-mining,tm,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: Warnin
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)
matrix如果将数据保存在dtm中,您可能能够解决这个问题,dtm使用的稀疏矩阵表示法比常规矩阵的内存效率要高得多
apply
函数之所以会出现错误,是因为它将稀疏矩阵转换为常规矩阵(Q-btw中的matrix
对象为数据对象命名也是函数的名称,特别是基函数的名称,这种风格很差)。这意味着R必须为dtm中的所有零分配内存(通常都是零,所以有很多内存中都有零)。对于稀疏矩阵,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
这种方法保留了稀疏格式,并且不会将对象转换为内存更昂贵的通用矩阵表示。我们可以查看以下陈述:
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的一行,而不是整个dtm
在R中处理较大的文本数据时,一般原则是将dtm保持为稀疏矩阵,然后应该能够保持在内存限制内 同意,在这个小样本上运行良好:文本感谢律师提供了可复制的代码。我试过了,得到了这样一条信息:欢迎光临。但是试着用一小部分来看看代码是否正常工作,内存是否不足,或者是否还有其他问题。rowTotals矩阵大小计算中整数溢出导致的错误不会是获得额外内存所能解决的问题。你需要缩小这个问题的规模。以易于管理的大小和聚合块进行。Ehy BondedDust,感谢您的帮助。我考虑过这样做,问题是不同的dtm不会以相同的条件创建。不过它可能适合我的需要。然而,一个“简单”的任务,比如计算行长度,需要7.1GB的内存,这还是很奇怪的!一定有更好的办法来解决我的问题。
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"