Класифікація тексту присвоює мітки документам - виявлення спаму, аналіз sentiment, категоризація тем, розпізнавання intent. Це одна з найпоширеніших NLP-задач у продакшні, що живить все від email-фільтрів до маршрутизації підтримки клієнтів.
Де використовується
Класифікація тексту керує критичними бізнес-воркфлоу:
- Підтримка клієнтів: Маршрутизація тікетів, класифікація пріоритету, intent detection
- Модерація контенту: Виявлення спаму, фільтрація токсичності, порушення політик
- E-commerce: Категоризація продуктів, sentiment відгуків, релевантність пошуку
- Фінанси: Sentiment новин, класифікація документів, compliance screening
- Healthcare: Кодування клінічних нотаток, класифікація симптомів
- Маркетинг: Кваліфікація лідів, аналіз фідбеку, моніторинг бренду
Продукти: 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
Що робимо на практиці
- Визначити таксономію - Які мітки, скільки, ієрархічні чи flat?
- Аудит існуючих міток - Перевірити якість, консистентність, покриття
- Очистити та preprocessing - Нормалізувати текст, обробити спецсимволи
- Правильно розбити дані - Stratified split, temporal split якщо релевантно
- Встановити baseline - TF-IDF + logistic regression
- Спробувати pretrained моделі - Fine-tune BERT або подібні
- Обробити дисбаланс класів - Resampling, class weights, focal loss
- Оцінити всебічно - Per-class метрики, confusion analysis
- Калібрувати confidence - Тюнінг порогів, rejection option
- Задеплоїти та моніторити - Відстежувати розподіл прогнозів, дрифт
Спочатку 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 прикладах
Режими відмови та чеклист дебагу
- [ ] Label noise: Disagreement анотаторів корумпує тренування
- [ ] Дисбаланс класів: Модель прогнозує мажоритарний клас
- [ ] Domain shift: Модель натренована на формальному тексті, задеплоєна на informal
- [ ] Vocabulary mismatch: Нові терміни, сленг, абревіатури
- [ ] Length bias: Модель overfitнула на довжину документа
- [ ] Spurious correlations: Модель використовує shortcuts (стиль автора, timestamps)
- [ ] Multilingual gaps: Погана продуктивність на не-English
- [ ] Adversarial inputs: Цілеспрямовано створені щоб обдурити класифікатор
Продакшн-чеклист
Перед деплоєм: - [ ] 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, швидший час вирішення.
Пов'язані сторінки
- Індекс: ML Field Guide
- Named Entity Recognition
- Патерни інтеграції LLM
- Бінарна класифікація в продакшні
Додаткове читання
- Hugging Face Transformers Documentation
- spaCy Documentation
- scikit-learn Text Feature Extraction
- SetFit: Efficient Few-shot Learning
Спробуйте наживо
Дослідіть пов'язану модель на практиці: відкрийте Bag of Words vs TF-IDF: How Machines Turn Sentences into Numbers і змінюйте параметри під час роботи. Усе лишається у вашому браузері.
▶ Відкрити симуляцію Bag of Words vs TF-IDF: How Machines Turn Sentences into Numbers