NLP – Wynik BLEU do oceny tłumaczenia maszynowego neuronowego – Python

Neuronowe tłumaczenie maszynowe (NMT) jest standardowym zadaniem w NLP polegająca na przetłumaczeniu tekstu z języka źródłowego na język docelowy. BLEU (dubler oceny dwujęzycznej) to wynik używany do oceny tłumaczeń wykonanych przez tłumacza maszynowego. W tym artykule przyjrzymy się matematyce stojącej za wynikiem BLEU i jej implementacją w Pythonie.

Spis treści

Co to jest wynik BLEU?

Jak wspomniano powyżej, wynik BLEU jest wskaźnikiem oceny zadań tłumaczenia maszynowego. Oblicza się go poprzez porównanie n-gramów zdań przetłumaczonych maszynowo na n-gram zdań przetłumaczonych przez człowieka. Zwykle zaobserwowano, że wynik BLEU maleje wraz ze wzrostem długości zdania. Może się to jednak różnić w zależności od modelu użytego do tłumaczenia. Poniżej znajduje się wykres przedstawiający zmianę wyniku BLEU w zależności od długości zdania.

Wyrażenie matematyczne dla wyniku BLEU

Matematycznie wynik BLEU jest podawany w następujący sposób:

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

Tutaj,

  • BP oznacza Kara za zwięzłość
  • w_i jest wagą dla n-gramowej precyzji rzędu i (zwykle wagi są równe dla wszystkich i)
  • p_i jest n-gramowym zmodyfikowanym wynikiem precyzji rzędu i.
  • N to maksymalny rząd n-gramów do rozważenia (zwykle do 4)

Zmodyfikowana precyzja n-gramowa ( p_i )

Zmodyfikowana precyzja p_i jest faktycznie obliczany jako stosunek liczby N -gramy w tłumaczeniu kandydata, które dokładnie pasują N -gramy w dowolnym tłumaczeniu referencyjnym, przycięte przez liczbę N -gramy w tłumaczeniu kandydata.

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

Tutaj,

  • Count Clips to funkcja, która odcina liczbę pasujących n-gramów ( matches_i ) przez maksymalną liczbę n-gramów we wszystkich tłumaczeniach referencyjnych ( ext{max-ref-count}_i .
  • matches_i to liczba n-gramów rzędu i, które pasują Dokładnie między tłumaczeniem kandydującym a którymkolwiek z tłumaczeń referencyjnych.
  • ext{max-ref-count}_i to maksymalna liczba wystąpień konkretnego n-gramu rzędu i znalezionego w dowolnym pojedynczym tłumaczeniu referencyjnym.
  • ext{candidate-n-grams}_i to całkowita liczba n-gramów porządku i występujących w tłumaczeniu kandydującym.

Kara za zwięzłość (BP)

Kara za zwięzłość karze tłumaczenia krótsze niż tłumaczenia referencyjne. Wyrażenie matematyczne dla Kara za zwięzłość podaje się następująco:

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

Tutaj,

  • r jest długością potencjalnego tłumaczenia
  • c to średnia długość tłumaczeń referencyjnych.

Jak obliczyć wynik BLEU?

Aby lepiej zrozumieć sposób obliczania BLEU Score, weźmy przykład. Poniżej przedstawiono przypadek tłumaczenia z francuskiego na angielski:

  • Tekst źródłowy (w języku francuskim) : ten obraz został kliknięty przeze mnie
  • Tekst przetłumaczony maszynowo : zdjęcie zdjęcie mojego autorstwa
  • Tekst referencyjny-1 : to zdjęcie zostało kliknięte przeze mnie
  • Tekst referencyjny-2 : zdjęcie zostało kliknięte przeze mnie

Wyraźnie widać, że tłumaczenie wykonane przez maszynę nie jest dokładne. Obliczmy punktację BLEU dla tłumaczenia.

Unigram zmodyfikowana precyzja

Dla n = 1, obliczymy Zmodyfikowana precyzja Unigramu:

Unigram Policz w tłumaczeniu maszynowym

Maksymalna liczba w ref

Obcięta liczba =
min (liczba w MT, maksymalna liczba w Ref)
the 2

1

1
zdjęcie 2

1

1
przez 1

1

1
Ja 1

1

1

Tutaj unigramy (obrazek, ja) zostały wzięte z tekstu przetłumaczonego maszynowo. Liczba odnosi się do częstotliwości n-gramów w całym tekście przetłumaczonym maszynowo, a liczba przyciętych odnosi się do łącznej częstotliwości występowania unigramów w tekstach referencyjnych.

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}

Bigram zmodyfikowana precyzja

Dla n = 2 , obliczymy Bigram zmodyfikowana precyzja :

Biggramy Licz w MT

Maksymalna liczba w ref

Obcięta liczba =
min (liczba w MT, maksymalna liczba w Ref)
zdjęcie 2

1

1
wyobraź sobie 1

0

0
zdjęcie wg 1

0

0
przeze mnie 1

1

1

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

Zmodyfikowana precyzja Trigramu

Dla n = 3 , obliczymy Zmodyfikowana precyzja Trigramu:

Trygram Licz w MT

Maksymalna liczba w ref

Obcięta liczba =
min (liczba w MT, maksymalna liczba w Ref)
zdjęcie 1

0

0
wyobraź sobie zdjęcie 1

0

0
zdjęcie wg 1

0

0
zdjęcie mojego autorstwa 1

0

0

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

4-gramowa zmodyfikowana precyzja

Dla n =4 , obliczymy 4-gramowa zmodyfikowana precyzja:

4 gramy Liczyć

Maksymalna liczba w ref

Obcięta liczba =
min (liczba w MT, maksymalna liczba w Ref)
zdjęcie zdjęcie 1

0

0
zrób zdjęcie według 1

0

0
zdjęcie mojego autorstwa 1

0

0

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

Kara za zwięzłość obliczania

Teraz obliczyliśmy wszystkie wyniki precyzji, znajdźmy karę za zwięzłość tłumaczenia:

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

  • Długość wyjściowa tłumaczenia maszynowego = 6 (Tekst tłumaczony maszynowo: zdjęcie, zdjęcie mojego autorstwa)
  • Maksymalna referencyjna długość wyjściowa = 6 (Tekst referencyjny-2: zdjęcie zostało kliknięte przeze mnie)

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

Obliczanie wyniku BLEU

Ostatecznie punktacja BLEU dla powyższego tłumaczenia jest określona wzorem:

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

Podstawiając wartości otrzymujemy,

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

Na koniec obliczyliśmy wynik BLEU dla danego tłumaczenia.

Implementacja BLEU Score w Pythonie

Po ręcznym obliczeniu wyniku BLEU jesteśmy już przyzwyczajeni do matematycznego obliczania wyniku BLEU. Jednak Python NLTK udostępnia wbudowany moduł do obliczania wyniku BLEU. Obliczmy wynik BLEU dla tego samego przykładu tłumaczenia co powyżej, ale tym razem przy użyciu NLTK.

Kod:

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.