Исходная задача: Обучение классификатора, определящего вероятность того, что комментарий о банке является негативным.
Датасет найден на kaggle и содержит 7,5к отзывов про банковское приложение.
Из признаков:
- сам отзыв (русский текст);
- заголовок, дата публикации;
- имя пользователя;
- ответ на отзыв со стороны банка;
- флаг: правилось ли сообщение пользователем.
GT в данном случае является рейтинг, который пользователь выставляет приложению. Из числового формата отзыва (1 - 5 звезд) был получен таргет, используя бинаризацию: отзыв признается негативным, если рейтинг < 2.
-
conda create --name test python=3.7
-
pip3 install -r requirements.txt
-
Для тренировки: python train.py
Для тестирования: python inference.py --review 'Очень классно'
Файл train.py содержит обучение лучшей модели из найденных. Файл 'sentiment analysis.ipynb' содержит исследования и отбор лучшей модели. inference.py содержит код для прогноза тональности, написанного на клавиатуре отзыва.
Для нахождения оптимальных гиперпараметров модели использовалась кросс валидация.
В качестве основы использовались модели RuBert (top-7) и Sbert (top-2). Бенчмарк.
В качестве целевой метрики использовался f1. Мотивация в бизнесовом моменте о важности найти все единички, или найти все единички точно. Зависит от компании/ситуации.
Модель | Используемые фичи | Кол-во признаков | F1 |
---|---|---|---|
RuBert | Отзыв | 3 | 0.674 |
RuBert | Отзыв + Заголовок | 6 | 0.723 |
RuBert + LogReg | Отзыв + Заголовок | 6 | 0.825 |
RuBert + SVC | Отзыв + Заголовок | 6 | 0.825 |
RuBert + KNN | Отзыв + Заголовок | 6 | 0.826 |
RuBert + Ensemble | Отзыв + Заголовок | 6 | 0.824 |
RuBert + LogReg | Отзыв + Заголовок + sin/cos/onehot date | 34 | 0.826 |
SBert + LogReg | Отзыв | 1024 | 0.829 |
SBert + KNN | Отзыв | 1024 | 0.826 |
Итоговая модель здесь. Является надстройкой над фичами Sbert и находится в git lfs.