Реализация классификации текста (Text Classification)

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1Все 1566 услуг
Реализация классификации текста (Text Classification)
Средний
~3-5 дней
Часто задаваемые вопросы

Направления AI-разработки

Этапы разработки AI-решения

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1284
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    901
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1119
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    853

Реализация классификации текста (Text Classification)

Классификация текста — задача присвоения метки (или набора меток) текстовому фрагменту. Тематика письма, рубрика статьи, тип обращения, язык документа — за внешней простотой скрывается множество технических решений, которые принципиально влияют на качество.

Постановка задачи и выбор подхода

Прежде чем выбирать архитектуру, нужно определить параметры задачи:

  • Количество классов: 2–5 (бинарная/простая многоклассовая) vs 20–100+ (иерархическая)
  • Объём разметки: есть ли 500+ примеров на класс?
  • Язык: английский, русский, мультиязычный
  • Требования к latency: реальное время (<100ms) vs batch
  • Интерпретируемость: нужно ли объяснять решение?

Эти параметры определяют стек. Ошибка — автоматически тянуться к BERT, когда задача решается логистической регрессией за 50ms.

Иерархия подходов

Уровень 1 — классический ML (TF-IDF / BOW + Logistic Regression / SVM / LightGBM):

  • Когда достаточно: чёткие темы, много разметки, нужна интерпретируемость, latency < 10ms
  • scikit-learn Pipeline: TfidfVectorizer → LogisticRegression
  • Accuracy на типовых задачах: 85–92%

Уровень 2 — FastText:

  • Когда: нужно быстро обучить на большом объёме, мультиязычная задача
  • Обучение 100K примеров: < 30 секунд
  • Inference: ~1ms на текст
  • Качество близко к BERT для чистых тематических классификаторов

Уровень 3 — Transformer fine-tuning:

  • BERT / RoBERTa / DeBERTa для английского
  • ruBERT / ruRoBERTa для русского
  • Когда: сложные классы, мало разметки (few-shot), нужна высокая точность
  • Обучение: 2–10 эпох на GPU, 15–60 минут для типового датасета

Уровень 4 — LLM с промптингом:

  • Zero-shot / few-shot через GPT-4o-mini или Claude
  • Когда: нет разметки, нужен быстрый старт, или классы описательные
  • Недостатки: latency 500ms–2s, стоимость на объёме

BERT fine-tuning на PyTorch

from transformers import AutoTokenizer, AutoModelForSequenceClassification
from transformers import TrainingArguments, Trainer
import numpy as np

model_name = "DeepPavlov/rubert-base-cased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(
    model_name, num_labels=len(label2id)
)

def tokenize(examples):
    return tokenizer(
        examples["text"],
        truncation=True,
        max_length=512,
        padding="max_length"
    )

training_args = TrainingArguments(
    output_dir="./classifier",
    num_train_epochs=5,
    per_device_train_batch_size=16,
    learning_rate=2e-5,
    weight_decay=0.01,
    evaluation_strategy="epoch",
    load_best_model_at_end=True,
)

Работа с несбалансированными классами

Реальные данные почти всегда несбалансированы. Стратегии:

  • Class weights: compute_class_weight('balanced', ...) — передаётся в loss function
  • Oversampling: SMOTE для эмбеддингов или аугментация текста (paraphrase)
  • Undersampling: только если мажоритарный класс реально избыточен
  • Focal Loss: для экстремального дисбаланса (1:100+)

Мониторьте per-class F1, не только accuracy — accuracy 95% при 5% редкого класса ничего не значит.

Многоклассовая vs многометочная классификация

Для multilabel (текст может иметь несколько меток одновременно):

  • Замените softmax на sigmoid в последнем слое
  • Используйте BCEWithLogitsLoss вместо CrossEntropyLoss
  • Порог классификации настраивается отдельно для каждого класса (maximize F1)

Деплой классификатора

Оптимизация для inference:

  • ONNX export: ускорение CPU inference в 2–4x
  • Quantization (INT8): уменьшение памяти в 4x, деградация accuracy < 1%
  • TorchScript: для production PyTorch serving

Serving:

# ONNX Runtime
pip install onnxruntime
# Экспорт
from optimum.onnxruntime import ORTModelForSequenceClassification
model = ORTModelForSequenceClassification.from_pretrained("./classifier", export=True)

Latency ONNX+INT8 на CPU: 20–50ms для 512-токенного текста.

Метрики и мониторинг

  • F1 Macro — основная метрика для несбалансированных задач
  • Confusion matrix — обязательна при первоначальной оценке
  • Calibration curve — если нужны достоверные вероятности

В production: мониторинг distribution shift через KL-дивергенцию распределения предсказанных классов. Сигнал: метрика выходит за пределы исторического коридора → переобучение модели.

Сроки реализации

  • Baseline (TF-IDF + ML): 3–5 дней (включая разметку)
  • BERT fine-tuning: 1–2 недели
  • Production с мониторингом: 3–5 недель