Обработка ошибки памяти при работе с действительно большим количеством слов (> 100 миллионов) для анализа LDA - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть 50 000 тыс. Файлов - всего 162 млн. Слов. Я хотел сделать тематическое моделирование, используя Gensim, похожий на этот урок здесь

Итак, LDA требует разбить документы на слова, а затем создать словарь частоты слов.

Итак, у меня есть эти файлы, прочитанные в фрейм данных pandas (столбец 'content' содержит текст), и я делаю следующее, чтобы создать список текстов. изображение фрейма данных, прикрепленное здесь

texts = [[word for word in row[1]['content'].lower().split() if word not in stopwords] for row in df.iterrows()]

Однако я столкнулся с ошибкой памяти из-за большого количества слов.

Я также попробовал TokenVectorizer в Python. Я получил ошибку памяти для этого тоже.

def simple_tokenizer(str_input): words = re.sub(r"[^A-Za-z0-9\-]", " ", str_input).lower().split() return words

vectorizer = TfidfVectorizer( use_idf=True, tokenizer=simple_tokenizer, stop_words='english') X = vectorizer.fit_transform(df['content'])

Как мне обработать токенизацию этих действительно длинных документов так, чтобы их можно было обрабатывать для анализа LDA?

У меня есть рабочий стол i7, 16 ГБ, если это имеет значение.

EDIT

Поскольку Python не мог хранить действительно большие списки. Я фактически переписал код, чтобы прочитать каждый файл (изначально сохраненный в формате HTML), преобразовать его в текст, создать текстовый вектор, добавить его в список, а затем отправить его в код LDA. Это сработало!

1 Ответ

0 голосов
/ 05 сентября 2018

Итак, LDA требует, чтобы документ был разбит на слова, а затем создать словарь частоты слов.

Если из этого вывода вам нужен только словарь со счетчиком слов, я бы сделал следующее:

Обрабатывать файлы по одному в цикле. Таким образом, вы храните только один файл в памяти. Обработайте его, затем перейдите к следующему:

# for all files in your directory/directories:
with open(current_file, 'r') as f:
    for line in f:
        # your logic to update the dictionary with the word count

# here the file is closed and the loop moves to the next one

РЕДАКТИРОВАТЬ: Когда речь идет о проблемах с хранением в памяти действительно большого словаря, вы должны помнить, что Python резервирует много памяти для поддержания низкой плотности dict - цена за быстрый возможности поиска. Поэтому вы должны искать другой способ хранения пар ключ-значение, например, список кортежей, но стоимость поиска будет намного медленнее. Этот вопрос посвящен этому и содержит несколько хороших альтернатив, описанных там.

...