← Назад к вопросам

Что такое ROUGE?

1.8 Middle🔥 171 комментариев
#NLP и обработка текста#Метрики и оценка моделей

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

ROUGE: Метрика для оценки текстового суммирования

Определение

ROUGE (Recall-Oriented Understudy for Gisting Evaluation) - это метрика для оценки качества автоматически сгенерированного текста путём сравнения с эталонным текстом.

Основная идея: насколько хорошо сгенерированный текст совпадает с эталонным?

История

2004: Lin создаёт ROUGE для оценки систем автоматического суммирования
2016-2024: Становится стандартом для NLP задач

Типы ROUGE

Существует несколько вариантов ROUGE, работающих на разных уровнях:

1. ROUGE-N (N-граммы)

ROUGE-1: одиночные слова (unigrams) ROUGE-2: двусловия (bigrams) ROUGE-3, ROUGE-4: и так далее

Формула: ROUGE-N = Σ(count(n-gram)_match) / Σ(count(n-gram)_ref)

где:
count(n-gram)_match = количество n-грамм в сгенерированном,
                      совпадающих с эталонным
count(n-gram)_ref = всего n-грамм в эталонном

Пример ROUGE-1:

Эталон: "кот сидит на коврике"
Сгенерированный: "кот сидит на окне"

Эталон unigrams: {кот: 1, сидит: 1, на: 1, коврике: 1}
Сгенерированный: {кот: 1, сидит: 1, на: 1, окне: 1}

Пересечение: {кот, сидит, на} = 3
Всего в эталоне: 4

ROUGE-1 = 3/4 = 0.75

Пример ROUGE-2:

Эталон bigrams:
{кот сидит: 1, сидит на: 1, на коврике: 1}

Сгенерированный bigrams:
{кот сидит: 1, сидит на: 1, на окне: 1}

Пересечение: {кот сидит, сидит на} = 2
Всего в эталоне: 3

ROUGE-2 = 2/3 = 0.67

2. ROUGE-L (Longest Common Subsequence)

Найди самую длинную общую подпоследовательность между текстами.

Формула:
Precision = LCS / length(generated)
Recall = LCS / length(reference)
F1 = 2 * (Precision * Recall) / (Precision + Recall)

где LCS = Longest Common Subsequence

Пример:

Эталон: "The cat sat on the mat"
Сгенерированный: "The cat is on the mat"

LCS: "The cat on the mat" (длина 8 слов)

Recall = 8 / 9 = 0.89 (из эталона)
Precision = 8 / 8 = 1.0 (из сгенерированного)
F1 = 2 * (0.89 * 1.0) / (0.89 + 1.0) = 0.94

3. ROUGE-S (Skip-gram Co-occurrence)

Использует биграммы с пропусками (skip-grams).

Например, в "The quick brown fox":

  • Skip-bigrams с расстоянием 1: (The, quick), (The, brown), (quick, brown), (quick, fox), (brown, fox)
  • Skip-bigrams с расстоянием 2: (The, brown), (The, fox), (quick, fox)

Подходит для более гибкого сравнения.

Практический пример

from rouge_score import rouge_scorer

# Определи метрики
scorer = rouge_scorer.RougeScorer(
    ['rouge1', 'rouge2', 'rougeL'],  # какие использовать
    use_stemmer=True  # нормализовать слова
)

# Эталонный текст
reference = (
    "The quick brown fox jumps over the lazy dog. "
    "This sentence contains all letters of the alphabet."
)

# Сгенерированный текст
generated = (
    "A quick brown fox jumps over the lazy dog. "
    "This text has all alphabet letters."
)

# Вычисли ROUGE
scores = scorer.score(reference, generated)

for metric, score in scores.items():
    print(f"{metric}:")
    print(f"  Precision: {score.precision:.3f}")
    print(f"  Recall: {score.recall:.3f}")
    print(f"  F1: {score.fmeasure:.3f}")

# Выпуск:
# rouge1:
#   Precision: 0.892
#   Recall: 0.923
#   F1: 0.907
# rouge2:
#   Precision: 0.714
#   Recall: 0.750
#   F1: 0.732
# rougeL:
#   Precision: 0.857
#   Recall: 0.889
#   F1: 0.873

Что означают значения?

ROUGE F1 Score:
  > 0.9     = Отличное совпадение
  0.8-0.9   = Хорошее совпадение
  0.7-0.8   = Приемлемое совпадение
  0.6-0.7   = Слабое совпадение
  < 0.6     = Плохое совпадение

Реальный пример: системы суммирования

import numpy as np
from rouge_score import rouge_scorer

scorer = rouge_scorer.RougeScorer(['rouge1', 'rouge2', 'rougeL'])

# Статья о искусственном интеллекте
article = """
Искусственный интеллект (ИИ) - это одна из самых быстро развивающихся 
областей техники. Машины теперь могут распознавать образы, переводить языки 
и даже генерировать текст. Трансформеры произвели революцию в NLP. 
Embedding-модели меняют способ, как мы обрабатываем данные.
"""

# Три разные системы суммирования
sum_system1 = "Искусственный интеллект - быстро развивающаяся область. Машины могут распознавать образы и переводить языки. Трансформеры произвели революцию в NLP."

sum_system2 = "ИИ быстро развивается. Машины теперь могут делать многое."

sum_system3 = "Искусственный интеллект это очень важно для нас всех и мы должны его развивать."

# Оценка
print("System 1 (хорошая)")
scores1 = scorer.score(article, sum_system1)
print(f"  ROUGE-1 F1: {scores1['rouge1'].fmeasure:.3f}")
print(f"  ROUGE-2 F1: {scores1['rouge2'].fmeasure:.3f}")
print(f"  ROUGE-L F1: {scores1['rougeL'].fmeasure:.3f}")
# Результаты: 0.8-0.85 (хорошее совпадение)

print("\nSystem 2 (слабая)")
scores2 = scorer.score(article, sum_system2)
print(f"  ROUGE-1 F1: {scores2['rouge1'].fmeasure:.3f}")
print(f"  ROUGE-2 F1: {scores2['rouge2'].fmeasure:.3f}")
print(f"  ROUGE-L F1: {scores2['rougeL'].fmeasure:.3f}")
# Результаты: 0.5-0.6 (слабое совпадение)

print("\nSystem 3 (галлюцинация)")
scores3 = scorer.score(article, sum_system3)
print(f"  ROUGE-1 F1: {scores3['rouge1'].fmeasure:.3f}")
print(f"  ROUGE-2 F1: {scores3['rouge2'].fmeasure:.3f}")
print(f"  ROUGE-L F1: {scores3['rougeL'].fmeasure:.3f}")
# Результаты: 0.3-0.4 (плохое совпадение)

Precision, Recall и F1 в контексте ROUGE

ROUGE Recall: насколько полно сгенерированный текст покрывает эталон
- Высокий recall = модель включила важные части эталона
- Низкий recall = модель пропустила важные части

ROUGE Precision: насколько точен сгенерированный текст
- Высокий precision = всё в сгенерированном тексте было в эталоне
- Низкий precision = модель добавила лишнего

F1 = гармоническое среднее между Precision и Recall

Когда использовать ROUGE

Используй ROUGE когда:

  1. Оцениваешь системы суммирования текста
  2. Оцениваешь машинный перевод
  3. Оцениваешь системы вопрос-ответ
  4. Есть эталонные ответы для сравнения

НЕ используй ROUGE когда:

  1. Нет эталонных текстов для сравнения
  2. Текст может быть сгенерирован несколькими способами
  3. Нужна семантическая оценка (один текст может означать то же, но звучать по-другому)
  4. Работаешь с творческими текстами (стихи, рассказы)

Ограничения ROUGE

1. N-граммы игнорируют синонимы
   "большой" и "огромный" считаются разными
   
2. Чувствительна к порядку слов
   "кот сидит" и "сидит кот" - разные для ROUGE
   
3. Не понимает семантику
   "модель хорошая" и "модель плохая" имеют похожий ROUGE
   
4. Требует эталонный текст
   Невозможно оценить если нет reference

Современные альтернативы

BERTScore: использует BERT для семантического сравнения
METEOR: учитывает синонимы и паraphrase
CIDEr: специально для описания изображений
BLEU: похожа на ROUGE, для машинного перевода

Заключение

ROUGE - это стандартная метрика для оценки качества автоматически сгенерированного текста. Она основана на сравнении n-грамм и subsequence между сгенерированным и эталонным текстами. Хотя ROUGE имеет ограничения (не понимает семантику), она остаётся одной из самых используемых метрик в NLP для объективной оценки.