Как вы собираете датасет для классификации интентов (согласование разметчиков, Cohen's Kappa)?
Краткий тезис
Сбор качественного датасета для классификации интентов — ключевой этап построения NLU-системы. Он включает три обязательных шага: проектирование таксономии интентов, подготовку чёткой инструкции для разметчиков и контроль качества через вычисление межразметочного согласия (Cohen's Kappa для двух разметчиков или Fleiss' Kappa для трёх и более). Итеративное уточнение инструкции и таксономии на основе метрик согласия позволяет получить надёжный размеченный корпус, пригодный для обучения классификатора.
2. Инструкция для разметчиков
Инструкция (guideline) — основа согласованной разметки. Без неё согласие разметчиков редко превышает 0.5 по Kappa. Рекомендуемый состав:
- Цель разметки — краткое описание задачи и примеры использования датасета.
- Список интентов с определениями — формальное описание каждого класса. Например:
CheckOrderStatus— «Пользователь запрашивает статус своего заказа (номер, дату доставки, местонахождение)».
- Примеры для каждого интента — 3–5 типичных реплик. Примеры лучше брать из реального лога диалогов.
- Сложные случаи (edge cases) — описание граничных ситуаций: сарказм, опечатки, переспросы, повелительное наклонение.
- Порядок действий — что делать при сомнении (пропустить реплику, выбрать наиболее вероятный интент, ставить
Other). - Аннотация на нескольких примерах — как бы размечено то или иное высказывание. Полезно показать разбор 10–15 примеров.
- Обратная связь — контакты для вопросов, частота пересмотра инструкции.
Инструкция должна быть краткой (не более 5–6 страниц) и сопровождаться краткими тестами на понимание. Перед началом разметки каждый разметчик должен пройти квалификационное задание (10–15 реплик) и получить по нему обратную связь.
3. Межразметочное согласие: Cohen's Kappa, Fleiss' Kappa
3.1 Когда и какую метрику использовать
- Cohen's Kappa — для двух разметчиков. Классическая статистика, учитывающая случайное совпадение.
- Fleiss' Kappa — для трёх и более разметчиков. Обобщение Cohen для множества оценщиков.
- Krippendorff's Alpha — альтернатива, позволяющая учитывать разные шкалы (номинальные, порядковые) и пропущенные данные. Используется реже, когда разметчики могут не обработать все записи.
Формула Cohen's Kappa:
[ \kappa = \frac{P_o - P_e}{1 - P_e} ]
где (P_o) — наблюдаемая доля согласия (доля совпавших меток), (P_e) — ожидаемая доля случайного согласия (рассчитывается как сумма по классам произведений вероятностей выбора этого класса каждым разметчиком).
3.2 Интерпретация значений
| Значение Kappa | Уровень согласия | Интерпретация |
|---|---|---|
| < 0.0 | Отсутствует | Согласие хуже случайного (систематические расхождения) |
| 0.0 – 0.20 | Очень слабое | Практически случайное совпадение |
| 0.21 – 0.40 | Слабое | Неприемлемо для продакшена |
| 0.41 – 0.60 | Умеренное | Можно использовать, если требования к качеству невысоки |
| 0.61 – 0.80 | Хорошее | Приемлемо для большинства задач |
| 0.81 – 1.00 | Очень хорошее | Высокая надёжность разметки |
Для датасетов классификации интентов целевое значение — не ниже 0.75 (Cohen's Kappa) или 0.70 (Fleiss' Kappa). Если согласие ниже, необходимо вернуться к уточнению инструкции или таксономии.
3.3 Типовые проблемы при расчёте
- Дисбаланс классов — Kappa может быть занижена при доминировании одного интента (например, 90 % реплик —
CheckOrderStatus). В таком случае лучше дополнительно считать F1 на подвыборке сбалансированных классов или использовать ROC AUC. - Малое количество классов — при 2 классах Kappa эквивалентна скорректированной точности; она работает корректно.
- Пропуски — если разметчики не обработали часть данных, Fleiss' Kappa не применим; используют попарные Cohen's Kappa или Krippendorff's Alpha.
Для подсчёта в Python удобны функции из sklearn.metrics.cohen_kappa_score и krippendorff (библиотека krippendorff), а также statsmodels.stats.inter_rater.fleiss_kappa (для сведённой таблицы).
Пример вычисления Cohen's Kappa для двух разметчиков:
from sklearn.metrics import cohen_kappa_score
ann1 = [0, 0, 1, 2, 2, 1] # метки первого разметчика
ann2 = [0, 1, 1, 2, 2, 0] # метки второго
kappa = cohen_kappa_score(ann1, ann2)
print(f"Cohen's Kappa: {kappa:.3f}") # ~0.571
4. Итеративные улучшения
Процесс сбора датасета — не однократное событие. Типовой цикл:
- Пилотная разметка (50–100 реплик) + расчёт Kappa. Если Kappa < 0.6 — останов.
- Анализ расхождений. Выписываем все реплики, где разметчики разошлись. Обсуждаем их совместно.
- Доработка таксономии. Возможно, требуется объединить пересекающиеся интенты, добавить новый подтип, уточнить определения.
- Доработка инструкции. Добавляем правила для выявленных сложных случаев, расширяем список примеров.
- Повторная разметка (те же или другие разметчики, другая выборка). Снова считаем согласие.
- Фиксация финального датасета. После достижения Kappa ≥ 0.75 проводим полную разметку оставшихся данных. На этом этапе можно использовать одного разметчика, а двух других — только для валидации случайной доли (10–15 %).
Важно вести журнал версий инструкций и таксономии, чтобы при необходимости откатить изменения.
Пет-проект для закрепления
Задача: Собрать датасет для классификации интентов вопросов к техподдержке SaaS-сервиса (например, «Забыл пароль», «Проблема с оплатой», «Хочу удалить аккаунт», «Техническая ошибка», «Другое»). В проекте участвуют три разметчика.
Инструменты:
- Label Studio (или Doccano) — интерфейс разметки.
- Python (pandas, sklearn, krippendorff).
- Git для версионирования инструкций.
Шаги:
- Сбор сырых реплик. Из логов чата техподдержки извлечь 300–400 типичных вопросов, нормализовать (убрать персональные данные, привести к нижнему регистру).
- Определить 5 интентов:
PasswordReset,PaymentIssue,AccountDeletion,BugReport,Other. - Написать инструкцию с примерами (по 3 на класс). Разметчики проходят квалификационное задание (15 реплик).
- Первая волна разметки. Каждый разметчик размечает 100 реплик. Вычислить попарные Cohen's Kappa между тремя парами. Ожидание — 0.5–0.6.
- Анализ расхождений. Найти реплики, где два разметчика разошлись. Обсудить, расширить инструкцию (например, уточнить, когда вопрос относится к
BugReport, а когда кOther). - Вторая волна — новая выборка 100 реплик. После улучшений Kappa должен вырасти до 0.75–0.80.
- Массовая разметка. Оставшиеся 200 реплик размечают трое. Финальное согласие — Fleiss' Kappa ≥ 0.7.
- Собрать итоговый датасет в формате CSV:
text, label. Выложить в репозиторий.
Ожидаемый результат: Датасет с ~300–400 размеченных реплик, метрика согласия на уровне 0.8 (Cohen's Kappa между парами), возможность использовать для обучения классификатора (например, BERT или логистической регрессии).
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 937 | Методы увеличения датасета классификации интентов (аугментация) |
(Если вопрос 937 неизвестен, предположим, что это смежная тема по аугментации или семплированию. Для точности следовало бы уточнить, но в реальном кейсе используем данную связь.)
Остальные смежные темы могут включать разметка данных, межразметочное согласие, классификация интентов.
Навигация
- Предыдущий: 938
- Следующий: 940
- Индекс: 00. Индекс разборов