Как померить близость текстов? Такое часто встречается если у вас задача сравнить эталонный перевод с полученным, перефразировку или суммаризацию, сделанную LLM или другим алгоритмом с эталонной.
Вообще есть более простые способы, чем BLEU и ROUGE и начнем мы с них, чтобы подойти к более сложному с пониманием дела.
Представим ситуацию - у вас есть алгоритм, который решает задачу преобразования текстов, например машинный перевод с русского на английский, или перефразировка диалога с пользователем в поисковый вопрос, или аннотация статьи 3-мя предложениями и т.д.
Вы составили тестовый датасет для алгортима из 100 примеров, где у вас есть входной текст и эталонный текст. Алгоритм содал вам кандидатные тексты. И теперь вам надо сравнить кандитатов и эталоны.
Хорошо - плохо
Самый простой способ - это посмотреть глазами. Например, если вы считаете что кандидат хороший и похож на эталон - ставим 1, если плохой и не похож - ставим 0.
Это просто, но требует ручной работы. И это сложно, если несколко человек делают это или вы делаете в разное время с разным настроением. Где граница между похож и не похож? Где граница между хорошо и плохо? Ее надо описать. Иначе вы будете получать несогласованные результаты.
Можно делать это разными людьми и считать среднюю оценку. Но это все стоит времени и денег.
Баллы
Можно записать критерии, ввести баллы по нескольким шкалам и размечать людьми.
Самый простой светофорчик:
Далее люди оценивают по критериям, ставя баллы по шкалам и вы получаете среднюю оценку по каждой шкале.
Но что делать если алгоритм немного поменялся, вы подбираете параметры. На каждый чих переоценивать людьми? Очень долго и очень дорого. Не масштабируемо, не автоматизируемо.
А давайте посчитаем похожесть текстов автоматически. Есть ли такие способы? Конечно есть.
Часто достаточно полезно при работе с текстами снизить вариативность, например нам не критично для пониманию общей ситуации о чем идет речь:
детали не важны, мы понимаем, что разговор про кошку.
Для анализа текстов часто делают лемматизацию или стемминг. Это разные операции, но смысл примерно одинаков - мы снижаем шум и вариативность.
Но мера Жаккара не очень хорошо коррелирует с ручной оценкой людьми. Поэтому потребовалось что-то похитрее.
BLEU (Bilingual Evaluation Understudy) — это алгоритм для оценки качества текста, который был машинно переведен с одного естественного языка на другой. Качество считается соответствием между выходом машины и переводом человека: "чем ближе машинный перевод к профессиональному человеческому переводу, тем он лучше" — это центральная идея за BLEU. Изобретенный в IBM в 2001 году, BLEU был одним из первых метрик, заявивших о высокой корреляции с человеческими суждениями о качестве, и остается одной из самых популярных автоматизированных и недорогих метрик.
Оценки вычисляются для отдельных переведенных сегментов — обычно предложений — путем их сравнения с набором качественных эталонных переводов (т.е. к каждому фрагменту оригинала предлагается несколько вариантов перевода на целевом языке - как если бы мы могли сказать об обном и том же разными словами). Затем эти оценки усредняются по всему корпусу, чтобы получить оценку общего качества перевода. Понятность или грамматическая правильность не учитываются.
Выход BLEU всегда является числом между 0 и 1. Это значение указывает, насколько похож кандидатный текст на эталонные тексты, причем значения, близкие к 1, представляют более похожие тексты. Лишь немногие человеческие переводы достигнут оценки 1, так как это указывало бы на то, что кандидат идентичен одному из эталонных переводов. Поэтому для хорошего перевода не обязательно достигать оценки 1. Добавление дополнительных эталонных переводов увеличит оценку BLEU, так как будет больше возможностей для совпадения.
Математическое определение
Основная установка
Первоначальная попытка определения оценки BLEU принимает два аргумента: кандидатную строку \(\displaystyle {\hat {y}}\) и список эталонных строк \(\displaystyle (y^{(1)},...,y^{(N)})\). Идея заключается в том, что \(\displaystyle BLEU({\hat {y}};y^{(1)},...,y^{(N)})\) должно быть близко к 1, когда \(\displaystyle {\hat {y}}\) похож на \(\displaystyle y^{(1)},...,y^{(N)}\), и близко к 0, если нет.
По аналогии, оценка BLEU похожа на учителя языка, который пытается оценить качество студенческого перевода \(\displaystyle {\hat {y}}\) , проверяя, насколько он следует эталонным ответам \(\displaystyle y^{(1)},...,y^{(N)}\).
BLEU — это метрика оценки качества машинного перевода, которая основывается на сравнении отдельных слов (unigrams) и их сочетаний (n-grams) в переводе и эталонном тексте (группе текстов). Сначала считается, сколько таких совпадений есть в переводе, и это число делится на общее количество слов и сочетаний в самом переводе — получая так называемую точность (precision). Чтобы не завышать оценку для слишком коротких или неполных переводов, к результату применяется поправка — штраф за краткость (brevity penalty).
Основная идея BLEU
BLEU смотрит, сколько слов и сочетаний слов из перевода встречаются в эталонном тексте. Это называется n-gram precision.
Затем BLEU применяет штраф за краткость, чтобы не награждать слишком короткие переводы.
Как вычисляется BLEU: пошагово
Шаг 1: Подготовка
У нас есть:
Пример:
Шаг 2: Посчитать n-граммы
n-грамма — это последовательность из n слов.
Для BLEU обычно используют n = 1 до 4, т.е. унитраммы (unigrams), биграммы (bigrams), триграммы (trigrams), четырёхграммные сочетания.
Рассчитаем для unigram и bigram:
Unigrams (n=1):
В переводе: the, cat, is, on, the, mat В эталоне: the, cat, is, lying, on, the, mat
Сколько слов из перевода есть в эталоне? Практически все, кроме одного слова: lying. То есть 6 слов в переводе, 5 совпали → точность: 5/6 ≈ 0.83
Bigrams (n=2):
Перевод: the cat, cat is, is on, on the, the mat Эталон: the cat, cat is, is lying, lying on, on the, the mat
Совпадающие биграммы: the cat, cat is, on the, the mat → 4 совпадения из 5 → точность: 4/5 = 0.8
Шаг 3: Среднее геометрическое точностей
BLEU использует среднее геометрическое всех точностей (обычно для n=1 до n=4). Упрощённо:
\[ \text{BLEU} = \left( p_1 \times p_2 \times \dots \times p_n \right)^{\frac{1}{n}}\]
Например, если только unigram и bigram:
\[ \text{BLEU} = \left( 0.83 \times 0.8 \right)^{\frac{1}{2}} \approx 0.815\]
Шаг 4: Штраф за краткость (Brevity Penalty)
Если машинный перевод короче, чем эталон, BLEU штрафует его, потому что он может быть неполным.
Формула штрафа:
BP = 1, если длина перевода ≥ длина эталона
BP = exp(1 - длина эталона / длина перевода), если перевод короче
Пример:
Тогда:
\[ BP = \exp\left(1 - \frac{7}{6}\right) = \exp(-0.1667) \approx 0.85\]
Итоговый BLEU:
Final_BLEU = BP × среднее геометрическое точностей
Final_BLEU = 0.85 × 0.815 ≈ 0.69 или ~69 баллов
Итог
Шаг | Что делается |
---|---|
1 | Берём перевод и эталон |
2 | Считаем точность (precision) по n-граммам (unigram, bigram и т.д.) |
3 | Находим среднее геометрическое этих точностей |
4 | Применяем штраф за краткость, если перевод слишком короткий |
5 | Получаем финальную оценку BLEU от 0 до 1 (или 0–100) |
Зачем нужен BLEU?
В целом в практике считается, что BLEU хорошо коррелирует с человеческими оценками. Однако существует ряд нюансов, например BLEU не может справляться с языками, не имеющими границ слов. Спроектированный для использования с несколькими эталонными переводами, на практике он чаще используется только с одним.
BLEU зависит от техники токенизации, и оценки, достигнутые с разными техниками, например с лемматизацией текстов, стеммингом, в исходном виде, с учетом пуктуации и т.д. - могут быть существенно разными.
ROUGE бывают разные: ROUGE-1, ROUGE-2, ..., ROUGE-N и ROUGE-L
ROUGE — это набор метрик для оценки качества текста (например, машинного перевода или суммаризации), которые сравнивают машинный результат (candidate) с эталонным текстом (reference).
В отличие от BLEU, которая ориентируется на precision (точность), ROUGE больше фокусируется на recall — то есть насколько много информации из эталона содержится в машинном результате.
Основные виды метрик ROUGE
Название | Описание |
---|---|
ROUGE-1 | Считает совпадения отдельных слов (unigrams) между кандидатом и эталоном |
ROUGE-2 | Считает совпадения пар последовательно идущих слов (bigrams) |
ROUGE-N | Обобщение для n-грамм (обычно N=1, 2 или 3) |
ROUGE-L | Учитывает самую длинную общую подпоследовательность слов (Longest Common Subsequence, LCS) |
ROUGE-N основана на количестве совпадающих n-грамм между кандидатом и эталоном.
Формула:
\[ \text{ROUGE-N} = \frac{\text{Число совпадающих n-грамм}}{\text{Общее число n-грамм в эталоне}}\]
То есть это recall: сколько из эталонных n-грамм нашлось в кандидате.
Пример:
Шаг 1: Выберем ROUGE-1 (unigrams)
Разобьём оба предложения на unigrams (слова):
Посчитаем пересечение (сколько слов из эталона встречается в кандидате):
\[ \text{ROUGE-1} = \frac{6}{7} \approx 0.857\]
Таким образом, ROUGE-1 ≈ 0.857
Шаг 2: Теперь посчитаем ROUGE-2 (bigrams)
Bigrams — пары соседних слов.
Всего bigrams в эталоне: 6
\[ \text{ROUGE-2} = \frac{4}{6} = 0.667\]
Таким образом, ROUGE-2 = 0.667
ROUGE-L
ROUGE-L использует не просто точное совпадение n-грамм, а наибольшую общую подпоследовательность (LCS) — последовательность слов, встречающихся в обоих текстах в том же порядке, но не обязательно подряд.
Это позволяет учитывать синтаксическую структуру предложений лучше, чем простое сравнение n-грамм.
Пример:
Ищем LCS (наибольшая общая подпоследовательность):
Можно найти следующую цепочку:
То есть длина LCS = 6
Длина эталона = 7 Длина кандидата = 6
Формула ROUGE-L:
\[ \text{ROUGE-L} = \frac{LCS(C, R)}{\max(\text{длина эталона}, \text{длина кандидата})}\]
Подставляем значения:
\[ \text{ROUGE-L} = \frac{6}{7} \approx 0.857\]
Таким образом, ROUGE-L ≈ 0.857
Итого получилось
Метрика | Значение | Что считается |
---|---|---|
ROUGE-1 | ≈ 0.857 | Совпадающие слова (unigrams) |
ROUGE-2 | ≈ 0.667 | Совпадающие пары слов (bigrams) |
ROUGE-L | ≈ 0.857 | Наибольшая общая подпоследовательность |
F-score precision-recall
Хотя BLEU и ROUGE работают по-разному, можно использовать F1 для комбинации precision (из BLEU) и recall (из ROUGE) .
Для примера возьмём ранее вычисленные значения: Из предыдущих вычислений:
Precision (например, из BLEU-1):
p1≈0.83
Recall (например, из ROUGE-1):
r1≈0.857
Теперь посчитаем F1-score :
\[ F1 = 2 \cdot \frac{0.83 \cdot 0.857}{0.83 + 0.857} = 2 \cdot \frac{0.711}{1.687} \approx 2 \cdot 0.421 \approx 0.842\]
Таким образом, F1 ≈ 0.842
Также можно строить сводный показатель например, брать среднее из ROUGE-1 и ROUGE-2 и строить F-меру со значением BLEU-2.
Такой показатель позволит учитывать не только точность, но и полноту кандидатного текста по отношению к эталону.
Но все равно мы остаемся ограничены употребленными словами, если кандидатный текст использует синонимы, которые не сводятся к общим токенам через стемминг и лемматизацию, то мера будет низкой, даже для близких по смыслу текстов.
Чтобы работать уже с семантической а не пословной близостью, используют метрики на основе семантических эмбеддингов, например BERT-score.
BERTScore — это современная и мощная метрика оценки качества текста (например, машинного перевода, суммаризации), которая использует предобученные языковые модели, такие как BERT, для более точного сравнения кандидат-текста с эталонным.
BERTScore — это автоматическая метрика, которая:
В отличие от BLEU и ROUGE, которые работают с точными совпадениями n-грамм, BERTScore:
Пример:
Шаг 1: Токенизация
Разбиваем оба предложения на токены (слова):
Шаг 2: Получить эмбеддинги слов
С помощью предобученной модели BERT получаем векторы (эмбеддинги) для каждого слова в обоих предложениях.
Эти векторы учитывают контекст использования слова, то есть "мат" в значении "коврик" и "мат" в значении "ругательства" будут представлены разными векторами.
Шаг 3: Считаем сходство между парами слов
Для каждого слова в кандидате считаем косинусное сходство со всеми словами в эталоне и выбираем наибольшее значение.
Например:
Таким образом, даже если слово не совпадает буквально, BERTScore может его оценить.
Пусть:
Precision:
\[ P = \frac{1}{m} \sum_{i=1}^{m} \max_{j} s_{ij}\]
(сколько слов из кандидата найдено в эталоне)
Recall:
\[ R = \frac{1}{n} \sum_{j=1}^{n} \max_{i} s_{ij}\]
(сколько слов из эталона покрыто кандидатом)
F1-Score:
\[ F1 = 2 \cdot \frac{P \cdot R}{P + R}\]
Пример расчёта (упрощённый)
Слово в Candidate | Наиболее похожее в Reference | Сходство |
---|---|---|
The | The | 0.95 |
cat | cat | 0.98 |
is | is | 0.97 |
on | on | 0.96 |
the | the | 0.94 |
mat | mat | 0.99 |
Precision = среднее по этим значениям ≈ (0.95+0.98+0.97+0.96+0.94+0.99)/6 ≈ 0.965
Теперь делаем то же самое в обратную сторону (Recall):
Слово в Reference | Наиболее похожее в Candidate | Сходство |
---|---|---|
The | The | 0.95 |
cat | cat | 0.98 |
is | is | 0.97 |
lying | on (или is) | ~0.4 |
on | on | 0.96 |
the | the | 0.94 |
mat | mat | 0.99 |
Recall ≈ (0.95+0.98+0.97+0.4+0.96+0.94+0.99)/7 ≈ 0.884
Теперь посчитаем F1:
\[ F1 = 2 \cdot \frac{0.965 \cdot 0.884}{0.965 + 0.884} \approx 2 \cdot \frac{0.853}{1.849} \approx 0.923\]
Таким образом, BERTScore ≈ 0.923
Преимущества BERTScore
Плюс | Объяснение |
---|---|
✔ Учитывает семантику | Может понять, что «running» и «jogging» похожи |
✔ Не требует точных совпадений | Работает с синонимами и перефразировками |
✔ Лучше коррелирует с человеком | Часто показывает более реалистичные оценки |
✔ Поддерживает несколько языков | Если используется мультиязычная модель (например, mBERT или XLM-R) |
Если надо посчитать BERTScore программно, например в Python, можно использовать библиотеку bert_score.
Но применять эту метрику тоже надо осторожно. BERTScore оценивает, насколько два текста похожи по словам и смыслу, учитывая контекст. Однако эта метрика не проверяет, совпадают ли факты в текстах. Например, если в двух инструкциях одинаковый стиль и обе говорят о приготовлении супа, BERTScore не заметит, что ингредиенты или порядок действий различаются.
Аналогично им не стоит проверять ответы чат бота с конкретными техническими деталями - все инструкции по сборке шкафа будут в этой метрике на одно лицо, только по неправильной инструкции шкаф не соберется.
Что же делать?
В целом на практике можно использовать все приведенные метрики
По крайней мере посчитайте все эти метрики, разметьте руками несколько десятков примеров в три градации - плохо, средне, хорошо. И посчитайте корреляции. Это поможет вам выбрать ту метрику, которая коррелирует с вашей бизнес-задачей. А возможно вы выберете 2-3 разных метрики и определите способ как их усреднить, чтобы это еще лучше коррелировало с вашей ручной разметкой.