我正在处理一个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