让我们做一些文本挖掘
在这里,我站在一个文档术语矩阵(来自 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/