Реализация классификации текста (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 недель







