我使用R进行数据挖掘,就是我将它与elasticsearch连接起来并检索莎士比亚全集的数据集。
library("elastic")
connect()
maxi <- count(index = 'shakespeare')
s <- Search(index = 'shakespeare',size=maxi)
dat <- s$hits$hits[[1]]$`_source`$text_entry
for (i in 2:maxi) {
dat <- c(dat , s$hits$hits[[i]]$`_source`$text_entry)
}
rm(s)
因为我只想进行对话,所以我只能做到这一点。对象&#39;大约250 Mb和&#39; dat&#39;只有10 Mb。
之后我想做一个tf_idf矩阵,但显然我不能,因为它使用了太多的内存(我有4GB的RAM),这是我的代码:
library("tm")
myCorpus <- Corpus(VectorSource(dat))
myCorpus <- tm_map(myCorpus, content_transformer(tolower),lazy = TRUE)
myCorpus <- tm_map(myCorpus, content_transformer(removeNumbers),lazy = TRUE)
myCorpus <- tm_map(myCorpus, content_transformer(removePunctuation),lazy = TRUE)
myCorpus <- tm_map(myCorpus, content_transformer(removeWords), stopwords("en"),lazy = TRUE)
myTdm <- TermDocumentMatrix(myCorpus,control = list(weighting = function(x) weightTfIdf(x, normalize = FALSE)))
myCorpus大约是400 Mb。
但接下来我做了:
> m <- as.matrix(myTdm)
Error in vector(typeof(x$v), nr * nc) : vector size cannot be NA
In addition: Warning message:
In nr * nc : NAs produced by integer overflow
有什么想法吗?对数据集R来说太过分了吗?
修改
RemoveSparseTerms运行不正常,我使用sparse = 0.95并且它留下0个术语:
inspect(myTdm)
<<TermDocumentMatrix (terms: 27227, documents: 111396)>>
Non-/sparse entries: 410689/3032568203
Sparsity : 100%
Maximal term length: 37
Weighting : term frequency (tf)
答案 0 :(得分:3)
通常,术语文档矩阵包含许多零;许多术语只会出现在一个文档中。 tm
库将术语文档矩阵存储为稀疏矩阵,这是存储此类矩阵的一种节省空间的方法。 (您可以在此处详细了解tm
使用的存储格式:http://127.0.0.1:19303/library/slam/html/matrix.html)
当您尝试转换为常规矩阵时,这会降低空间效率并使R耗尽内存。您可以使用
在转换为矩阵之前removeSparseTerms
,尝试使整个矩阵足够小以便使用。
我很确定这是正在发生的事情但是很难确定无法在您的计算机上运行代码。