Головна▸Статті▸NLP and LLMs in Production

Класифікація тексту в масштабі

Продакшн-системи класифікації тексту - від preprocessing до fine-tuning трансформерів, стратегії оцінки та деплоймент.

mysimulator teamОновлено 2026-01≈ 5 хв читання▶ Open the simulation

Класифікація тексту присвоює мітки документам - виявлення спаму, аналіз sentiment, категоризація тем, розпізнавання intent. Це одна з найпоширеніших NLP-задач у продакшні, що живить все від email-фільтрів до маршрутизації підтримки клієнтів.

Де використовується

Класифікація тексту керує критичними бізнес-воркфлоу:

Продукти: Gmail спам-фільтр, Twitter модерація контенту, Amazon категорії продуктів, Zendesk маршрутизація тікетів.

Типові дані

Аспект Типові значення
Training examples 1K до 10M розмічених документів
Довжина документів 10 до 10,000 токенів
Класи 2 до 1,000+ категорій
Якість міток 70-95% agreement
Мови Часто multilingual вимоги

Типова структура таблиці:

doc_id | text | label | created_at | annotator_id | confidence

Джерела даних: - Історичні розмічені дані з продакшн-систем - Кампанії людської анотації - Weak supervision (правила, евристики) - Semi-supervised labeling з active learning

Що робимо на практиці

  1. Визначити таксономію - Які мітки, скільки, ієрархічні чи flat?
  2. Аудит існуючих міток - Перевірити якість, консистентність, покриття
  3. Очистити та preprocessing - Нормалізувати текст, обробити спецсимволи
  4. Правильно розбити дані - Stratified split, temporal split якщо релевантно
  5. Встановити baseline - TF-IDF + logistic regression
  6. Спробувати pretrained моделі - Fine-tune BERT або подібні
  7. Обробити дисбаланс класів - Resampling, class weights, focal loss
  8. Оцінити всебічно - Per-class метрики, confusion analysis
  9. Калібрувати confidence - Тюнінг порогів, rejection option
  10. Задеплоїти та моніторити - Відстежувати розподіл прогнозів, дрифт

Спочатку Baseline

TF-IDF + Logistic Regression - це baseline для text classification:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression

vectorizer = TfidfVectorizer(max_features=10000, ngram_range=(1, 2))
X_train = vectorizer.fit_transform(train_texts)
clf = LogisticRegression(max_iter=1000)
clf.fit(X_train, train_labels)

Чому цей baseline: - Тренується за секунди на 100K прикладах - Інтерпретований (можна подивитись feature weights) - Часто дає 80%+ фінальної продуктивності - Добре працює для domain-specific vocabulary

Якщо baseline в межах 5% від продуктивності трансформера, залиште baseline.

Типові моделі та коли їх обирати

Модель Найкраще для Час тренування Вартість інференсу
TF-IDF + Logistic Regression Baseline, low latency, інтерпретованість Хвилини Дуже низька
FastText Великий масштаб, багато класів Хвилини Низька
CNN для тексту Середня складність, фіксовані патерни Години Низька
DistilBERT Хороший accuracy/speed tradeoff Години Середня
BERT/RoBERTa Найкращий accuracy, достатньо даних Години-Дні Висока
Multilingual BERT Cross-lingual вимоги Години-Дні Висока
SetFit Few-shot learning Хвилини Середня
LLM (GPT, Claude) Zero/few-shot, гнучка таксономія N/A Дуже висока

Індустріальний стандарт: DistilBERT для більшості use cases. Повний BERT, коли accuracy критичний.

Патерни Feature Engineering

Preprocessing тексту: - Lowercasing (зазвичай так) - Видалення пунктуації (залежить від домену) - Видалення стоп-слів (пропустіть для трансформерів) - Лематизація (пропустіть для трансформерів)

Додаткові ознаки: - Довжина документа - Патерни капіталізації - Наявність спецсимволів - Детекція мови - Кількість named entities

Кодування міток: - Multi-class: Одна мітка на документ - Multi-label: Можливі кілька міток - Ієрархічні: Мітки мають parent-child зв'язки

Аугментація даних: - Back-translation (переклад на іншу мову і назад) - Заміна синонімів - Випадкове вставляння/видалення - Перефразування з LLM

Оцінка та метрики

Основні метрики:

Метрика Use Case Нотатки
Accuracy Збалансовані класи Оманлива для незбалансованих даних
Macro F1 Multi-class, однаково важливі всі класи Чутлива до рідкісних класів
Weighted F1 Multi-class, важливіші часті класи Відповідає бізнес-впливу
Micro F1 Multi-label classification Глобальна precision/recall
AUC-ROC Бінарна, важливе ранжування Threshold-independent

Per-class аналіз: - Precision та recall для кожного класу - Патерни confusion matrix - Аналіз помилок на misclassified прикладах

Підводні камені: - Оцінка лише на мажоритарному класі - Не stratifying test set - Ігнорування label noise в оцінці - Не тестування на out-of-domain прикладах

Режими відмови та чеклист дебагу

Продакшн-чеклист

Перед деплоєм: - [ ] Per-class продуктивність прийнятна - [ ] Оцінено на held-out продакшн-розподілі - [ ] Вимоги латентності виконані - [ ] Калібрування confidence перевірено - [ ] Edge cases задокументовані (порожній текст, дуже довгий текст) - [ ] Rejection threshold визначений для low-confidence прогнозів

Після деплою: - [ ] Розподіл прогнозів моніториться - [ ] Розподіл confidence відстежується - [ ] Human review sample для quality assurance - [ ] Розклад ретренування встановлений - [ ] Feedback loop для корекції міток - [ ] A/B testing framework для оновлень моделі

Інструменти та стек

Категорія Інструменти
Класичний NLP scikit-learn, NLTK, spaCy
Deep learning PyTorch, TensorFlow, Transformers (Hugging Face)
Pretrained моделі BERT, RoBERTa, DistilBERT, XLM-RoBERTa
Few-shot SetFit, sentence-transformers
Анотація Label Studio, Prodigy, Snorkel
Серінг FastAPI, Triton, TensorFlow Serving
Моніторинг Arize, WhyLabs, custom dashboards

Приклад міні-кейсу

Сценарій: Маршрутизація тікетів підтримки клієнтів до правильної команди (5 команд: billing, technical, account, shipping, general).

Дані: 50K історичних тікетів з team assignments, дисбаланс класів (40% general, 5% shipping).

Підхід: 1. Baseline: TF-IDF + LogReg - Weighted F1: 0.72 2. Аналіз помилок: Billing vs Account confusion, короткі тікети misclassified 3. Fine-tune DistilBERT - Weighted F1: 0.84 4. Додати rejection: Якщо confidence < 0.6, маршрутизувати на human review 5. Результат: 85% автоматична маршрутизація, 12% human review, 3% escalation

Продакшн setup: - Модель серветься через FastAPI - Вимога 50ms p95 latency виконана - Щоденна перевірка розподілу прогнозів - Щотижневий sample review (50 тікетів) - Щомісячне ретренування з новими мітками

Вплив: 40% зменшення misrouting, швидший час вирішення.

Пов'язані сторінки

Додаткове читання

Спробуйте наживо

Дослідіть пов'язану модель на практиці: відкрийте Bag of Words vs TF-IDF: How Machines Turn Sentences into Numbers і змінюйте параметри під час роботи. Усе лишається у вашому браузері.

▶ Відкрити симуляцію Bag of Words vs TF-IDF: How Machines Turn Sentences into Numbers

Що ви знайшли?

Додати кроки відтворення (опційно)