Проблемы производительности с DocumentTermMatrix

Я пытаюсь создать две матрицы терминов документов следующим образом:

title_train <- DocumentTermMatrix(title_corpus_train, control = list(dictionary = title_dict))
title_test <- DocumentTermMatrix(title_corpus_test, control = list(dictionary = title_dict))

Первый имеет 75 тыс. строк, а второй - 25 тыс. строк. Поскольку я создал их, использование моей памяти почти достигло 7 ГБ.

Я хотел бы ускорить работу с этими матрицами более эффективным способом...

Я рассмотрел две возможности, но я не уверен, как реализовать любую из них:

  • Преобразование DocumentTermMatrix в data.table
  • Используйте пакет ff, чтобы сохранить их как ffdf

Может ли кто-нибудь предоставить какие-либо рекомендации или примеры того, как я могу ускорить работу с большой DocumentTermMatrix?

В конечном счете, я хотел бы иметь возможность поддерживать более 3 млн строк (в настоящее время я использую только подмножество из 100 тыс.).


person user1477388    schedule 10.07.2014    source источник
comment
Вам все еще нужно использовать какие-либо функции, для которых требуются объекты DocumentTermMatrix? Что еще вы планируете делать с данными. Обычно DocumentTermMatrices уже являются разреженными матрицами, поэтому они не должны быть слишком большими. Есть ли разумный способ уменьшить количество слов, которые вы отслеживаете? Вы определили содержание или потребовали минимальное/максимальное количество символов?   -  person MrFlick    schedule 10.07.2014
comment
@MrFlick Думаю, я уже уменьшил его, насколько это возможно. Я планирую передать DTM в следующие методы из пакета e1071, naiveBayes() и predict().   -  person user1477388    schedule 10.07.2014
comment
@MrFlick Можно ли преобразовать DTM в таблицу данных, а затем передать ее моим методам naiveBayes() и predict()?   -  person user1477388    schedule 10.07.2014
comment
Согласно документации naiveBayes() принимает data.frame, поэтому он также будет совместим с data.table. То же самое должно быть для predict() при использовании в результате. Я не знаю, наследуется ли ff от data.frame или нет.   -  person MrFlick    schedule 10.07.2014
comment
@MrFlick Я вижу, это звучит многообещающе. Итак, остается только преобразовать ЦМР в таблицу данных. Любая идея, если это возможно / как это сделать?   -  person user1477388    schedule 10.07.2014
comment
@MrFlick Я нашел эту stackoverflow.com/questions/12029177/, который показывает мне, как преобразовать разреженную матрицу (что, как я полагаю, представляет собой DTM) в data.frame. Это то, что я должен делать в этом случае? Просто ищу способ, чтобы моя оперативная память не иссякала.   -  person user1477388    schedule 11.07.2014
comment
Это зависит от формы, в которой вы хотите, чтобы ваши данные были. При преобразовании вам потребуется оперативная память, потому что все данные в DTM необходимо скопировать в data.table, чтобы они существовали в обоих местах. Если вам просто нужны кортежи (doc, word, freq), которые будут созданы этим методом, вы можете делать меньше документов за раз, поскольку процедура по существу является кумулятивной.   -  person MrFlick    schedule 11.07.2014
comment
@MrFlick Я не уверен, каков ответ на этот вопрос. Нет ли способа повысить эффективность моего приложения, которое 1) получает данные CSV в таблицу данных 2) преобразует данные в корпус и DTM 3 ) Запускает naiveBayes() и predict() и возвращает результаты. С более чем 100 тыс. строк моей машине не хватает памяти. Я ищу способ применить data.table или ff или какой-либо другой метод для решения этой проблемы.   -  person user1477388    schedule 11.07.2014
comment
@MrFlick Спасибо. Вы были правы. Я установил title_dict <- c(findFreqTerms(title_dtm_train, 5)) слишком низко. Я установил его выше, и это, похоже, увеличило производительность (как памяти, так и модели). Мне все еще нужно поддерживать набор данных, в несколько раз превышающий 100 тыс., Поэтому я все еще не уверен, как это сделать...   -  person user1477388    schedule 11.07.2014