Как преобразовать большой токенизированный dfm в матрицу в R? - PullRequest
0 голосов
/ 05 августа 2020

У меня есть большой токенизированный dfm размером 2656242 x 630566. Я хочу преобразовать его в матрицу, но любая операция с этим дает мне следующую ошибку:

Ошибка в asMethod (object): ошибка Cholmod «проблема слишком велика» в файле ../Core/cholmod_dense.c, строка 105

Мой код до сих пор выглядит следующим образом:

Booker_PreSale = Samp2 %>% filter(Booking_Status=="Booker" & Pre_Post_Sale=="Pre-Sale")
Non_Booker_PreSale = Samp2 %>% filter(Booking_Status=="Non-Booker" & Pre_Post_Sale=="Pre-Sale")
data = rbind(Booker_PreSale,Non_Booker_PreSale)
data = data[,c(5,2)]
data = na.omit(data)
data$Booking_Status = as.factor(data$Booking_Status)
data$TextLength = nchar(as.character(data$comments))
    
library(caret)
set.seed(32984)
indexes = createDataPartition(data$Booking_Status,times = 1,
                              p=0.7,list = FALSE)

train = data[indexes,]
test = data[-indexes,]

library(quanteda)

train_tokens = tokens(as.character(train$comments), what = "word", 
                      remove_numbers = TRUE, remove_punct = TRUE,
                      remove_symbols = TRUE, remove_hyphens = TRUE)

train_tokens = tokens_tolower(train_tokens)
train_tokens = tokens_select(train_tokens, stopwords(), 
                              selection = "remove")

train_tokens = tokens_wordstem(train_tokens, language = "english")

train_tokens_dfm = dfm(train_tokens, tolower = FALSE)
train_tokens_matrix = as.matrix(train_tokens_dfm[,c(1:500)])

Я не могу дальше исходить из этого. Нужна помощь в решении этой проблемы.

Заранее спасибо.

1 Ответ

0 голосов
/ 05 августа 2020

Похоже, ваш dfm слишком большой. Поэтому сначала спросите себя, действительно ли вам нужно преобразовать объект dfm в матрицу. Если вы хотите подобрать модель (например, модель topi c), которая принимает ваши токенизированные документы в качестве входных данных, вам, скорее всего, не нужно преобразовывать объект dfm в матрицу!

Если вы этого не сделаете явно нужна матрица, я бы рекомендовал сначала преобразовать ваш объект dfm в формат, отличный от квантового; это может быть достигнуто с помощью

non_dfm <- quanteda::convert(train_tokens_dfm).

Затем вы можете извлечь содержимое dfm в виде списка списков, используя dfm_list<-non_dfm$vocab. Каждый элемент списка связан с документом и содержит две строки: первая строка дает индекс токена, а вторая строка - количество вхождений этого токена в документ. Таким образом, у вас есть точно такая же информация, которая содержится в матрице характеристик документа.

...