MosHack-Change 2025 — Анализатор тональности отзывов
Постановка задачи
Проект разработан в рамках хакатона Hack&Change 2025.
Задача: классификация русскоязычных текстов по трём классам:
- 0 — отрицательная тональность,
- 1 — нейтральная,
- 2 — положительная.
Требования:
- загрузка CSV-файлов,
- нормализация текста,
- классификация и возврат размеченного CSV,
- визуализация распределения тональностей,
- вычисление macro-F1 на валидации,
- ручная правка разметки,
- фильтрация по источникам и ключевым словам,
- использование открытых моделей и библиотек,
- работа на CPU/GPU,
- корректный обмен данными между frontend и backend.
Ссылки
Основной репозиторий
https://hub.mos.ru/solmath/moshack-change_2025
Содержит:
- ноутбуки для обучения моделей,
- код подготовки данных,
- весь backend и frontend.
Видео и дополнительные материалы
https://drive.google.com/drive/folders/1-IQqdbQBBiLeVRH2WdiW18XNeTHRztrc?usp=sharing
Ссылка на сайт (только фронт работает, не успели поднять бэк)
https://cy133527.tw1.ru/index.html
Созданный прототип в фигме
https://www.figma.com/design/Jn1VWKOEAtMGraYBb4I0Uq/Hostus-Pocus?node-id=0-1&t=9ks20lZBQVufTpEp-1
Датасет
Исходные файлы:
data/ТОНАЛЬНОСТЬ/train.csvdata/ТОНАЛЬНОСТЬ/test.csvsample_submission.csv
Поля: text, label, src, ID.
Размеры:
- train: 232 366 строк
- test: 58 092 строк
Распределение классов:
- 0 — 77 243
- 1 — 77 494
- 2 — 77 629
Источники (11): anime, bank, geo, kinopoisk, linis, news, perekrestok, ru-reviews-classification, rureviews, rusentiment, sber.
Подготовленные выборки
-
train_clean.csv— 209 109 -
val_clean.csv— 23 235 -
train_super.csv— 106 311 -
val_super.csv— 11 771 -
test_super.csv— 58 092
Основной препроцессинг
- удаление HTML, URL, email, телефонов,
- токены для эмодзи, брани, оценок, капса и английского текста,
- нормализация пунктуации и растянутых букв,
- сокращение длинных текстов до ~900 символов,
- добавление доменных токенов
[SRC_<источник>], - мягкие аугментации (dropout + swap),
- ограничение 40 000 записей на источник,
- стратифицированный train/val сплит 90/10.
Структура репозитория
SentimentAnalysis/
├── backend/
│ ├── model/
│ ├── app_bert.py
│ └── preprocess_test.py
│
├── frontend/
│ ├── css/
│ ├── img/
│ ├── js/
│ ├── index.html
│ └── index_model.html
│
├── data/
│ ├── ТОНАЛЬНОСТЬ/
│ ├── processed/
│ ├── embeddings_xlmr/
│ └── cache/
│
├── notebooks/
│ ├── preprocess.py
│ ├── preprocess.ipynb
│ ├── baseline.ipynb
│ ├── bert_tf_cv.ipynb
│ ├── train_rurorberta_base_manual.ipynb
│ ├── train_rurorberta_tiny_manual.ipynb
│ ├── train_rubert_base_conv.ipynb
│ ├── train_xlmr_base.ipynb
│ └── eval_model_universal.ipynb
│
├── models/
│ ├── rurorberta_base2_manual/
│ ├── rurorberta_tiny_manual/
│ ├── rubert_base_conv_manual/
│ ├── sentiment_*.joblib
│ └── ensemble_config_cv*.json
│
├── src/
│ ├── data_utils.py
│ ├── train_model.py
│ ├── inference.py
│ └── models/
│
├── pretrained/
├── requirements.txt
├── environment.yml
└── README.md
Последовательность работы
1. Создание окружения
python -m venv .venv
source .venv/bin/activate
или:
conda env create -f environment.yml
2. Установка зависимостей
pip install -r requirements.txt
Если torch не устанавливается:
pip install torch
3. Подготовка данных
python notebooks/preprocess.py
Будут созданы:
train_super.csvval_super.csvtest_super.csv
4. Обучение моделей
Ноутбуки (в папке notebooks/):
train_rurorberta_base_manual.ipynbtrain_rurorberta_tiny_manual.ipynbtrain_rubert_base_conv.ipynbubert-base-cased-sentiment-rusentiment.ipynbtrain_xlmr_base.ipynb
5. Сборка ансамбля
bert_tf_cv.ipynbeval_model_universal.ipynb
6. Запуск backend
В backend/model/ должны лежать:
- config.json
- pytorch_model.bin
- файлы токенизатора
Запуск:
uvicorn backend.app_bert:app_bert --reload
Документация:
- Swagger UI: http://127.0.0.1:8000/docs
Метрики моделей (macro-F1 на val_super)
| Модель | Ноутбук | Macro-F1 |
|---|---|---|
| blanchefort/rubert-base-cased-sentiment-rusentiment | ubert-base-cased-sentiment-rusentiment.ipynb | 0.7561 |
| DeepPavlov/rubert-base-cased-conversational | train_rubert_base_conv.ipynb | 0.7347 |
| ai-forever/RuRoBERTa-base | train_rurorberta_base_manual.ipynb | 0.7338 |
| FacebookAI/xlm-roberta-base (дообученная) | train_xlmr_base.ipynb | 0.7213 |
| cointegrated/rubert-tiny2 | train_rurorberta_tiny_manual.ipynb | 0.6871 |
| Ансамбль BERT + TF-IDF | bert_tf_cv.ipynb | 0.6642 |
| TF-IDF + Logistic Regression | baseline.ipynb | 0.6222 |
| TF-IDF + SVD + HGB | baseline.ipynb | 0.6101 |
| TF-IDF + LinearSVC | baseline.ipynb | 0.5997 |
Команда проекта: MoodWare
Финансовый университет при Правительстве РФ, 3 курс
Участники
Диева Варвара
- дизайн и разработка интерфейса,
- участие в обучении модели GitHub: https://github.com/dievavar Telegram: @dievavar
Лихолетов Георгий
- backend, API, деплой GitHub: https://github.com/FreEFreeZy Telegram: @freefreezy
Шалашова Ольга
- исследование моделей BERT,
- обучение и оценка качества,
- подготовка данных GitHub: https://github.com/shalashova-olga Telegram: @olya_shalashova