В чем разница между метриками BLEU и ROUGE?

Ответ

BLEU и ROUGE — это автоматические метрики для оценки качества сгенерированного текста (машинного перевода, суммаризации) путем сравнения с эталонными (референсными) текстами.

Критерий BLEU (Bilingual Evaluation Understudy) ROUGE (Recall-Oriented Understudy for Gisting Evaluation)
Основная идея Точность (Precision): Какая доля n-грамм из сгенерированного текста есть в референсе? Полнота (Recall): Какая доля n-грамм из референса есть в сгенерированном тексте?
Типичное применение Оценка машинного перевода. Оценка автоматической суммаризации.
Ключевой компонент Штраф за краткость (Brevity Penalty), наказывает за слишком короткий вывод. Разные варианты: ROUGE-N (по n-граммам), ROUGE-L (по самой длинной общей подпоследовательности).
Интерпретация Выше = лучше. Идеальное совпадение = 1.0. Выше = лучше. Идеальное совпадение = 1.0.

Пример вычисления BLEU для перевода:

from nltk.translate.bleu_score import sentence_bleu, SmoothingFunction
reference = [['the', 'cat', 'is', 'on', 'the', 'mat']]
candidate = ['the', 'cat', 'sat', 'on', 'the', 'mat']
# Используем сглаживание для коротких предложений
smoothie = SmoothingFunction().method4
score = sentence_bleu(reference, candidate, smoothing_function=smoothie)
print(f"BLEU score: {score:.4f}")  # ~0.59

Пример вычисления ROUGE для суммаризации:

# Установка: pip install rouge
from rouge import Rouge
rouge = Rouge()
hypothesis = "the cat is on the mat"
reference = "the cat sat on the mat"
scores = rouge.get_scores(hypothesis, reference)
# Обращаем внимание на ROUGE-L (F1-score)
print(f"ROUGE-L F1: {scores[0]['rouge-l']['f']:.4f}")  # ~0.8889

Вывод: BLEU фокусируется на точности сгенерированного текста, ROUGE — на том, насколько хорошо он покрывает ключевые идеи референса.

Ответ 18+ 🔞

Ну слушай, вот тебе про эти ваши метрики, чтобы ты не думал, что это какая-то высшая математика, доступная только избранным. Всё проще, чем кажется, хотя и выглядит как пиздопроебибна.

Вот представь, есть два главных загонщика за качеством текста: BLEU и ROUGE. И они, блядь, как два брата-близнеца, которые постоянно спорят, кто из них прав. Один смотрит на твой текст и орет: «Да ты, сука, наговорил лишнего!» А второй ему в ответ: «Да ты, мудак, половину важного упустил!» И оба по-своему правы, ёпта.

BLEU — это такой занудный перфекционист. Его основная забота — точность. Он берёт твой сгенерированный бред, разбивает на кусочки (n-граммы) и начинает сверять с эталонным, правильным текстом. Если ты накропал какую-то дичь, которой в оригинале нет, он тебе сразу баллы срезает. А ещё у него есть любимая фишка — штраф за краткость. То есть если ты сэкономил буквы и выдал «кот сел», а в эталоне было «большой пушистый кот уселся на ковёр», то считай, что ты накрылся медным тазом. Он тебя накажет, хитрая жопа. Его обожают использовать для оценки машинного перевода, потому что там важно не наворотить отсебятины.

А ROUGE — это его полная противоположность, товарищ, который помешан на полноте. Ему похуй, что ты там ещё добавил от себя. Его волнует только одно: упомянул ли ты ВСЁ важное, что было в исходнике? Если в референсном тексте было десять ключевых фактов, а ты в своей выжимке вспомнил только про три, то, чувак, доверия к тебе — ноль ебать. Он тебе сразу низкий реколл поставит. Поэтому его тащат на оценку автоматических суммаризаторов и рефератов — там главное не упустить суть.

Вот смотри на примере кода, чтобы совсем всё стало ясно. Тут BLEU считает:

from nltk.translate.bleu_score import sentence_bleu, SmoothingFunction
reference = [['the', 'cat', 'is', 'on', 'the', 'mat']]
candidate = ['the', 'cat', 'sat', 'on', 'the', 'mat']
# Используем сглаживание для коротких предложений
smoothie = SmoothingFunction().method4
score = sentence_bleu(reference, candidate, smoothing_function=smoothie)
print(f"BLEU score: {score:.4f}")  # ~0.59

Видишь? Кандидат почти идеальный, но одно слово другое («sat» вместо «is»). И BLEU-то уже недоволен, выдает 0.59. Ну прям ядрёна вошь, придирается.

А вот ROUGE уже по-другому смотрит:

# Установка: pip install rouge
from rouge import Rouge
rouge = Rouge()
hypothesis = "the cat is on the mat"
reference = "the cat sat on the mat"
scores = rouge.get_scores(hypothesis, reference)
# Обращаем внимание на ROUGE-L (F1-score)
print(f"ROUGE-L F1: {scores[0]['rouge-l']['f']:.4f}")  # ~0.8889

Смотри, он видит, что суть-то сохранена! Кот, он, ковёр — всё на месте. Поэтому и оценка выше — почти 0.89. Для него главное, что ключевые сущности совпали и связь между ними прослеживается (это и есть ROUGE-L, по самой длинной общей подпоследовательности).

Короче, вывод, который даже дурак поймёт:

  • Хочешь проверить, не наворотил ли AI хуйни? Дай ему BLEU — он за точностью проследит.
  • Хочешь понять, не проебал ли AI половину смысла исходника? Дай ему ROUGE — он за полноту отвечает.

А в идеале, конечно, смотреть на обе метрики сразу, потому что по отдельности они, как полупидоры, — толку мало. Ну и человека в контур оценки не забывать подключать, а то эти цифры иногда обманывают, как мартышлюшки.