Как подготовить модель фразы из огромного массива статей (википедия)? - PullRequest
0 голосов
/ 23 января 2019

Я хотел бы создать большой словарь для французского языка gensim, чтобы попытаться получить лучшие результаты в обнаружении тем, сходства между текстами и тому подобное. Поэтому я планировал использовать дамп википедии и обработать его следующим образом:

  1. Извлечение каждой статьи из frwiki-YYYYMMDD-pages-articles.xml.bz2 (выполнено)
  2. Токенизация каждой статьи (в основном преобразование текста в строчные буквы, удаление стоп-слов и несловесных символов) (Готово)
  3. Обучите модель фраз на предметах, чтобы обнаружить коллокацию.
  4. Получите жетоны в каждой статье.
  5. Заполнить словарь новым корпусом (по одному тексту с токеном в строке)

Из-за очень большого размера корпуса я ничего не храню в памяти и не получаю доступ к корпусу через smart_open, но, похоже, модель фраз gensim потребляет слишком много оперативной памяти для выполнения третьего шага.

Вот мой пример кода:

corpus = smart_open(corpusFile, "r")
phrases = gensim.models.Phrases()
with smart_open(phrasesFile, "wb") as phrases_file:
    chunks_size = 10000
    texts, i = [], 0
    for text in corpus:
        texts.append(text.split())
        i += 1
        if i % chunks_size == 0:
            phrases.add_vocab(texts)
            texts = []
    phrases.save(phrases_file)
corpus.close()

Есть ли способ завершить операцию, не замораживая компьютер, или мне придется обучать модель фраз только на подмножестве моего корпуса?

1 Ответ

0 голосов
/ 23 января 2019

Я отвечаю сам, потому что понял, что забыл разобраться с некоторыми параметрами памяти в классе Phrases.

Итак, сначала я разделил max_vocab_size на 2, чтобы он занимал меньше памяти, а такжеЯ решил сохранять объект Phrases каждые 100 000 статей, а затем перезагружать его из сохраненного файла, поскольку подобные уловки показали, что они могут быть полезны с некоторыми другими классами в библиотеке gensim ...

ЗдесьЭто новый код, возможно, немного медленнее, но он успешно выполнил задачу:

corpus = smart_open(corpusFile, "r")
max_vocab_size=20000000
phrases = Phrases(max_vocab_size=max_vocab_size)
chunks_size = 10000
save_every = 100000
texts, i = [], 0
for text in corpus:
    texts.append(text.split())
    i += 1
    if i % chunks_size == 0:
        phrases.add_vocab(texts)
        texts = []
    if i % save_every == 0:
        phrases.save(phrasesFile)
        phrases = Phrases.load(phrasesFile)
corpus.close()
phrases.save(phrasesFile)

В моем случае 412 816 фраз в моем случае после помещения всего этого в объект Phraser.

...