r - 将文档术语矩阵转换为包含大量数据的矩阵会导致溢出

标签 r memory-management text matrix mining

让我们做一些文本挖掘

在这里,我站在一个文档术语矩阵(来自 tm 包)

dtm <- TermDocumentMatrix(
     myCorpus,
     control = list(
         weight = weightTfIdf,
         tolower=TRUE,
         removeNumbers = TRUE,
         minWordLength = 2,
         removePunctuation = TRUE,
         stopwords=stopwords("german")
      ))

当我做一个
typeof(dtm)

我看到它是一个“列表”,结构看起来像
Docs
Terms        1 2 ...
  lorem      0 0 ...
  ipsum      0 0 ...
  ...        .......

所以我尝试
wordMatrix = as.data.frame( t(as.matrix(  dtm )) ) 

这适用于 1000 个文档。

但是当我尝试使用 40000 时,它不再使用了。

我收到此错误:
Fehler in vector(typeof(x$v), nr * nc) : Vektorgröße kann nicht NA sein
Zusätzlich: Warnmeldung:
In nr * nc : NAs durch Ganzzahlüberlauf erzeugt

向量中的错误...:向量不能为 NA
额外的:
在整数溢出创建的 nr * nc NA


所以我查看了 as.matrix,结果发现该函数以某种方式将其转换为带有 as.vector 的向量,而不是矩阵。
转换为向量有效,但从向量到矩阵的转换无效。

你有什么建议可能是什么问题?

谢谢船长

最佳答案

整数溢出准确地告诉你问题是什么:有 40000 个文档,你有太多的数据。顺便说一句,问题是在转换为矩阵时开始的,如果您查看底层函数的代码,就可以看出:

class(dtm)
[1] "TermDocumentMatrix"    "simple_triplet_matrix"

getAnywhere(as.matrix.simple_triplet_matrix)

A single object matching ‘as.matrix.simple_triplet_matrix’ was found
...
function (x, ...) 
{
    nr <- x$nrow
    nc <- x$ncol
    y <- matrix(vector(typeof(x$v), nr * nc), nr, nc)
   ...
}

这是错误消息引用的行。发生了什么,可以通过以下方式轻松模拟:
as.integer(40000 * 60000) # 40000 documents is 40000 rows in the resulting frame
[1] NA
Warning message:
NAs introduced by coercion 

函数vector()接受一个带有长度的参数,在本例中为 nr*nc如果这大于 appx。 2e9 ( .Machine$integer.max ),它将被 NA 替换。此 NA 不能作为 vector() 的参数有效.

底线:您遇到了 R 的限制。至于现在,在 64 位上工作对您没有帮助。你将不得不求助于不同的方法。一种可能性是继续使用您拥有的列表(dtm 是一个列表),使用列表操作选择您需要的数据并从那里开始。

PS:我制作了一个 dtm 对象
require(tm)
data("crude")
dtm <- TermDocumentMatrix(crude,
                          control = list(weighting = weightTfIdf,
                                         stopwords = TRUE))

关于r - 将文档术语矩阵转换为包含大量数据的矩阵会导致溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6860715/

相关文章:

r - 获取列表行中的第一个条目?

r - 包 "Imports"未加载到 R 开发包中

r - R 上的插入符溢出 "unable to find variable "optimismBoot""错误消息

linux - 如何确定 Linux 中进程的最大内存使用量?

regex - 在正则表达式匹配时打印匹配的行和行±1(1行)

r - 基于向量向数据框添加几个变量

iphone - 返回用 NSNull 填充的数组的 NSMutableArray 类别中的泄漏

objective-c - 了解 cocoa 内存

Python tkinter 模块文本转换

text - 查找行,替换多行