MVP-проект для анализа тональности русскоязычных отзывов с использованием TF-IDF baseline и модели RuBERT.
Проект поддерживает классификацию отзывов по трём классам:
negative
neutral
positive
Реализованы:
предобработка датасета
TF-IDF + Linear SVM
TF-IDF + Logistic Regression
RuBERT (DeepPavlov/rubert-base-cased)
отдельные скрипты для инференса и обучения
локальный Gradio-интерфейс для предикта тональности
llm-city/
├─ data/
│ ├─ raw/
│ │ └─ rureviews.csv
│ └─ interim/
│ └─ cleaned_reviews.csv
├─ models/
│ ├─ tfidf/
│ │ └─ svm_pipeline.joblib
│ └─ rubert/
├─ src/
│ ├─ __init__.py
│ ├─ data/
│ │ ├─ __init__.py
│ │ └─ preprocess.py
│ └─ models/
│ ├─ __init__.py
│ ├─ train_tfidf.py
│ ├─ predict_tfidf.py
│ ├─ train_rubert.py
│ └─ predict_rubert.py
├─ app.py
├─ .gitignore
├─ LICENSE
├─ README.md
└─ requirements.txt
Используется датасет RuReviews:
Ожидаемые колонки:
reviewsentiment
- Python 3.11+
- зависимости из
requirements.txt
Клонируйте репозиторий:
git clone https://github.com/findatalab/llm-city.git
cd llm-cityСоздайте venv и установите зависимости:
python -m venv venv
venv\Scripts\activate
pip install -r requirements.txtСкачайте дообученные веса RuBERT с Hugging Face и положите их в папку models/rubert/:
hf download lonelinessxxzz/llm-city-rubert --local-dir models/rubertДообученные веса RuBERT доступны на Hugging Face:
https://huggingface.co/lonelinessxxzz/llm-city-rubert
Базовая модель RuBERT:
https://huggingface.co/DeepPavlov/rubert-base-cased
Запустите локальный Gradio-интерфейс:
python app.pyПосле запуска откройте локальную страницу Gradio, например:
http://127.0.0.1:7860
Если модели уже находятся в models/tfidf/ и models/rubert/
Если папка models/rubert/ уже есть локально, модель можно использовать сразу.
Если её нет, RuBERT нужно один раз дообучить.
python -m src.models.predict_tfidf --text "Очень хороший товар, мне понравилось" --model-path models/tfidf/svm_pipeline.joblibpython -m src.models.predict_rubert --text "Очень хороший товар, рекомендую" --model-dir models/rubertДля локального интерактивного предикта используется Gradio-интерфейс в app.py.
Запуск из корня проекта:
python app.pyAccuracy: 0.7273
Macro F1: 0.7267
Accuracy: 0.7750
Macro F1: 0.7768
RuBERT показал более высокое качество по сравнению с baseline-моделью на TF-IDF.
python -m src.data.preprocess --data-path data/raw/rureviews.csv --output-path data/interim/cleaned_reviews.csv --sep "\t"python -m src.models.train_tfidf --data-path data/interim/cleaned_reviews.csv --model-dir models/tfidf --model-name svmpython -m src.models.train_rubert --data-path data/interim/cleaned_reviews.csv --output-dir models/rubert --model-name DeepPavlov/rubert-base-cased --epochs 2 --train-batch-size 8 --eval-batch-size 8