Полное руководство по EDA и технике машинного обучения для задач классификации предложений.

Обзор проблемы

Обнаружение сарказма — это узкая область исследования в НЛП, цель которой — определить, является ли предложение сатирическим или несаркастическим. Сарказм распространен в социальных сетях, газетах и ​​имеет специфическое воздействие на слушателей, например, поддразнивание некоторых событий, нарушение их настроения ожиданий. Таким образом, правильное понимание иронии часто требует глубокого понимания нескольких источников информации, в том числе того, как она излагается, контекста разговора и часто некоторых реальных событий.

В этом посте мы стремимся ответить на вопрос, идентифицируем ли мы саркастические предложения автоматически с помощью методов ML/DL? Как эти приемы применяются в данном случае и их эффективность?

Стратегия решения проблемы

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

В своем посте я использовал Google Colab для выполнения этой задачи, потому что он предоставляет бесплатный графический процессор. Во-первых, активируйте среду выполнения графического процессора в Colab, нажав Среда выполнения > Изменить тип среды выполнения > Выбрать графический процессор.

Наше исследование состоит из следующих этапов:

  • Исследовательский анализ данных
  • Токенизация и предварительная обработка текстовых данных
  • Примените классическое машинное обучение, такое как Random Forest, Gaussian Naive Bayes, SVM, KNN.
  • Затем для повышения производительности мы создаем и обучаем модель Bert с помощью PyTorch на платформе HuggingFace.
  • Сравнение производительности моделей ML/DL

Показатели

Мы используем такие показатели производительности, как точность, полнота и F1-Score. это исходит из концепций истинно положительного, истинно отрицательного, ложноположительного и ложноотрицательного.

  • Точность — это мера того, сколько из сделанных положительных прогнозов верны.
  • Отзыв — это мера того, сколько положительных случаев правильно предсказал классификатор среди всех положительных случаев в данных. Иногда его также называют чувствительностью.
  • F1-Score — это показатель, сочетающий точность и полноту. Это обычно описывается как гармоническое среднее из двух. Гармоническое среднее — это просто еще один способ расчета «среднего» значения, обычно описываемый как более подходящий для соотношений (таких как точность и полнота), чем традиционное среднее арифметическое.

Исследовательский анализ данных

а. Распределение длины предложения и саркастического ярлыка

Из приведенного выше рисунка мы можем заметить, что:

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

Данные достаточно сбалансированы, поэтому нам не нужно использовать методы для несбалансированных классов, такие как недостаточная выборка, передискретизация, потеря фокуса… Достаточно обучения с использованием стандартной процедуры.

б. Облако слов и биграмма

Мы используем Word Cloud, метод визуализации данных, для представления текстовых данных с разным размером каждого слова, соответствующего его частоте или важности. В этом проекте мы используем библиотеку wordcloud для создания облака слов в Python.

Как видите, в этом наборе данных чаще всего встречаются слова о Дональде Трампе, нации, американце, отчете… Таким образом, мы можем предположить, что люди склонны высказывать язвительные высказывания о политике (Дональд Трамп, нация, американец).

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

Моделирование

а. Классическое машинное обучение

В первой попытке мы применяем классическое машинное обучение, такое как Random Forest, Gaussian Naive Bayes, SVM, KNN, для решения задачи классификации. Вы можете найти результаты этих методов в конце моего поста.

Эти вышеперечисленные алгоритмы были легко реализованы здесь благодаря scikit-learn. В scikit-learn средство оценки для классификации — это объект Python, который реализует методы fit(X_train, y_train) и predict(X_test).

Примером оценщика является класс RandomForestClassifier(), реализующий классификацию RandomForest. Код дается следующим образом:

б. Представления двунаправленного кодировщика от трансформаторов (BERT)

BERT — это современная модель, основанная на трансформаторах, разработанных Google. Его можно предварительно обучить, а затем настроить под конкретную задачу. Мы настроим bert на задаче классификации. Берта обучали двум задачам одновременно

  • Моделирование маскированного языка (MLM) - 15% токенов были замаскированы и обучены предсказывать замаскированное слово.
  • Предсказание следующего предложения (NSP) — Учитывая два предложения A и B, предскажите, следует ли B за A

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

В этом проекте мы выбрали тонкую настройку TinyBert из-за ограниченного аппаратного графического процессора для задачи классификации. Теперь давайте применим его к набору данных Sacratic. Подробности реализации можно найти здесь.

Сначала мы устанавливаем пакет трансформеров и импортируем следующие библиотеки. Обратите внимание, что мы используем предварительно обученную модель TinyBert из «prajjwal1/bert-tiny». Эта модель весит около 16 МБ, небольшого размера для быстрого обучения на нашем ПК.

Во-вторых, мы устанавливаем класс Python Dataset, который содержит метки и тексты из нашего набора данных. Чтобы инициализировать класс, мы делаем так, чтобы последний наследовал свойства torch.utils.data.Dataset, чтобы позже мы могли использовать полезные функции, такие как многопроцессорность. Там мы храним важную информацию, такую ​​как метки и текст на каждом проходе (get_batch_labels, get_batch_texts). Теперь, когда вызывается образец, соответствующий заданному индексу, генератор выполняет метод __getitem__ для его создания.

Для получения более подробной информации обратитесь к этому сообщению в блоге.

В-третьих, мы инициализируем сеть, определяя слои сети: уровень Берта для модели предварительной подготовки (загружен из концентратора HuggingFace), линейный слой с отсевом и повторной активацией .

Затем мы можем обучить модель с помощью Adam Optmizer для оптимизации CrossEntropyLoss. Затем мы запускаем цикл обучения, вводя входные данные через модель, а затем вычисляем наши потери по результатам модели. Градиент вычисляется с помощью backward(). Мы вызываем step(), чтобы оптимизировать вес модели в этой итерации. Эти вычисления выполняются Pytorch автоматически. Мы также рассчитываем показатель точности в каждой партии, а затем усредняем их в конце цикла обучения.

Настройка гиперпараметров для Берта

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

  • Число_эпох = 5, 7, 9, 10
  • Скорость обучения l = 0,0001, 0,001, 0,005
  • Размер партии = 8, 16, 32

Численные результаты

Мы суммируем производительность этих моделей машинного обучения в следующей таблице.

Как видите, TinyBert имеет лучшую производительность, чем другие методы, такие как Random Forest, Gaussian Naive Bayes, SVM, KNN.

Наши окончательные оценки производительности на TinyBert:

  • Оценка F1: 0,87
  • Точность: 0,87

Это хороший результат.

Заключение

Мы начали проект по автоматическому выявлению саркастических предложений с помощью техники ML/DL. После загрузки и очистки наших данных мы изучили некоторые характеристики набора данных. Затем мы предварительно обработали их и использовали функции с различными алгоритмами машинного обучения, такими как Random Forest, Gaussian Naive Bayes, SVm, KNN, Bert. Результаты показывают, что TinBert показал лучшие результаты, набрав 0,87 балла F1.

Репозиторий Github: Здесь

Будущая работа

Этот проект можно было бы улучшить за счет:

  • Примените самую модель SOTA в НЛП, чтобы улучшить результат. В этом посте мы отдаем предпочтение маленькой модели вместо использования модели большого размера, такой как Bert, Roberta, XLnets… Напоминаем, что TinyBert имеет только 16 МБ по сравнению с Bert (420 МБ), Roberta (478 МБ) и XLnet (539 МБ).
  • Более глубокое исследование проблем переобучения
  • Получите больше данных, чтобы повысить точность модели