Практическое руководство по NLP изучаем классификацию текстов с помощью библиотеки fastText

Практическое руководство по NLP изучаем классификацию текстов с помощью библиотеки fastText

Классификация текстов – метод машинного обучения, используемый для их фрагментации на категории. Классификация текста является одной из фундаментальных задач в обработке естественного языка с широким применением: анализ сентиментов, маркировка тем, обнаружение спама, намерений клиентов и т.д. Обученные модели классификации текстов также нужны для исследовательских целей.

fastText – популярная библиотека с открытым исходным кодом для классификации текстов, которая была опубликована в 2015 году исследовательской лабораторией искусственного интеллекта Facebook. Компания также предоставляет модели: English word vectors (предварительно обучена английскому webcrawl и Википедии) и Multi-lingual word vectors (обученные модели для 157 различных языков), которые позволяют создать алгоритмы Supervised и Unsupervised learning для получения векторных представлений слов. Библиотеку можно использовать как инструмент командной строки или как пакет Python. В этой статье мы рассмотрим ее применение для классификации новостных заголовков.

Подготовка среды и данных

Загружаем необходимые библиотеки

Данные

Датасет представляет собой коллекцию заголовков новостных статей и их аннотацию как сарказм (статьи из новостного издания The Onion ) и не сарказм (из HuffPost ). Ссылка на данные: https://www.kaggle.com/rmisra/news-headlines-dataset-for-sarcasm-detection

Переменные

  • is_sarcastic : 1 если заголовок с сарказмом, в противном случае 0
  • headline : заголовок новостной статьи
  • article_link : ссылка на оригинальную статью
article_link headline is_sarcastic
https://www.huffingtonpost.com/entry/versace-black-code_us_5861fbefe4b0de3a08f600d5 former versace store clerk sues over secret ‘black code’ for minority shoppers 0
https://www.huffingtonpost.com/entry/roseanne-revival-review_us_5ab3a497e4b054d118e04365the the ‘roseanne’ revival catches up to our thorny political mood, for better and worse 0
https://local.theonion.com/mom-starting-to-fear-son-s-web-series-closest-thing-she-1819576697 mom starting to fear son’s web series closest thing she will have to grandchild 1

Приведем несколько примеров саркастических и не саркастических заголовков:

article_link headline is_sarcastic
https://local.theonion.com/mom-starting-to-fear-son-s-web-series-closest-thing-she-1819576697 mom starting to fear son’s web series closest thing she will have to grandchild 1
https://politics.theonion.com/boehner-just-wants-wife-to-listen-not-come-up-with-alt-1819574302 boehner just wants wife to listen, not come up with alternative debt-reduction ideas 1
https://politics.theonion.com/top-snake-handler-leaves-sinking-huckabee-campaign-1819578231 top snake handler leaves sinking huckabee campaign 1
article_link headline is_sarcastic
https://www.huffingtonpost.com/entry/versace-black-code_us_5861fbefe4b0de3a08f600d5 former versace store clerk sues over secret ‘black code’ for minority shoppers 0
https://www.huffingtonpost.com/entry/roseanne-revival-review_us_5ab3a497e4b054d118e04365 the ‘roseanne’ revival catches up to our thorny political mood, for better and worse0 0
https://www.huffingtonpost.com/entry/jk-rowling-wishes-snape-happy-birthday_us_569117c4e4b0cad15e64fdcb j.k. rowling wishes snape happy birthday in the most magical way 0

Подготовка данных

Предварительная обработка текста

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

Разделение данных на обучающие и тестовые

Прежде чем мы начнем обучение модели, нужно разделить данные так . Чаще всего для обучения модели используется 80% информации (в зависимости от объема данных размер выборки может варьироваться) и 20% – для тестирования (проверки точности).

Создание текстового файла

Далее нам нужно подготовить файлы в формате txt . Формат файла по умолчанию должен включать __label__ <Label> <Text> . Мы можем использовать другой префикс вместо __label__ , соответствующим образом изменив параметр во время обучения. В нашем датасете __ label __0 подразумевает отсутствие сарказма, а __label __1 подразумевает сарказм.

Построение модели

Для обучения модели необходимо задать fastText входной файл и ее имя:

Результаты, хотя и не идеальные, выглядят многообещающими.

Оптимизация гиперпараметров

Поиск наилучших гиперпараметров вручную может занять много времени. По умолчанию модель fastText во время обучения включает каждый обучающий пример только пять раз, что довольно мало, учитывая, что в нашем наборе всего 12 тыс. примеров. Количество просмотров каждого примера (также известное как количество эпох) может быть увеличено с помощью ручной оптимизации epoch :

Как можно заметить, точность модели не возрасла. Еще один способ изменить скорость процесса – увеличить (или уменьшить) скорость обучения алгоритма. Это соответствует тому, насколько сильно меняется модель после обработки каждого примера. Скорость обучения равная 0 будет означать, что модель вообще не меняется и, следовательно, ничему не учится. Хорошие значения скорости обучения находятся в диапазоне 0.1 – 1.0 . Мы также можем вручную оптимизировать этот гиперпараметр с помощью аргумента lr :

Наконец, мы можем улучшить производительность модели, используя биграммы слов, а не просто юниграммы. Это особенно значимо для задач классификации, где важен порядок слов, например, анализ сентиментов, определение критики, сарказма и т. д. Для этого мы включим в модель аргумент wordNgrams равный 2.

Благодаря этой последовательности шагов мы смогли перейти от точности в 86%:

  • предварительная обработка текста;
  • изменение количества эпох (с использованием аргумента epoch , стандартный диапазон [5 – 50] ) ;
  • изменение скорости обучения (с использованием аргумента lr , стандартный диапазон [0,1 – 1,0] ) ;
  • используя n-граммы слов (используя аргумента wordNgrams , стандартный диапазон [1-5] ).

Вы также можете адаптировать поиск гиперпараментров через оценку определенного лейбла, добавив аргумент autotuneMetric :

Функция автоматической настройки fastText позволяет оптимизировать гиперпараметры для получения наивысшего показателя F1. Для этого необходимо включить модель аргумент autotuneValidationFile и тестовый датасет:

Сохраним результаты модели и создадим функцию для классификации новых данных:

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

Результаты

Мы можем проверить результаты на новых данных, введя любое предложение:

Метка результата с максимальной вероятностью равна __label__0 . Это означает, что заголовок не является саркастическим. В model.predict() значение k обозначает количество лейблов, которые вы хотите показать вместе с их показателями вероятности. Поскольку мы использовали активацию softmax (по умолчанию в fastText), сумма вероятностей двух меток равна 1.

Мы также можем симулировать новые данные и проверить модели на реальных заголовках. Для этого будет использовать News Aggregator Dataset из Kaggle:

Применим функцию классификацию текста к новым заголовкам и создадим переменные с прогнозируемым лейблом и его вероятностью:

Мы видим, что 28% заголовков были классифицированы как сарказм.

Заключение

В заключение следует отметить, что fastText не является одной из самых последних разработок классификации текстов (библиотека была опубликована в 2015 году). В то же время это хорошая основа для новичков: при выполнении NLP-классификации текстов любой сложности, модель имеет существенное преимущество из-за простоты ее использования, скорости обучения и автоматической настройки гиперпараметров. Подробнее с документацией fastText можно ознакомится по ссылке .