logo

NLP – BLEU Score for Evaluating Neural Machine Translation – Python

Нейронний машинний переклад (NMT) є стандартним завданням в НЛП що передбачає переклад тексту з мови оригіналу на мову перекладу. BLEU (двомовне оцінювання) це бал, який використовується для оцінки перекладів, виконаних машинним перекладачем. У цій статті ми побачимо математику, що лежить в основі оцінки BLEU, і її реалізацію в Python.

Зміст



Що таке BLEU Score?

Як зазначено вище, BLEU Score є показником оцінювання завдань машинного перекладу. Він розраховується шляхом порівняння n-грами речень, перекладених машиною, до n-грами речень, перекладених людиною. Зазвичай спостерігається, що бал BLEU зменшується зі збільшенням довжини речення. Однак це може відрізнятися залежно від моделі, яка використовується для перекладу. Нижче наведено графік, що зображує зміну балу BLEU залежно від довжини речення.

Математичний вираз для оцінки BLEU

Математично оцінка BLEU надається таким чином:

BLEU Score = BP * exp(sum_{i=1}^{N}(w_i * ln(p_i))



arraylist.sort

тут,

  • BP виступає за Штраф за стислість
  • w_i це вага для n-грамової точності порядку i (зазвичай ваги рівні для всіх i)
  • p_iє модифікованим n-грамовим показником точності порядку i.
  • N — це максимальний порядок n-грамів, який слід враховувати (зазвичай до 4)

Змінена точність n-грам (p_i)

Змінена точністьp_iдійсно розраховується як співвідношення між кількістю п -грами в варіанті перекладу, які точно відповідають п -грами в будь-якому з довідкових перекладів, обрізаних за кількістю п -грами в перекладі кандидата.

p_i = frac{ ext{Count Clip}(matches_i, ext{max-ref-count}_i)}{ ext{candidate-n-grams}_i}



тут,

  • Count Clips — це функція, яка обрізає кількість відповідних n-грамів (matches_i) за максимальною кількістю n-грамів у всіх еталонних перекладах ( ext{max-ref-count}_i.
  • matches_iце кількість n-грамів порядку i, які відповідають точно між кандидатським перекладом і будь-яким із еталонних перекладів.
  • ext{max-ref-count}_iце максимальна кількість входжень конкретної n-грами порядку i, знайдена в будь-якому перекладі посилання.
  • ext{candidate-n-grams}_iце загальна кількість n-грамів порядку i, присутніх у варіанті перекладу.

Штраф за стислість (BP)

Штраф за стислість карає переклади, які коротші, ніж переклади посилання. Математичний вираз для Штраф за стислість надається таким чином:

BP = exp(1- frac{r}{c})

тут,

  • r — довжина перекладу-кандидата
  • c – середня довжина еталонних перекладів.

Як обчислити бал BLEU?

Для кращого розуміння розрахунку BLEU Score розглянемо приклад. Нижче наведено приклад перекладу з французької на англійську:

  • Початковий текст (французькою) : це зображення клацнуло мною
  • Машинний переклад тексту : картинка моя картинка
  • Довідковий текст-1 : це зображення клацнуло мною
  • Довідковий текст-2 : на картинку клацнув я

Ми чітко бачимо, що переклад, виконаний машиною, є неточним. Давайте обчислимо бал BLEU для перекладу.

Unigram Modified Precision

для n = 1, ми розрахуємо Unigram Modified Precision:

УніграмаГраф у машинному перекладі

Максимальна кількість у Ref

Обрізана кількість =
хв (кількість у тоннах, максимальна кількість у посиланні)
в2

1

C# дата і час
1
картина2

1

1
за1

1

1
мене1

1

1

Тут уніграми (the, picture, by, me) узяті з машинно перекладеного тексту. Підрахунок означає частоту n-грамів у всьому тексті машинного перекладу, а обрізаний підрахунок означає частоту уніграми в довідкових текстах разом.

P_1 = frac{ ext{Clipped Count}}{ ext{Count in MT}} = frac{1+1+1+1}{2+2+1+1} =frac{4}{6} = frac{2}{3}

Модифікована точність біграми

для n = 2 , розрахуємо Модифікована точність біграми :

БіграмиРахувати в тоннах

Макс. кількість у посил

Обрізана кількість =
хв (кількість у тоннах, максимальна кількість у посиланні)
фото2

1

1
малюнок1

0

0
малюнок за1

0

0
мною1

1

1

P_2 = frac{ ext{Clip Count}}{ ext{Count in MT}} = frac{2}{5}

Триграма модифікованої точності

для n = 3 , розрахуємо Модифікована точність триграми:

array.sort у java
ТриграмаРахувати в тоннах

Макс. кількість у посил

Обрізана кількість =
хв (кількість у тоннах, максимальна кількість у посиланні)
малюнок1

0

0
малюнок малюнок1

0

0
малюнок за1

0

0
малюнок мною1

0

0

P_3 = frac{0+0+0+0}{1+1+1+1} =0.0

4-грамова модифікована точність

для n =4 , розрахуємо 4-грамова модифікована точність:

4-грамовийРахувати

Макс. кількість у посил

Обрізана кількість =
хв (кількість у тоннах, максимальна кількість у посиланні)
картина картина1

0

0
намалюйте картину1

0

0
картина від мене1

0

0

P_4 = frac{0+0+0}{1+1+1} =0.0

Обчислення штрафу за стислість

Тепер ми обчислили всі показники точності, давайте знайдемо штраф за стислість для перекладу:

Brevity Penalty = min(1, frac{Machine,Translation,Output,Length}{Maximum,Reference,Output,Length})

  • Довжина результату машинного перекладу = 6 (Текст машинного перекладу: малюнок малюнок моїм)
  • Максимальна вихідна довжина посилання = 6 (Довідковий текст-2: на картинку клацнув я)

Brevity Penalty (BP) = min(1, frac{6}{6}) = 1

Обчислення оцінки BLEU

Нарешті, оцінка BLEU для наведеного вище перекладу визначається так:

BLEU Score = BP * exp(sum_{n=1}^{4} w_i * log(p_i))

перетворення int на рядок у java

Підставляючи значення, отримуємо,

ext{BLEU Score} = 1 * exp(0.25*ln(2/3) + 0.25*ln(2/5) + 0*ln(0) + 0*ln(0))

ext{BLEU Score} = 0.718

Нарешті, ми розрахували бал BLEU для даного перекладу.

Реалізація оцінки BLEU у Python

Розрахувавши оцінку BLEU вручну, ви вже звикли до математичної обробки оцінки BLEU. Однак Python NLTK забезпечує вбудований модуль для розрахунку оцінки BLEU. Давайте обчислимо оцінку BLEU для того самого прикладу перекладу, що й вище, але цього разу з використанням NLTK.

код:

Python3

from> nltk.translate.bleu_score>import> sentence_bleu> # Define your desired weights (example: higher weight for bi-grams)> weights>=> (>0.25>,>0.25>,>0>,>0>)># Weights for uni-gram, bi-gram, tri-gram, and 4-gram> # Reference and predicted texts (same as before)> reference>=> [[>'the'>,>'picture'>,>'is'>,>'clicked'>,>'by'>,>'me'>],> >[>'this'>,>'picture'>,>'was'>,>'clicked'>,>'by'>,>'me'>]]> predictions>=> [>'the'>,>'picture'>,>'the'>,>'picture'>,>'by'>,>'me'>]> # Calculate BLEU score with weights> score>=> sentence_bleu(reference, predictions, weights>=>weights)> print>(score)>
     Output:   0.7186082239261684 We can see that the BLEU score computed using Python is the same as the one computed manually. Thus, we have successfully calculated the BLEU score and understood the mathematics behind it.>