Что такое метрика ROUGE (ROUGE-1, ROUGE-2, ROUGE-L)? Как она считается и в чем её недостатки для оценки генерации?
Краткий тезис
ROUGE (Recall-Oriented Understudy for Gisting Evaluation) — семейство метрик, измеряющих перекрытие n-грамм и наибольшей общей подпоследовательности между эталонным и сгенерированным текстом. Основное применение — оценка задач суммаризации и машинного перевода. ROUGE ориентирована на полноту (recall) и чувствительна к формальному совпадению лексики, но игнорирует синонимы, перефразирование и глубинный смысл.
2. ROUGE-L: longest common subsequence
ROUGE-L основана на наибольшей общей подпоследовательности (LCS) между эталоном и кандидатом. LCS не требует непрерывности — последовательность символов/слов, идущих в том же порядке, но не обязательно подряд.
Формула:
[ R_{lcs} = \frac{LCS(C, S)}{|S|}, \quad P_{lcs} = \frac{LCS(C, S)}{|C|}, \quad F_{lcs} = \frac{(1+[beta](/wiki/beta)^2) R_{lcs} P_{lcs}}{R_{lcs} + [beta](/wiki/beta)^2 P_{lcs}} ]
Где (LCS(C, S)) — длина наибольшей общей подпоследовательности (в словах). ([beta](/wiki/beta)) часто полагают равным 1.
Преимущество: ROUGE-L учитывает порядок слов на уровне последовательности, но не штрафует за вставки/удаления — только за нарушение порядка. Метрика особенно полезна для оценки фразовых повторов.
3. Пример расчёта
Эталон: "кот сидит на ковре" Генерация: "сидит кот на ковре"
ROUGE-1
- unigram эталона: {кот, сидит, на, ковре} (4)
- unigram генерации: {сидит, кот, на, ковре} (4)
- пересечение: 4 из 4.
- Recall = 4/4 = 1.0, Precision = 4/4 = 1.0 → ROUGE-1 F1 = 1.0
ROUGE-2
- bigram эталона: {кот сидит, сидит на, на ковре} (3)
- bigram генерации: {сидит кот, кот на, на ковре} (3)
- пересечение: только {на ковре} (1)
- Recall = 1/3 ≈ 0.333, Precision = 1/3 ≈ 0.333 → ROUGE-2 F1 = 0.333
ROUGE-L
- LCS = "кот на ковре"? Нет, порядок: в эталоне "кот сидит на ковре", в генерации "сидит кот на ковре". LCS: "кот на ковре" (3 слова) или "сидит на ковре"? Проверим: последовательность "кот" → "на" → "ковре" есть в обоих, но в генерации порядок "кот на ковре" — да, все три идут в том же относительном порядке. Длина LCS = 3.
- |S| = 4, |C| = 4.
- R_lcs = 3/4 = 0.75, P_lcs = 3/4 = 0.75 → F_lcs = 0.75
Вывод: ROUGE-1 даёт завышенную оценку, ROUGE-2 — слишком низкую, ROUGE-L — компромисс. Пример показывает слабость ROUGE при перестановке слов.
4. Недостатки: не чувствует смысл, synonymy, word order
-
Лексическая ограниченность – ROUGE основана на точном совпадении токенов. Синонимы ("кот"/"кошка") или морфологические формы ("на ковре"/"на коврик") дают нулевое пересечение, хотя смысл близок.
-
Игнорирование семантики – даже полное совпадение n-грамм не гарантирует правильного смысла (например, "не было" vs "было" — разные утверждения). ROUGE не различает утверждения и отрицания.
-
Чувствительность к порядку только через LCS – ROUGE-N не учитывает порядок вообще. ROUGE-L чувствителен к порядку, но только на уровне последовательности, а не синтаксической структуры. Пример: "кот съел мышь" и "мышь съел кот" – общий LCS "кот съел" (2 слова), оценка завышена.
-
Проблема с длинными текстами – при большом количестве стоп-слов ROUGE может быть высоким без содержательной близости. Для суммаризации коротких текстов метрика склонна к высокой вариативности.
-
Ориентация на полноту – в классической формулировке ROUGE — recall-oriented, что может поощрять генерацию длинных текстов, покрывающих много слов эталона, даже с избыточностью. Современные реализации используют F1, но bias остаётся.
-
Неприменимость для творческих задач – в диалогах, генерации историй или кода совпадение n-грамм не коррелирует с качеством.
Альтернативы: BLEU (больше подходит для машинного перевода), METEOR (учитывает синонимы), BERTScore (семантическое сходство через эмбеддинги), ROUGE-WE (словные векторы).
5. Пет-проект для закрепления
Задача: реализовать скрипт для подсчёта ROUGE-1, ROUGE-2 и ROUGE-L на русском тексте и сравнить с эталоном на задаче суммаризации новостей.
Инструменты:
- Python 3.8+
- Библиотеки:
nltk(для токенизации),rouge-score(оригинальная реализация Google),datasets(датасет Gazeta с русскими новостями). - Свой код для LCS (можно использовать
difflib.SequenceMatcherили написать динамическое программирование).
Шаги:
- Загрузить датасет
Gazetaизdatasets– содержит статьи и эталонные краткие пересказы. - Выбрать 10 примеров. Токенизировать тексты по словам (можно
nltk.word_tokenizeс русским языком). - Реализовать функции:
- Сравнить результаты с библиотечной реализацией
rouge_score.RougeScorer. - Для одного примера вручную заменить несколько слов на синонимы (например, "кот" → "кошка") и посмотреть изменение ROUGE.
Ожидаемый результат:
- Понимание, как малые изменения текста влияют на каждую метрику.
- Выявление случаев, когда ROUGE плохо коррелирует с человеческой оценкой.
- Таблица с примерами, иллюстрирующая недостатки (синонимы, перестановки, вставки).
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 908 | Основные метрики для оценки NLP-моделей |
| 250 | Практические подходы к оценке суммаризации |
Навигация
- Предыдущий: 908
- Следующий: 910
- Индекс: 00. Индекс разборов