- Python 98.4%
- Dockerfile 1.6%
| api | ||
| datasets | ||
| ml | ||
| .dockerignore | ||
| .gitignore | ||
| .gitlab-ci.yml | ||
| Dockerfile | ||
| Readme.MD | ||
| requirements.txt | ||
Данные и модель
Из-за большого размера датасеты и обученная модель не хранятся в репозитории. Они выгружены в S3-совместимое хранилище:
team-32-compute-2-272b82.pages.prodcontest.ru
Структура хранилища
machinelearning/
datasets/
raw.xlsx
v1/
brand_dataset.csv
v2/
brand_dataset.csv
models/
brand_model/
model.safetensors
tokenizer.json
...
Загрузка данных
Для скачивания датасетов используется скрипт:
download_datasets.py
Он автоматически скачивает:
datasets/raw.xlsx→datasets/raw.xlsxdatasets/v1/*→datasets/v1/datasets/v2/*→datasets/v2/
Доступ к S3 настраивается через переменные окружения:
S3_ENDPOINT
S3_ACCESS_KEY
S3_SECRET_KEY
S3_BUCKET
Пример:
export S3_ENDPOINT=https://team-32-compute-2-272b82.pages.prodcontest.ru
export S3_ACCESS_KEY=...
export S3_SECRET_KEY=...
export S3_BUCKET=machinelearning
После этого можно выполнить:
python download_datasets.py
Модель
Обученная модель brand_model также хранится в S3:
machinelearning/models/brand_model/
При запуске сервиса она скачивается и сохраняется в локальную директорию:
api/models/brand_model
Подготовка датасета (label.py)
Скрипт label.py используется для генерации обучающего датасета из исходных текстов.
Основные этапы пайплайна:
-
Загружается исходный датасет (
dataset.xlsx). -
С помощью модели NER
Babelscape/wikineural-multilingual-nerизвлекаются упоминания организаций. -
Названия брендов очищаются:
- нормализация текста
- фильтрация мусорных сущностей
- лемматизация через
pymorphy3.
-
Для каждого упоминания формируется контекст вокруг бренда.
-
Генерируются обучающие примеры:
- позитивные — бренд реально присутствует в тексте
- негативные — случайные бренды, отсутствующие в тексте.
-
Формируется итоговый датасет:
brand,text,mention_label,sentiment_score
где:
brand— брендtext— контекст текстаmention_label— есть ли упоминание брендаsentiment_score— тональность
Готовый датасет сохраняется в:
datasets/datasetsv3/brand_dataset.csv
Обучение модели (learn.py)
Скрипт learn.py обучает модель для двух задач одновременно:
- детекция упоминания бренда
- классификация тональности
Модель использует энкодер:
ai-forever/ruRoberta-large
Архитектура:
[ruRoberta encoder]
↓
mean pooling
↓
┌───────────────┬───────────────┐
│ mention head │ sentiment head│
│ (2 класса) │ (3 класса) │
└───────────────┴───────────────┘
Используется multitask обучение:
loss = mention_loss + sentiment_loss
Датасет разделяется на:
- train
- validation
Метрики:
- mention accuracy
- sentiment accuracy
- sentiment F1 (macro)
После обучения модель сохраняется в директорию:
brand_model/
API (api/)
Директория api содержит сервис инференса.
Сервис представляет собой простую обёртку над FastAPI, которая:
- при запуске скачивает модель из S3
- загружает её в память
- предоставляет HTTP endpoint для инференса.
Модель используется для:
- определения наличия упоминания бренда
- оценки тональности текста.
Поток работы проекта
Общий pipeline проекта:
raw dataset
↓
label.py
↓
brand_dataset.csv
↓
learn.py
↓
brand_model
↓
upload to S3
↓
api (FastAPI inference)
При запуске сервиса модель автоматически скачивается из S3 и используется для инференса.