Сбой dfm () на очень большом объекте токенов после того, как NA введены целочисленным принуждением - PullRequest
0 голосов
/ 05 июня 2019

Я работаю с quanteda (R 3.6.0, Linux, 64-bit) в очень большой текстовой базе данных (> 20 ГБ). Вот код, который я использую:

options(echo=TRUE)
library(parallel)
library(doParallel)
registerDoParallel(8)
library(data.table)
library(stringr)
library(tidyr)
library(quanteda)
quanteda_options(threads=8)
data <- fread("county_monthly_baskets.csv")
degreedays <- fread("us_degreedays_long.csv")
data <- merge(data,degreedays,by=c('stcountyfp','month','year'),all=TRUE,allow.cartesian=TRUE)
z_cdd90 <- data[["z_cdd90"]]
heatTokens <- tokens(data$text, remove_punct=TRUE, remove_symbols=TRUE)
heatTokens <- tokens_compound(heatTokens, pattern=phrase(c('not stated','no usda organic seal on pkg','not applicable','n a','non refillable')))
heatTokens <- tokens_compound(heatTokens, pattern=phrase(c('low *','no *', 'rd *', 'reduced *', 'less *', 'not *', 'non *', 'vitamin a d')))
heatTokens <- tokens_remove(heatTokens, pattern=c('na'))
heatTokens <- tokens_remove(heatTokens,pattern=c('NOT_STATED','NO_USDA_ORGANIC_SEAL_ON_PKG','NOT_APPLICABLE','N_A','REGULAR','NON_REFILLABLE','NA'))
heatTokens <- tokens_select(heatTokens, min_nchar=3L)
heatTokens <- tokens_ngrams(heatTokens, n=1:2)
saveRDS(z_cdd90,file="z_cdd90.rds")
saveRDS(heatTokens,file="heatTokens.rds")
heatTokens <- readRDS("heatTokens.rds")
heatDfm <- dfm(heatTokens)
heatDfm <- dfm_trim(heatDfm, min_termfreq=100)
saveRDS(heatDfm,file="heatDfm.rds")
heatDfm_tfidf <- dfm_tfidf(heatDfm, scheme_tf="count", scheme_df="inverse")
saveRDS(heatDfm_tfidf,file="heatDfm_tfidf.rds")

Токенизация работает нормально, поэтому все в приведенном выше коде, вплоть до «heatDfm», работает успешно. Однако создание объекта dfm завершается неудачно со следующей ошибкой:

Error in if ((lp <- length(p)) < 1 || p[1] != 0 || any((dp <- p[-1] -  :   missing value where TRUE/FALSE needed
Calls: dfm ... initialize -> callNextMethod -> .nextMethod -> sparseMatrix
In addition: Warning message:
In sparseMatrix(j = index, p = cumsum(c(1, lengths(x))) - 1, x = 1L,  :  NAs introduced by coercion to integer range
Execution halted

Я предполагаю, что это потому, что частота некоторых токенов превышает целое число. Max. Есть ли способ использовать класс integer64 из пакета bit64 с dfm (), чтобы обойти это? Я предполагаю, что вызова библиотеки (bit64) одного недостаточно. В противном случае, я предполагаю, что мог бы просто отбросить наиболее часто используемые токены, прежде чем создавать dfm в качестве обходного пути, но я хотел бы избежать этого, если это возможно. Я повторил эту проблему на последней версии Quanteda от CRAN (1.4.3), а также на версии разработки github (1.4.5) от 3 июня.

...