No description
  • Python 98.4%
  • Dockerfile 1.6%
Find a file
Живилин Михаил afdbc8c503 openapi
2026-03-17 09:23:35 +03:00
api openapi 2026-03-17 09:23:35 +03:00
datasets Dataset scripts 2026-03-17 02:32:32 +03:00
ml Metrics + CI 2026-03-17 02:14:42 +03:00
.dockerignore Metrics + CI 2026-03-17 02:14:42 +03:00
.gitignore Dataset scripts 2026-03-17 02:32:32 +03:00
.gitlab-ci.yml Fix 2026-03-17 02:29:59 +03:00
Dockerfile Fix 2026-03-17 06:02:07 +03:00
Readme.MD Metrics + CI 2026-03-17 02:14:42 +03:00
requirements.txt fix 2026-03-17 08:57:19 +03:00

Данные и модель

Из-за большого размера датасеты и обученная модель не хранятся в репозитории. Они выгружены в 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.xlsxdatasets/raw.xlsx
  • datasets/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 используется для генерации обучающего датасета из исходных текстов.

Основные этапы пайплайна:

  1. Загружается исходный датасет (dataset.xlsx).

  2. С помощью модели NER Babelscape/wikineural-multilingual-ner извлекаются упоминания организаций.

  3. Названия брендов очищаются:

    • нормализация текста
    • фильтрация мусорных сущностей
    • лемматизация через pymorphy3.
  4. Для каждого упоминания формируется контекст вокруг бренда.

  5. Генерируются обучающие примеры:

    • позитивные — бренд реально присутствует в тексте
    • негативные — случайные бренды, отсутствующие в тексте.
  6. Формируется итоговый датасет:

brand,text,mention_label,sentiment_score

где:

  • brand — бренд
  • text — контекст текста
  • mention_label — есть ли упоминание бренда
  • sentiment_score — тональность

Готовый датасет сохраняется в:

datasets/datasetsv3/brand_dataset.csv

Обучение модели (learn.py)

Скрипт learn.py обучает модель для двух задач одновременно:

  1. детекция упоминания бренда
  2. классификация тональности

Модель использует энкодер:

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, которая:

  1. при запуске скачивает модель из S3
  2. загружает её в память
  3. предоставляет HTTP endpoint для инференса.

Модель используется для:

  • определения наличия упоминания бренда
  • оценки тональности текста.

Поток работы проекта

Общий pipeline проекта:

raw dataset
     ↓
label.py
     ↓
brand_dataset.csv
     ↓
learn.py
     ↓
brand_model
     ↓
upload to S3
     ↓
api (FastAPI inference)

При запуске сервиса модель автоматически скачивается из S3 и используется для инференса.