- PVSM.RU - https://www.pvsm.ru -

Парсим Википедию для задач NLP в 4 команды

Суть

Оказывается для этого достаточно запуcтить всего лишь такой набор команд:

git clone https://github.com/attardi/wikiextractor.git
cd wikiextractor
wget http://dumps.wikimedia.org/ruwiki/latest/ruwiki-latest-pages-articles.xml.bz2
python3 WikiExtractor.py -o ../data/wiki/ --no-templates --processes 8 ../data/ruwiki-latest-pages-articles.xml.bz2

и потом немного отполировать скриптом [1] для пост-процессинга

python3 process_wikipedia.py

Результат — готовый .csv файл с вашим корпусом.

Понятное дело, что:

  • http://dumps.wikimedia.org/ruwiki/latest/ruwiki-latest-pages-articles.xml.bz2 можно поменять на нужный вам язык, больше деталей тут [4] [2];
  • Всю информацию о параметрах wikiextractor можно найти в мануале (кажется даже официальная дока не обновлялась, в отличие от мана);

Скрипт с пост-процессингом конвертирует вики файлы в такую таблицу:

idx article_uuid sentence cleaned sentence cleaned sentence length
0 74fb822b-54bb-4bfb-95ef-4eac9465c7d7 Жан I де Шатильон (граф де Пентьевр)Жан I де Ш... жан i де шатильон граф де пентьевр жан i де ша... 38
1 74fb822b-54bb-4bfb-95ef-4eac9465c7d7 Находился под охраной Роберта де Вера, графа О... находился охраной роберта де вера графа оксфор... 18
2 74fb822b-54bb-4bfb-95ef-4eac9465c7d7 Однако этому воспротивился Генри де Громон, гр... однако этому воспротивился генри де громон гра... 14
3 74fb822b-54bb-4bfb-95ef-4eac9465c7d7 Король предложил ему в жёны другую важную особ... король предложил жёны другую важную особу фили... 48
4 74fb822b-54bb-4bfb-95ef-4eac9465c7d7 Жан был освобождён и вернулся во Францию в 138... жан освобождён вернулся францию году свадьба м... 52

article_uuid — псевдо-уникальный ключ, порядок предложений по идее должен сохраниться после такого пре-процессинга.

Зачем

Пожалуй, на настоящий момент развитие ML-инструментов достигло такого уровня [8], что для построения работающей NLP модели / пайплайна достаточно буквально пары дней. Проблемы возникают только при отсутствии надежных датасетов / готовых эмбеддингов/ готовых языковых моделей. Цель данной статьи — немного облегчить вашу боль, показав, что для обработки всей Википедии (по идее самого популярного корпуса для тренировки эмбеддингов слов в NLP) хватит и пары часов. В конце концов, если достаточно пары дней, чтобы построить простейшую модель, зачем тратить куда больше времени на получение данных для этой модели?

Принцип работы скрипта

wikiExtractor сохраняет статьи из Вики в виде текста, разделенного <doc> блоками. Собственно, в основе скрипта лежит следующая логика:

  • Берём список всех файлов на выходе;
  • Делим файлы на статьи;
  • Удаляем все оставшиеся HTML теги и специальные символы;
  • С помощью nltk.sent_tokenize разделяем на предложения;
  • Чтобы код не разросся до огромных размеров и остался читаемым, каждой статье присваиваем свой uuid;

В качестве препроцессинга текста просто (можно легко перепилить под себя):

  • Удаляем небуквенные символы;
  • Удаляем стоп-слова;

Датасет есть, что теперь?

Основное применение

Чаще всего на практике в NLP приходится сталкиваться с задачей построения эмбеддингов.

Для ее решения обычно используют один из следующих инструментов: :

  • Готовые векторы / эмбеддинги слов [6];
  • Внутренние состояния CNN, натренированных на таких задачах как, как определение фальшивых предложений / языковое моделирование / классификация [7];
  • Комбинация выше перечисленных методов;

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

Другие варианты использования

  • Используем случайные предложения из Вики в качестве негативных примеров для triplet loss-а;
  • Обучаем энкодеры для предложений с помощью определения фальшивых фраз [10];

Немного графиков для русской Вики

Распределение длины предложений для Русской Википедии

Без логарифмов (по оси X значения ограничены числом 20)

Парсим Википедию для задач NLP в 4 команды - 1

В десятичных логарифмах

Парсим Википедию для задач NLP в 4 команды - 2

Ссылки

  1. Fast-text векторы [3] слов, натренированные на Вики;
  2. Fast-text и Word2Vec модели [4] для русского языка;
  3. Потрясающая wiki extractor библиотека [5] для питона;
  4. Официальная страница [2] с ссылками для Вики;
  5. Наш скрипт [1] для пост-процессинга;
  6. Основные статьи про эмбеддинги слов: Word2Vec [6], Fast-Text [7], тюнинг [8];
  7. Несколько текущих SOTA подходов:
    1. InferSent [9];
    2. Generative pre-training [10] CNN;
    3. ULMFiT [11];
    4. Контекстные подходы для представления [12] слов (Elmo);
  8. Imagenet moment в NLP [13]?
  9. Бейслайны для эмбеддингов предложений 1 [14], 2 [15], 3 [16], 4 [17];
  10. Определение фальшивых фраз [18] для энкодера предложений;

Автор: Alexander

Источник [19]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/python/294945

Ссылки в тексте:

[1] скриптом: https://gist.github.com/snakers4/e0b0e68904db65671ca979639b337f7b

[2] [4]: https://dumps.wikimedia.org/backup-index.html

[3] векторы: https://fasttext.cc/docs/en/pretrained-vectors.html

[4] модели: http://rusvectores.org/ru/models/

[5] библиотека: https://github.com/attardi/wikiextractor.git

[6] Word2Vec: http://arxiv.org/abs/1607.04606

[7] Fast-Text: http://arxiv.org/abs/1712.09405

[8] тюнинг: http://arxiv.org/abs/1802.06893

[9] InferSent: http://arxiv.org/abs/1705.02364

[10] pre-training: https://blog.openai.com/language-unsupervised/

[11] ULMFiT: http://arxiv.org/abs/1801.06146

[12] представления: http://arxiv.org/abs/1802.05365

[13] NLP: https://thegradient.pub/nlp-imagenet/

[14] 1: https://openreview.net/pdf?id=SyK00v5xx

[15] 2: http://nlp.town/blog/sentence-similarity/

[16] 3: https://arxiv.org/abs/1806.06259

[17] 4: http://www.offconvex.org/2018/09/18/alacarte/

[18] фальшивых фраз: https://arxiv.org/abs/1808.03840

[19] Источник: https://habr.com/post/425507/?utm_source=habrahabr&utm_medium=rss&utm_campaign=425507