Как обучить модель предсказывать негативные комментарии?
Расскажем про построение модели, способной предсказать негативные комментарии.
Во-первых, подготовим датасет с размеченными данными. Все комментарии мы разделим на два класса: негативные (target — 1) и позитивные (target — 0).
Есть два типа классификации выборки: бинарная и мультиклассовая классификация. Для разметки текста на положительные и отрицательные комментарии мы будем использовать бинарную классификацию.
Во-вторых, подготовим текст для обучения, очистим его от лишних символов, цифр и иностранных букв, проведем Стемминг.
Стемминг – это грубый эвристический процесс, который оставляет начальную форму слова. У слов есть разные окончания, например: «Ручка», «Ручку», «Ручкам» компьютер воспринимает это как 3 разных слова, поэтому от слов нужно удалить концовки.
В-третьих, выберем модель, разделим наш датасет на обучающую и тестовую выборку, обучим и протестируем модель.
По результатам теста определим процент точности работы модели.
Итак, для начала импортируем библиотеки.
Загружаем подготовленный файл «user_comments_with_target.csv» и файл, на котором будем применять модель «isu_2020.csv» с помощью pandas.
Файл содержит лишние столбцы, оставляем только 2 нужных: сами комментарии и разметку. Пустые значения удаляем.
Мы создали функцию, которая проводит очистку текста и подготовку его к обучению:
- переводит текст в нижний регистр;
- удаляет латиницу, знаки препинания, символы и цифры;
- применяет Стемминг.
Пример работы стемминга:
Как видно из примера, стемминг удаляет концовки слов.
Также можно применять леммитизацию, которая приводит слова к начальной форме, благодаря этому получается более высокий процент точности. Стоит отметить минусы данного подхода, а именно: увеличивается время обработки и подход не всегда дает положительный результат.
Пример работы леммитизации с использованием библиотеки pymorphy2:
Слова «Ручкам» и «Ручки» pymorphy2 привел к начальной форме в нижнем регистре к слову «ручка».
В нашем случае по результатам обработки текста разница между стеммингом и леммитизацией практически отсутствует, отклонения составили сотые доли процента.
Обучение и тестирование модели.
После обучения модели нам нужно понять насколько верно модель определяет комментарии. Мы будем делать это по фактическим контрольным данным. Для этого мы оставим часть датасета для тестирования.
В переменную «X» мы записываем все наши неочищенные комментарии («user_comments»), а в переменную «Y» правильные ответы/классы («target»).
Разделим весь датасет на 2 выборки, одна выборка будет использоваться для обучения (X_ train, y_train), а вторая для тестирования качества предсказания модели (X_test, y_test).
В Vectorizer в параметры передаем нашу функцию и стоп-слова, в которые мы добавили ФИО сотрудников, встречающихся в комментариях, приведенные к начальной форме, тем самым Vectorizer будет работать с очищенным текстом.
Vectorizer удобен тем, что он при работе применяет токенизацию, векторизацию текста и скоринг TF-IDF.
Токенизация по предложениям – это процесс разделения письменного языка на предложения-компоненты.
Векторизация – процесс преобразование слов в числовые векторы для использования в алгоритмах.
TF-IDF (term-frequency – inverse document frequency) – это статистическая мера для оценки важности слова.
Для разделения предложений на компоненты можно использовать точку, пробел или любой другой символ в качестве разделителя, но в таком случае могут быть ошибки, например, точка может использоваться в сокращениях. Токенизация избавляет от таких ошибок.
Основная работа закончена, осталось обучить и применить модель.
В библиотеке scikit-learn есть реализация алгоритма Random Forest, с помощью которого мы будем обучать нашу модель. Random Forest уникальный алгоритм, придуманный еще в прошлом веке, который используется для многих задач и является самым популярным алгоритмом.
Результат точности предсказания негативных комментариев по метрике f1_score (мера точности в статистическом анализе бинарной классификации) равна 84%.
При использовании обученной модели на разметку 30 тыс. комментариев ушло всего 25 секунд. Исходя из нашего опыта разметки датасета, на это потребовалось бы примерно 100 человеко-часов.
Мы попросили экспертов провести перепроверку результата работы модели, и в 92% случаев модель смогла верно предсказать негативные комментарии.
Спасибо за статью. А почему именно random forest решили использовать?
Антон, спасибо! Считаем, что random forest - один из лучших алгоритмов машинного обучения. Он универсален, его можно использовать во многих задачах - классификация, кластеризация и других. Поэтому для решения этой задачи остановились на нем.
Можно разшарить датасэт?