r-处理甚至大于可用内存的quanteda对象



我正在处理一个1006150行3列的数据帧,其中每一行都包含维基百科资源的摘要:

>>> print(df)
individual                                           abstract               type
0                       -ismist_Recordings  "-ismist Recordings was founded in 1992 as -is...        RecordLabel
1                          –30–_(The_Wire)  ""–30–" is the series finale of the HBO origin...  TelevisionEpisode
2                                      !!!  "!!! is a dance-punk band that formed in Sacra...               Band
3                              !!!_(album)  "!!! is the eponymous debut studio album by ro...              Album
4                     !Arriba!_La_Pachanga  "!Arriba! La Pachanga is an album by Mongo San...              Album

目标是将抽象列向量化,以便提供文本模型。

问题是,在R中,当我尝试获取摘要列表来执行此转换时,我以一个大大小(约800MB(的变量结束,这会导致在我尝试运行矢量器或模型时内存不足。我已经从superml包中尝试了quanteda的dfm((和TfIdfVectorizer。有了quanteda,我得到了一个1.6 Gb大小的dfm(太大了,无法训练模型(,superml包抛出了一个内存错误:

> df <- read.csv(file="t.csv", stringsAsFactors = F)
> abstracts_list <- df$abstract
> object.size(abstracts_list)
806675688 bytes
> my_corpus <- corpus(df, text_field = "abstract", docid_field = "individual")
> tdm <- dfm(my_corpus, tolower=FALSE)
> tdm <- dfm_tfidf(tdm)
> object.size(tdm)
1572794560 bytes
> library("superml")
Loading required package: R6
> tf <- TfIdfVectorizer$new()
> tf$fit_transform(abstracts_list)
Error: no se puede ubicar un vector de tamaño  7822.6 Gb

如果我试图用1.9Gb dfm训练模型,就会发生这种情况:

> tmod <- textmodel_svm(tdm, y = tdm$type, weight = "uniform", verbose=TRUE)
Error in asMethod(object) : 
Cholmod error 'problem too large' at file ../Core/cholmod_dense.c, line 105

这个问题在Python中没有出现,所以我理解这是因为R试图加载内存中的所有内容。我试过ff包,但它对我不起作用,或者我不知道如何使用它。有什么方法可以解决这个问题吗?

更新:我也尝试过用word2vec进行矢量化,并使用了LibLineaR模型(这是quanteda的textmodel_svm使用的库(,但问题是我无法将模型放入内存中,我得到了Cholmod错误。有没有其他适合制作像LibLinear这样的svm模型的包内存?

更新2:在我正在使用的dfm中,rn有1006150个文档和1716098个功能。我只处理33%的数据,我也希望能够用3000000个文件进行测试,尽管目前这似乎是不可能的。在我的本地机器中,我有32 Gb的RAM

更新3:为了重现错误,我上传了dfm到驱动器,可以下载并使用以下代码进行测试:

library("quanteda")
library("quanteda.textmodels")
library(googledrive)
temp_rds_file <- tempfile(fileext = ".rds")
d_rds_file <- drive_download(
as_id("1E4ZPUbR98vLW5hmL0GYYQ-GYPDP7vriR"), path = temp_r_file, overwrite = TRUE)
tdm <- readRDS(d_rds_file$local_path)
tmod <- textmodel_svm(tdm, y = tdm$type, weight = "uniform", verbose=TRUE)

经过几天的调查,我发现了它失败的原因。

显然,函数textmodel_svm内部试图通过计算每个特征的方差来消除常量列(非方差特征(。为了计算方差,R将dfm转换为矩阵,并且在进行此转换时,Cholmod库确保它不会产生列数和前导维度(前导维度>=num行(的Integer溢出。

我在一个公开的帖子中对此发表了评论,更多信息请点击此处:https://github.com/quanteda/quanteda.textmodels/issues/23#issuecomment-853777401

最新更新