logo

NLP – BLEU-score for evaluering av nevral maskinoversettelse – Python

Neural Machine Translation (NMT) er en standardoppgave i NLP som innebærer å oversette en tekst fra et kildespråk til et målspråk. BLEU (Bilingual Evaluation Understudy) er en poengsum som brukes til å evaluere oversettelsene utført av en maskinoversetter. I denne artikkelen vil vi se matematikken bak BLEU-poengsummen og dens implementering i Python.

Innholdsfortegnelse

Hva er BLEU-score?

Som nevnt ovenfor er BLEU Score en evalueringsberegning for maskinoversettelsesoppgaver. Det beregnes ved å sammenligne n-gram av maskinoversatte setninger til n-grammet av menneskeoversatte setninger. Vanligvis har det blitt observert at BLEU-skåren avtar etter hvert som strafflengden øker. Dette kan imidlertid variere avhengig av modellen som brukes for oversettelse. Følgende er en graf som viser variasjonen av BLEU-poengsummen med setningslengden.



Matematisk uttrykk for BLEU-poengsum

Matematisk er BLEU-score gitt som følger:

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

hvordan sette sammen strenger i java

Her,

  • BP står for Korthetsstraff
  • w_i er vekten for n-grams presisjon av orden i (vanligvis er vektene like for alle i)
  • p_ier den n-gram modifiserte presisjonspoengsummen av orden i.
  • N er den maksimale n-gram rekkefølgen å vurdere (vanligvis opptil 4)

Modifisert n-gram presisjon (p_i)

Den modifiserte presisjonenp_ier faktisk beregnet som forholdet mellom antall n -gram i kandidatoversettelsen som samsvarer nøyaktig n -gram i noen av referanseoversettelsene, klippet av antall n -gram i kandidatoversettelsen.

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

Her,

  • Count Clips er en funksjon som klipper antall matchende n-gram (matches_i) med maksimalt antall n-gram på tvers av alle referanseoversettelser ( ext{max-ref-count}_i.
  • matches_ier antall n-gram orden i som samsvarer nøyaktig mellom kandidatoversettelsen og noen av referanseoversettelsene.
  • ext{max-ref-count}_ier det maksimale antallet forekomster av det spesifikke n-gram av rekkefølgen jeg fant i en enkelt referanseoversettelse.
  • ext{candidate-n-grams}_ier det totale antallet n-gram ordre jeg presenterer i kandidatoversettelsen.

Brevity Penalty (BP)

Korthetsstraff straffer oversettelser som er kortere enn referanseoversettelsene. Det matematiske uttrykket for Korthetsstraff er gitt som følger:

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

Her,

  • r er lengden på kandidatoversettelsen
  • c er gjennomsnittslengden på referanseoversettelsene.

Hvordan beregne BLEU-score?

For en bedre forståelse av beregningen av BLEU-poengsummen, la oss ta et eksempel. Følgende er en sak for fransk til engelsk oversettelse:

  • Kildetekst (fransk) : dette bildet er klikket av meg
  • Maskinoversatt tekst : bildet bildet av meg
  • Referansetekst-1 : dette bildet er klikket av meg
  • Referansetekst-2 : bildet ble klikket av meg

Vi kan tydelig se at oversettelsen gjort av maskinen ikke er nøyaktig. La oss beregne BLEU-poengsummen for oversettelsen.

Unigram modifisert presisjon

Til n = 1, vi beregner Unigram modifisert presisjon:

UnigramTell i maskinoversettelse

Maks antall i Ref

Klippt Count =
min (Tell i MT, Max Count i Ref)
de2

1

1
bilde2

1

fjerner siste commit git
1
av1

1

1
meg1

1

1

Her er unigrammene (the, picture, by, me) hentet fra den maskinoversatte teksten. Count refererer til frekvensen av n-gram i all maskinoversatt tekst, og Clipped Count refererer til frekvensen av unigram i referansetekstene 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 modifisert presisjon

Til n = 2 , beregner vi Bigram modifisert presisjon :

BigramsTell i MT

Maks antall i Ref

Klippt Count =
min (Tell i MT, Max Count i Ref)
bildet2

1

1
bilde av1

0

0
bilde av1

0

0
av meg1

1

1

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

Trigram modifisert presisjon

Til n = 3 , beregner vi Trigram modifisert presisjon:

TrigramTell i MT

Maks antall i Ref

int parseint
Klippt Count =
min (Tell i MT, Max Count i Ref)
bildet1

0

0
bilde bildet1

0

0
bildet av1

0

0
bilde av meg1

0

0

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

4 gram modifisert presisjon

Til n = 4 , beregner vi 4 gram modifisert presisjon:

4 gramTelle

Maks antall i Ref

Klippt Count =
min (Tell i MT, Max Count i Ref)
bildet bildet1

0

0
bilde bildet av1

0

0
bildet av meg1

0

alfabet med tall
0

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

Computing Brevity Penalty

Nå har vi beregnet alle presisjonspoeng, la oss finne Brevity Penalty for oversettelsen:

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

  • Machine Translation Output Length = 6 (maskinoversatt tekst: bildet bildet av meg)
  • Maks referanseutgangslengde = 6 (Referansetekst-2: bildet ble klikket av meg)

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

Beregning av BLEU-poengsum

Til slutt er BLEU-poengsummen for oversettelsen ovenfor gitt av:

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

Ved å erstatte verdiene 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 slutt har vi beregnet BLEU-poengsummen for den gitte oversettelsen.

BLEU Score Implementering i Python

Etter å ha beregnet BLEU-poengsummen manuelt, er man nå vant til den matematiske bearbeidingen av BLEU-poengsummen. Imidlertid Python's NLTK gir en innebygd modul for beregning av BLEU-poengsum. La oss beregne BLEU-poengsummen for det samme oversettelseseksemplet som ovenfor, men denne gangen ved å bruke 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.>