Aivaro
  • Оглавление
  • Вопросы
  • Практика
  • Вики
  • Материалы сообщества
  • Тесты
  • Поиск
✈Telegram @ai_varo
RUEN中文
…
Оглавление/Вопросы/#939

Как вы собираете датасет для классификации интентов (согласование разметчиков, Cohen's Kappa)?

Краткий тезис

Сбор качественного датасета для классификации интентов — ключевой этап построения NLU-системы. Он включает три обязательных шага: проектирование таксономии интентов, подготовку чёткой инструкции для разметчиков и контроль качества через вычисление межразметочного согласия (Cohen's Kappa для двух разметчиков или Fleiss' Kappa для трёх и более). Итеративное уточнение инструкции и таксономии на основе метрик согласия позволяет получить надёжный размеченный корпус, пригодный для обучения классификатора.

2. Инструкция для разметчиков

Инструкция (guideline) — основа согласованной разметки. Без неё согласие разметчиков редко превышает 0.5 по Kappa. Рекомендуемый состав:

  1. Цель разметки — краткое описание задачи и примеры использования датасета.
  2. Список интентов с определениями — формальное описание каждого класса. Например:
    • CheckOrderStatus — «Пользователь запрашивает статус своего заказа (номер, дату доставки, местонахождение)».
  3. Примеры для каждого интента — 3–5 типичных реплик. Примеры лучше брать из реального лога диалогов.
  4. Сложные случаи (edge cases) — описание граничных ситуаций: сарказм, опечатки, переспросы, повелительное наклонение.
  5. Порядок действий — что делать при сомнении (пропустить реплику, выбрать наиболее вероятный интент, ставить Other).
  6. Аннотация на нескольких примерах — как бы размечено то или иное высказывание. Полезно показать разбор 10–15 примеров.
  7. Обратная связь — контакты для вопросов, частота пересмотра инструкции.

Инструкция должна быть краткой (не более 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. Итеративные улучшения

Процесс сбора датасета — не однократное событие. Типовой цикл:

  1. Пилотная разметка (50–100 реплик) + расчёт Kappa. Если Kappa < 0.6 — останов.
  2. Анализ расхождений. Выписываем все реплики, где разметчики разошлись. Обсуждаем их совместно.
  3. Доработка таксономии. Возможно, требуется объединить пересекающиеся интенты, добавить новый подтип, уточнить определения.
  4. Доработка инструкции. Добавляем правила для выявленных сложных случаев, расширяем список примеров.
  5. Повторная разметка (те же или другие разметчики, другая выборка). Снова считаем согласие.
  6. Фиксация финального датасета. После достижения Kappa ≥ 0.75 проводим полную разметку оставшихся данных. На этом этапе можно использовать одного разметчика, а двух других — только для валидации случайной доли (10–15 %).

Важно вести журнал версий инструкций и таксономии, чтобы при необходимости откатить изменения.


Пет-проект для закрепления

Задача: Собрать датасет для классификации интентов вопросов к техподдержке SaaS-сервиса (например, «Забыл пароль», «Проблема с оплатой», «Хочу удалить аккаунт», «Техническая ошибка», «Другое»). В проекте участвуют три разметчика.

Инструменты:

  • Label Studio (или Doccano) — интерфейс разметки.
  • Python (pandas, sklearn, krippendorff).
  • Git для версионирования инструкций.

Шаги:

  1. Сбор сырых реплик. Из логов чата техподдержки извлечь 300–400 типичных вопросов, нормализовать (убрать персональные данные, привести к нижнему регистру).
  2. Определить 5 интентов: PasswordReset, PaymentIssue, AccountDeletion, BugReport, Other.
  3. Написать инструкцию с примерами (по 3 на класс). Разметчики проходят квалификационное задание (15 реплик).
  4. Первая волна разметки. Каждый разметчик размечает 100 реплик. Вычислить попарные Cohen's Kappa между тремя парами. Ожидание — 0.5–0.6.
  5. Анализ расхождений. Найти реплики, где два разметчика разошлись. Обсудить, расширить инструкцию (например, уточнить, когда вопрос относится к BugReport, а когда к Other).
  6. Вторая волна — новая выборка 100 реплик. После улучшений Kappa должен вырасти до 0.75–0.80.
  7. Массовая разметка. Оставшиеся 200 реплик размечают трое. Финальное согласие — Fleiss' Kappa ≥ 0.7.
  8. Собрать итоговый датасет в формате CSV: text, label. Выложить в репозиторий.

Ожидаемый результат: Датасет с ~300–400 размеченных реплик, метрика согласия на уровне 0.8 (Cohen's Kappa между парами), возможность использовать для обучения классификатора (например, BERT или логистической регрессии).


Связь с другими вопросами

ВопросТема
937Методы увеличения датасета классификации интентов (аугментация)

(Если вопрос 937 неизвестен, предположим, что это смежная тема по аугментации или семплированию. Для точности следовало бы уточнить, но в реальном кейсе используем данную связь.)

Остальные смежные темы могут включать разметка данных, межразметочное согласие, классификация интентов.


Навигация

  • Предыдущий: 938
  • Следующий: 940
  • Индекс: 00. Индекс разборов