Как устранить перегрузку памяти, передавая итератор в CountVectorizer? - PullRequest
0 голосов
/ 19 апреля 2019

Я работаю над извлечением текстовых объектов из большого набора данных документов (около 15 миллионов документов) с использованием CountVectorizer.Я также рассмотрел HashingVectorizer как альтернативу, но я думаю, что CountVectorizer - это то, что мне нужно, так как оно предоставляет больше информации о текстовых функциях и других вещах.

Проблема здесь довольно распространенная: я неПри установке модели CountVectorizer памяти недостаточно.

def getTexts():
    # an iterator that will yield each document from the database

vectorizer = CountVectorizer(max_features=500, ngram_range=(1,3))
X = vectorizer.fit_transform(getTexts())

Здесь, скажем, у меня есть итератор, который будет выдавать один документ за раз из базы данных.Если я передам этот итератор в качестве параметра функции CountVectorizer fit(), как будет построен словарь?Ожидает ли он завершения загрузки всех документов, а затем выполняет fit() один раз или загружает по одному документу за раз, выполняет подгонку, а затем загружает следующий?Как можно решить проблему нехватки памяти здесь?

1 Ответ

1 голос
/ 19 апреля 2019

Причина, по которой CountVectorizer потребляет гораздо больше памяти, заключается в том, что CountVectorizer необходимо хранить словарь словаря в памяти, однако HashingVectorizer имеет лучшую производительность памяти, поскольку ему не нужно хранить словарь словаря,Основное различие между этими двумя векторизаторами упоминается в Doc из HashingVectorizer:

Эта стратегия имеет несколько преимуществ:

  • она оченьмалая память, масштабируемая до больших наборов данных, так как нет необходимости хранить словарный словарь в памяти
  • он быстро выбирает и отменяет выбор, так как не содержит состояния, кроме параметров конструктора
  • использоваться в потоковом (частичное соответствие) или параллельном конвейере, поскольку во время подгонки состояние не вычисляется.

Есть также несколько минусов (по сравнению с использованием CountVectorizer со словарем в памяти):

  • нет способа вычислить обратное преобразование (от индексов объектов до имен строк), что может быть проблемой при попытке проанализировать, какие функции наиболее важны для модели.
  • могут быть коллизии: отдельные токены могут быть сопоставлены с одним и тем же индексом функции.Однако на практике это редко является проблемой, если n_features достаточно велик (например, 2 ** 18 для задач классификации текста).
  • нет взвешивания IDF, так как это сделает преобразователь с состоянием.

И, конечно же, CountVectorizer будет загружать по одному документу за раз, выполнять подгонку, а затем загружать следующий.В этом процессе CountVectorizer создаст свой словарный словарь по мере увеличения использования памяти.

Чтобы оптимизировать память, вам может потребоваться уменьшить размер набора данных документа или также может быть указан более низкий параметр max_features.Помогите.Однако, если вы хотите полностью решить эту проблему с памятью, попробуйте использовать HashingVectorizer вместо CountVectorizer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...