web-dev-qa-db-fra.com

Calculer le score BLEU en Python

Il existe une phrase test et une phrase de référence. Comment puis-je écrire un script Python qui mesure la similarité entre ces deux phrases sous la forme de métrique BLEU utilisée dans l'évaluation de la traduction automatique?

8
Alapan Kuila

Vous demandez en fait deux choses différentes . Je vais essayer de faire la lumière sur chacune des questions.

Partie I: Calcul du score BLEU

Vous pouvez calculer le score BLEU en utilisant le module BLEU sous nltk. Voir ici .

À partir de là, vous pouvez facilement calculer le score d'alignement entre le candidat et les phrases de référence.

Partie II: Calcul de la similarité

Je ne suggérerais pas d'utiliser le score BLEU comme mesure de similarité entre le premier candidat et le second candidat si vous souhaitez mesurer la similarité sur la base de la phrase de référence. 

Maintenant, laissez-moi élaborer ceci. Si vous calculez un score BLEU pour un candidat par rapport à une référence , ce score vous aidera simplement à comprendre la similarité entre le score BLEU d'un autre candidat et la phrase de référence, même si la phrase de référence reste la même.

Si vous souhaitez mesurer la similarité entre deux phrases, Word2vec serait une meilleure méthode. Vous pouvez calculer la distance en cosinus angulaire entre les deux vecteurs de phrase pour comprendre leur similarité.

Pour une compréhension approfondie de ce queBLEUmétrique fait, je suggérerais de lire this ainsi que this pour Word2vec similarité.

9
Semih Yagcioglu

Le score BLEU se compose de deux parties: précision modifiée et pénalité de brièveté. Les détails sont visibles dans le papier . Vous pouvez utiliser le module nltk.align.bleu_score dans le NLTK. Un exemple de code peut être vu comme ci-dessous:

import nltk

hypothesis = ['It', 'is', 'a', 'cat', 'at', 'room']
reference = ['It', 'is', 'a', 'cat', 'inside', 'the', 'room']
#there may be several references
BLEUscore = nltk.translate.bleu_score.sentence_bleu([reference], hypothesis)
print BLEUscore

Notez que le score BLEU par défaut utilise n = 4, ce qui inclut les unigrammes à 4 grammes. Si votre phrase est inférieure à 4, vous devez réinitialiser la valeur N. Sinon, une erreur ZeroDivisionError: Fraction(0, 0) sera renvoyée. Vous devez donc réinitialiser le poids comme suit:

import nltk

hypothesis = ["open", "the", "file"]
reference = ["open", "file"]
#the maximum is bigram, so assign the weight into 2 half.
BLEUscore = nltk.translate.bleu_score.sentence_bleu([reference], hypothesis, weights = (0.5, 0.5))
print BLEUscore
9
ccy

Voici le code permettant de calculer le score Bleu entre deux fichiers.

from nltk.translate.bleu_score import sentence_bleu
import argparse

def argparser():
    Argparser = argparse.ArgumentParser()
    Argparser.add_argument('--reference', type=str, default='summaries.txt', help='Reference File')
    Argparser.add_argument('--candidate', type=str, default='candidates.txt', help='Candidate file')

    args = Argparser.parse_args()
    return args

args = argparser()

reference = open(args.reference, 'r').readlines()
candidate = open(args.candidate, 'r').readlines()

if len(reference) != len(candidate):
    raise ValueError('The number of sentences in both files do not match.')

score = 0.

for i in range(len(reference)):
    score += sentence_bleu([reference[i].strip().split()], candidate[i].strip().split())

score /= len(reference)
print("The bleu score is: "+str(score))

Utilisez la commande python file_name.py --reference file1.txt --candidate file2.txt

3
Ameet Deshpande

Vous voudrez peut-être utiliser le paquet python SacréBLEU (Python 3 uniquement):

SacréBLEU fournit un calcul sans tracas de scores BLEU partageables, comparables et reproductibles. Inspiré du multi-bleu-detok.Perl de Rico Sennrich, il produit les scores officiels WMT mais fonctionne avec du texte brut. Il connaît également tous les standards ensembles de test et gère le téléchargement, le traitement et la création de jetons pour vous.

Pourquoi utiliser cette version de BLEU?

  • Il télécharge automatiquement les ensembles de test WMT courants et les traite en texte brut
  • Il produit une chaîne de version courte qui facilite les comparaisons entre papiers.
  • Il calcule correctement les scores sur les sorties chiffrées, à l’aide de la tokénisation standard WMT ( Conférence sur traduction automatique )
  • Il produit les mêmes valeurs que le script officiel (mteval-v13a.pl) utilisé par WMT.
  • Il génère le score BLEU sans la virgule, vous n'avez donc pas à le supprimer avec sed (vous regarde, multi-bleu.Perl)

Pour installer: pip install sacrebleu

1

Je peux montrer quelques exemples de calcul de score BLEU si les phrases de test et de référence sont connues.

Vous pouvez même prendre les deux phrases en entrée sous forme de chaîne et les convertir en listes.

from nltk.translate.bleu_score import sentence_bleu
reference = [['the', 'cat',"is","sitting","on","the","mat"]]
test = ["on",'the',"mat","is","a","cat"]
score = sentence_bleu(  reference, test)
print(score)


from nltk.translate.bleu_score import sentence_bleu
reference = [['the', 'cat',"is","sitting","on","the","mat"]]
test = ["there",'is',"cat","sitting","cat"]
score = sentence_bleu(  reference, test)
print(score)
0
Aryan Singh