Добрый день, уважаемые читатели. Сегодня мы реализуем анализ настроения, а именно определим, является ли комментарий на русском языке «токсичным».

Мы будем использовать библиотеки Keras для построения модели, pandas для обработки данных, некоторые функции sklearn и matplotlib для визуализации процесса обучения нейронной сети.

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

Подпишись на группу Вконтакте и Телеграм-канал. Там еще больше полезного контента для программистов.

А на моем YouTube-канале ты найдешь обучающие видео по программированию. Подписывайся!

Начало работы

Я создал notebook в Kaggle, взяв данные из этого датасета.

Для начала импортируем все необходимые нам модули.

Начнём с начала:

  • os — для работы с файловой системой
  • numpy — для работы с массивами
  • pandas — для загрузки данных из .csv файла и обработки их с помощью DataFrame
  • keras — для построения модели
  • keras.preprocessing.Text — для обработки текста, чтобы подать его в числовом виде для обучения нейронной сети
  • sklearn.train_test_split — для отделения тестовых данных от тренировочных
  • matplotlib — для визуализации процесса обучения
  • sklearn.normalize — для нормализации тестовых и обучающих данных

Загрузим данные, узнав имя файла благодаря конструкции:

Сама загрузка осуществляется с помощью функции read_csv:

Обработка данных

Теперь удалим символы новой строки из текстовых данных:

Из первых пяти строк таблицы стало ясно, что колонка toxic имеет вещественный тип. А ведь именно это и является нашей «целью». Приведём их к целочисленному типу и сохраним в отдельную переменную.

Теперь про обработку текста. Мы могли бы создать кучу функций, которые бы разбивали текст на слова, подсчитывали их кол-во, частоту и т. д. Однако Keras обладает улучшенным программным интерфейсом (хотя отдельные функции в том же подмодуле так же имеются) в виде класса Tokenizer. Создадим его экземпляр:

Кратко пройдёмся по параметрам:

  • num_words — кол-во фиксируемых слов (самых часто встречающихся)
  • filters — последовательность символов, которые будут удаляться.
  • lower — булевый параметр, отвечающий за то, будет ли переведён текст в нижний регистр
  • split — основной символ разбиения предложения
  • char_level — указывает на то, будет ли считаться отдельный символ словом.

Документацию по этому классу можно найти здесь.

Теперь преобразуем наш набор текста с помощью этого класса:

14 тысяч строк (образцов) и 30000 столбцов — признаков. Метод text_to_matrix имеет параметр mode, который может принимать 4 значения:

  • binary — вернёт массив, состоящий из 0 и 1, где каждый флаг будет отвечать за то, присутствует определённое слово в тексте.
  • count — простой счетчик слов
  • tfidf — текстовая обратная оценка частоты документа (TF-IDF) для каждого слова
  • freq — частота каждого слова в соответствии с другими

Теперь построим модель из двух слоёв: Dense и Dropout. Про оба эти слоя рассказывалось в предыдущих статья, советую их прочитать, если не ознакомлены с материалом.

Нормализируем нашу матрицу и разобьём данные на тестовые и тренировочные:

Обучение модели анализ настроения

Теперь приступим к обучению модели, выполняющую анализ настроения, сохранив историю в отдельную переменную. Установим счетчик эпох, равным 150, а размер батча — 500.

Не буду демонстрировать полный отчёт про обучение, покажу лишь сведения о последней итерации:

Точность на тренировочных данных составила 0.87, т. е. 87%.

Визуализируем процесс обучения с помощью matplotlib.

Здесь переменная history — словарь с четырьмя ключами:

  • acc
  • val_acc
  • loss
  • val_loss

По каждому ключу имеется доступ к массиву, который имеет размерность (epochs, ).

С помощью простых манипуляций получаем вывод:

Out[11]:

Как мы видим, модель вышла примерно на 75-ой эпохе, а дальше кол-во ошибок росло с каждой эпохой. Попробуйте изменить гиперпараметры модели, кол-во слоёв и посмотреть на результат. Так сказать, добавим интерактива.

Заключение

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

Результат не расстроил: точность в 0.85 довольно неплохой результат. Сказать честно, я, прочитав некоторые комментарии из набора, сам не смог определить их к нормальным или токсичным :)

Документ .ipynb с кодом из статьи можно найти здесь.

Также рекомендую прочитать статью Ансамбль с мажоритарным голосованием на Python. Подпишитесь на группу ВКонтакте, Telegram и YouTube-канал. Там еще больше полезного и интересного для разработчиков.