logo

NLP – BLEU-score voor het evalueren van neurale machinevertaling – Python

Neurale machinevertaling (NMT) is een standaardtaak bij NLP waarbij een tekst van een brontaal naar een doeltaal wordt vertaald. BLEU (Tweetalige Evaluatie Understudy) is een score die wordt gebruikt om de vertalingen van een machinevertaler te evalueren. In dit artikel zullen we de wiskunde achter de BLEU-score en de implementatie ervan in Python zien.

Inhoudsopgave



Wat is BLEU-score?

Zoals hierboven vermeld is BLEU Score een evaluatiestatistiek voor machinevertalingstaken. Het wordt berekend door het vergelijken van de n-gram van machinaal vertaalde zinnen tot n-gram door mensen vertaalde zinnen. Meestal wordt waargenomen dat de BLEU-score afneemt naarmate de zinsduur toeneemt. Dit kan echter variëren, afhankelijk van het model dat voor de vertaling wordt gebruikt. Het volgende is een grafiek die de variatie van de BLEU-score weergeeft met de zinlengte.

Wiskundige uitdrukking voor BLEU-score

Wiskundig gezien wordt de BLEU-score als volgt gegeven:

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



Java-structuur

Hier,

  • BP betekent Kortheidsstraf
  • w_i is het gewicht voor n-gram precisie van orde i (doorgaans zijn de gewichten gelijk voor alle i)
  • p_iis de n-gram gemodificeerde precisiescore van orde i.
  • N is de maximale n-gramvolgorde die in aanmerking moet worden genomen (meestal maximaal 4)

Gewijzigde n-gramprecisie (p_i)

De gewijzigde precisiep_iwordt inderdaad berekend als de verhouding tussen het aantal N -grammen in de kandidaatvertaling die exact overeenkomen N -grammen in een van de referentievertalingen, afgekapt door het aantal N -grammen in de kandidaatvertaling.

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



Hier,

  • Count Clips is een functie die het aantal overeenkomende n-grammen clipt (matches_i)door het maximale aantal n-grammen voor alle referentievertalingen ( ext{max-ref-count}_i.
  • matches_iis het aantal n-grammen van orde i dat overeenkomt precies tussen de kandidaatvertaling en een van de referentievertalingen.
  • ext{max-ref-count}_iis het maximale aantal keren dat de specifieke n-gram van de orde voorkomt die ik heb gevonden in een enkele referentievertaling.
  • ext{candidate-n-grams}_iis het totale aantal n-grammen van bestelling i aanwezig in de kandidaatvertaling.

Kortheidsstraf (BP)

Kortheidsstraf bestraft vertalingen die korter zijn dan de referentievertalingen. De wiskundige uitdrukking voor Kortheidsstraf wordt als volgt gegeven:

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

Hier,

  • r is de lengte van de kandidaatvertaling
  • c is de gemiddelde lengte van de referentievertalingen.

Hoe de BLEU-score berekenen?

Laten we een voorbeeld nemen voor een beter begrip van de berekening van de BLEU-score. Hieronder volgt een voorbeeld van een vertaling van het Frans naar het Engels:

  • Brontekst (Frans) : deze afbeelding is door mij aangeklikt
  • Machine vertaalde tekst : de foto de foto van mij
  • Referentietekst-1 : deze foto is door mij aangeklikt
  • Referentietekst-2 : de foto is door mij aangeklikt

We kunnen duidelijk zien dat de door de machine gemaakte vertaling niet nauwkeurig is. Laten we de BLEU-score voor de vertaling berekenen.

Unigram-gemodificeerde precisie

Voor n = 1, wij berekenen de Unigram-gemodificeerde precisie:

Java-datum naar tekenreeks
UnigramTel in machinevertaling

Max. aantal in ref

Geknipt aantal =
min (aantal in MT, maximum aantal in ref)
de2

1

1
afbeelding2

1

1
door1

1

1
mij1

1

1

Hier zijn de unigrammen (de foto, door mij) overgenomen uit de machinaal vertaalde tekst. Count verwijst naar de frequentie van n-grammen in alle machinaal vertaalde tekst, en Clipped Count verwijst naar de frequentie van unigrammen in de referentieteksten gezamenlijk.

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-gemodificeerde precisie

Voor n = 2 , berekenen we de Bigram-gemodificeerde precisie :

BigramenTel in MT

Max. aantal in ref

Geknipt aantal =
min (aantal in MT, maximum aantal in ref)
De foto2

1

1
beeld de1

0

0
foto door1

0

0
door mij1

1

100 km/u naar mph
1

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

Trigram-gemodificeerde precisie

Voor n = 3 , berekenen we de Trigram-gemodificeerde precisie:

TrigramTel in MT

Max. aantal in ref

Geknipt aantal =
min (aantal in MT, maximum aantal in ref)
de foto de1

0

0
stel je de foto voor1

0

0
de foto door1

0

0
foto van mij1

0

0

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

Gemodificeerde precisie van 4 gram

Voor n=4 , berekenen we de Gemodificeerde precisie van 4 gram:

4 gramGraaf

Max. aantal in ref

Geknipt aantal =
min (aantal in MT, maximum aantal in ref)
de foto de foto1

0

0
Stel je de foto voor1

0

0
de foto van mij1

0

0

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

Kortheidsstraf voor computergebruik

Nu we alle precisiescores hebben berekend, gaan we de Brevity Penalty voor de vertaling vinden:

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

  • Uitvoerlengte van machinevertaling = 6 (Machine vertaalde tekst: de foto, de foto van mij)
  • Maximale referentie-uitvoerlengte = 6 (Referentietekst-2: ik heb op de foto geklikt)

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

BLEU-score berekenen

Ten slotte wordt de BLEU-score voor de bovenstaande vertaling gegeven door:

Java-interviewvragen

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

Als we de waarden vervangen, krijgen we:

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

Ten slotte hebben we de BLEU-score voor de gegeven vertaling berekend.

BLEU-score-implementatie in Python

Door de BLEU-score handmatig te berekenen, bent u inmiddels gewend aan de wiskundige werking van de BLEU-score. Echter, Python's NLTK biedt een ingebouwde module voor BLEU-scoreberekening. Laten we de BLEU-score berekenen voor hetzelfde vertaalvoorbeeld als hierboven, maar deze keer met behulp van NLTK.

Code:

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.>