让我们做一些文本挖掘
这里我站着一个文档术语矩阵(来自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由整数溢出创建的NAs
所以我看了as.matrix,事实证明,该函数不知何故将它转换为带有as.vector的向量而不是矩阵。 转换为向量但不是从向量到矩阵的转换。
你有什么建议可能是什么问题吗?
谢谢,船长
答案 0 :(得分:17)
整数溢出会告诉您究竟是什么问题:对于40000文档,您有太多数据。它是在转换为矩阵时问题从btw开始,如果你看一下底层函数的代码就可以看到它:
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))
答案 1 :(得分:3)
这是我最近发现的一个非常简单的解决方案
DTM=t(TDM)#taking the transpose of Term-Document Matrix though not necessary but I prefer DTM over TDM
M=as.big.matrix(x=as.matrix(DTM))#convert the DTM into a bigmemory object using the bigmemory package
M=as.matrix(M)#convert the bigmemory object again to a regular matrix
M=t(M)#take the transpose again to get TDM
请注意,转换TDM来获取DTM绝对是可选的,我个人喜欢以这种方式使用矩阵
P.S. 4年前不能回答这个问题,因为我刚刚进入我的大学答案 2 :(得分:0)
根据Joris Meys的回答,我找到了解决方案。 &#34;矢量()&#34;有关&#34;长度&#34;的文档论证
... 对于长矢量,即长度> 1。 .Machine $ integer.max,它必须是&#34; double&#34; ...
的类型
所以我们可以对as.matrix()进行微小的修复:
as.big.matrix <- function(x) {
nr <- x$nrow
nc <- x$ncol
# nr and nc are integers. 1 is double. Double * integer -> double
y <- matrix(vector(typeof(x$v), 1 * nr * nc), nr, nc)
y[cbind(x$i, x$j)] <- x$v
dimnames(y) <- x$dimnames
y
}