NLP – BLEU Score for evaluering af neural maskinoversættelse – Python

Neural Machine Translation (NMT) er en standardopgave i NLP der involverer oversættelse af en tekst fra et kildesprog til et målsprog. BLEU (Bilingual Evaluation Understudy) er en score, der bruges til at evaluere oversættelser udført af en maskinoversætter. I denne artikel vil vi se matematikken bag BLEU-scoren og dens implementering i Python.

Indholdsfortegnelse

Hvad er BLEU-score?

Som nævnt ovenfor er BLEU Score en evalueringsmetrik for maskinoversættelsesopgaver. Det beregnes ved at sammenligne n-gram af maskinoversatte sætninger til n-grammet af menneskeoversatte sætninger. Normalt er det blevet observeret, at BLEU-scoren falder, når sætningslængden øges. Dette kan dog variere afhængigt af den model, der bruges til oversættelse. Det følgende er en graf, der viser variationen af ​​BLEU-score med sætningslængden.

Matematisk udtryk for BLEU-score

Matematisk gives BLEU-score som følger:

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

Her,

  • BP står for Korthed Straf
  • w_i er vægten for n-gram præcision af orden i (typisk er vægten ens for alle i)
  • p_i er den n-gram modificerede præcisionsscore af orden i.
  • N er den maksimale n-gram rækkefølge, der skal tages i betragtning (normalt op til 4)

Modificeret n-gram præcision ( p_i )

Den modificerede præcision p_i beregnes nemlig som forholdet mellem antallet af n -gram i kandidatoversættelsen, der matcher nøjagtigt n -gram i enhver af referenceoversættelserne, klippet af antallet af n -gram i kandidatoversættelsen.

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

Her,

  • Count Clips er en funktion, der klipper antallet af matchede n-gram ( matches_i ) med det maksimale antal af n-gram på tværs af alle referenceoversættelser ( ext{max-ref-count}_i .
  • matches_i er antallet af n-gram orden i, der matcher Nemlig mellem kandidatoversættelsen og enhver af referenceoversættelserne.
  • ext{max-ref-count}_i er det maksimale antal forekomster af den specifikke n-gram af orden, jeg fandt i en enkelt referenceoversættelse.
  • ext{candidate-n-grams}_i er det samlede antal n-gram ordre i præsenterer i kandidatoversættelsen.

Brevity Penalty (BP)

Korthed Straf straffer oversættelser, der er kortere end referenceoversættelserne. Det matematiske udtryk for Korthed Straf er givet som følger:

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

Her,

  • r er længden af ​​kandidatoversættelsen
  • c er den gennemsnitlige længde af referenceoversættelserne.

Hvordan beregner man BLEU-score?

For en bedre forståelse af beregningen af ​​BLEU-score, lad os tage et eksempel. Følgende er en sag for fransk til engelsk oversættelse:

  • Kildetekst (fransk) : dette billede er klikket af mig
  • Maskinoversat tekst : billedet billedet af mig
  • Referencetekst-1 : dette billede er klikket af mig
  • Referencetekst-2 : billedet blev klikket af mig

Vi kan tydeligt se, at oversættelsen udført af maskinen ikke er nøjagtig. Lad os beregne BLEU-score for oversættelsen.

Unigram modificeret præcision

Til n = 1, vi beregner Unigram modificeret præcision:

Unigram Tæl i maskinoversættelse

Max antal i Ref

Klippet Antal =
min (tæller i MT, maks. antal i ref)
det 2

1

1
billede 2

1

1
ved 1

1

1
mig 1

1

1

Her er unigrammerne (the, picture, by, me) taget fra den maskinoversatte tekst. Count refererer til frekvensen af ​​n-gram i al den maskinoversatte tekst, og Clipped Count refererer til frekvensen af ​​unigram i referenceteksterne samlet.

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 modificeret præcision

Til n = 2 , beregner vi Bigram modificeret præcision :

Bigrammer Tæl i MT

Max antal i ref

Klippet Antal =
min (tæller i MT, maks. antal i ref)
billedet 2

1

1
billede af 1

0

0
billede af 1

0

0
af mig 1

1

1

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

Trigram modificeret præcision

Til n = 3 , beregner vi Trigram modificeret præcision:

Trigram Tæl i MT

Max antal i ref

Klippet Antal =
min (Tæller i MT, Maks. Antal i Ref)
billedet 1

0

0
billede billedet 1

0

0
billedet af 1

0

0
billede af mig 1

0

0

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

4 grams modificeret præcision

Til n = 4 , beregner vi 4 grams modificeret præcision:

4 gram Tælle

Max antal i ref

Klippet Antal =
min (tæller i MT, maks. antal i ref)
billedet billedet 1

0

0
billede billedet af 1

0

0
billedet af mig 1

0

0

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

Computing Brevity Penalty

Nu har vi beregnet alle præcisionsresultaterne, lad os finde Brevity Penalty for oversættelsen:

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

  • Maskinoversættelse outputlængde = 6 (Maskinoversat tekst: billedet billedet af mig)
  • Max reference udgangslængde = 6 (Referencetekst-2: billedet blev klikket af mig)

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

Udregning af BLEU-score

Endelig er BLEU-score for ovenstående oversættelse givet af:

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

Ved at erstatte værdierne får vi,

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

Til sidst har vi beregnet BLEU-scoren for den givne oversættelse.

BLEU Score Implementering i Python

Efter at have beregnet BLEU-scoren manuelt, er man nu vant til den matematiske bearbejdning af BLEU-scoren. Dog Python's NLTK giver et indbygget modul til BLEU-scoreberegning. Lad os beregne BLEU-score for det samme oversættelseseksempel som ovenfor, men denne gang ved hjælp af NLTK.

Kode:

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.