Blog
Cómo evaluar el texto generado con la puntuación BLEU
- Publicado por: Rafael Fernandez
- Categoría: Uncategorized
BLEU, o el suplente bilingüe de evaluación, es una puntuación para comparar una traducción de texto de un candidato con una o más traducciones de referencia. Aunque ha sido desarrollado para la traducción, puede utilizarse para evaluar el texto generado para una serie de tareas de procesamiento en lenguaje natural. En este tutorial, tú descubrirás la puntuación BLEU para evaluar y calificar el texto del candidato usando la biblioteca NLTK en Python. Después de completar este tutorial, tú sabrás:
- Tendrás una breve introducción a la puntuación BLEU y una intuición de lo que se está calculando.
- Sabrás cómo calcular las puntuaciones BLEU en Python utilizando la biblioteca NLTK para frases y documentos.
- Sabrás cómo puedes utilizar un conjunto de pequeños ejemplos para desarrollar una intuición de cómo las diferencias entre un candidato y un texto de referencia influyen en la puntuación final del BLEU.
Vamos a empezar.
Descripción general del tutorial
Este tutorial se divide en las siguientes partes:
- Puntaje del suplente de la evaluación bilingüe
- Calcular las puntuaciones BLEU
- Puntuaciones BLEU acumuladas e individuales
- Ejemplos Trabajados
Puntaje del suplente de la evaluación bilingüe
El puntaje del suplente de la evaluación bilingüe, o BLEU para abreviar, es una métrica para evaluar una oración generada a una oración de referencia. Una coincidencia perfecta da como resultado una puntuación de 1,0, mientras que una coincidencia perfecta da como resultado una puntuación de 0,0. El puntaje fue desarrollado para evaluar las predicciones hechas por los sistemas de traducción automática. No es perfecto, pero ofrece cinco beneficios convincentes:
- Es rápido y barato de calcular.
- Es fácil de entender.
- Es independiente del idioma.
- Se correlaciona altamente con la evaluación humana.
- Ha sido ampliamente adoptado.
La puntuación BLEU fue propuesta por Kishore Papineni, en su artículo de 2002 BLEU: a Method for Automatic Evaluation of Machine Translation (BLEU: un método para la evaluación automática de la traducción automática). El enfoque funciona contando los n-gramas coincidentes en la traducción del candidato a n-gramas en el texto de referencia, donde 1-gram o unigrama sería cada token y una comparación bigram sería cada par de palabras. La comparación se realiza independientemente del orden de las palabras.
Se modifica el recuento de n-gramas coincidentes para garantizar que tiene en cuenta la aparición de las palabras en el texto de referencia, sin recompensar a una traducción candidata que genere una abundancia de palabras razonables. Esto se conoce en el documento como precisión modificada de n-gram.
El puntaje es para comparar oraciones, pero también se propone una versión modificada que normaliza los n-gramas por su ocurrencia para puntuar mejor los bloques de oraciones múltiples.
Una partitura perfecta no es posible en la práctica, ya que una traducción tendría que coincidir exactamente con la referencia. Esto ni siquiera es posible para los traductores humanos. El número y la calidad de las referencias utilizadas para calcular la puntuación BLEU significa que la comparación de las puntuaciones entre conjuntos de datos puede resultar problemática.
Además de la traducción, podemos utilizar la puntuación BLEU para otros problemas de generación de lenguaje con métodos de aprendizaje profundo, como por ejemplo:
- Generación de idiomas.
- Generación de pies de foto.
- Integración de textos.
- Reconocimiento de voz.
- Y mucho más…
Calcular las puntuaciones BLEU
La biblioteca Python Natural Language Toolkit, o NLTK, proporciona una implementación de la puntuación BLEU que puedes utilizar para evaluar el texto generado en relación con una referencia.
Función sentence_bleu()
NLTK proporciona la función sentence_bleu() para evaluar una frase candidata contra una o más frases de referencia. Las oraciones de referencia deben ser proporcionadas como una lista de oraciones donde cada referencia es una lista de tokens. La frase candidata se proporciona como una lista de tokens.
Por ejemplo:
from nltk.translate.bleu_score import sentence_bleu reference = [['this','is','a','test'], [' this','is''test']] candidate = ['this','is','a','test'] score = sentence_bleu(reference, candidate) print(score)
Al ejecutar este ejemplo se obtiene una puntuación perfecta, ya que el candidato coincide exactamente con una de las referencias.
1.0
Puntuación BLEU de Corpus
NLTK también proporciona una función llamada corpus_bleu() para calcular la puntuación BLEU de varias frases, como un párrafo o un documento. Las referencias deben especificarse como una lista de documentos en la que cada documento es una lista de referencias y cada referencia alternativa es una lista de tokens, por ejemplo, una lista de listas de listas de tokens. Los documentos candidatos deben especificarse como una lista en la que cada documento es una lista de tokens, por ejemplo, una lista de listas de tokens. Esto es un poco confuso; aquí hay un ejemplo de dos referencias para un documento.
# dos referencias para un documento from nltk.translate.bleu_score import corpus_bleu references = [[['this','is','a','test'], ['this','is''test']]] candidates = [['this','is','a','test']] score = corpus_bleu(references, candidates) print(score)
Al ejecutar el ejemplo se obtiene una puntuación perfecta como antes.
1.0
Puntuaciones BLEU acumuladas e individuales
Los cálculos de la puntuación BLEU en NLTK permiten especificar la ponderación de n-gramas diferentes en el cálculo de la puntuación BLEU. Esto le da la flexibilidad para calcular diferentes tipos de puntuación BLEU, como las puntuaciones individuales y acumulativas de n-gramas. Echemos un vistazo.
Puntuaciones individuales de n-gramo
Una puntuación individual de n-gram es la evaluación de sólo grams coincidentes de un orden específico, como palabras individuales (1-gram) o pares de palabras (2-gram o bigram). Las ponderaciones se especifican como una tupla donde cada índice se refiere al orden de grams. Para calcular la puntuación BLEU sólo para coincidencias de 1 gram, puedes especificar un peso de 1 para 1 gram y 0 para 2, 3 y 4 (1, 0, 0, 0). Por ejemplo:
#1 gram de BLEU individual from nltk.translate.bleu_score import sentence_bleu reference = [['this','is','small','test']] candidate = ['this','is','a','test'] score = sentence_bleu(reference, candidate, weights=(1, 0, 0, 0)) print(score)
Al ejecutar este ejemplo se obtiene una puntuación de 0,5.
0.75
Podemos repetir este ejemplo para n-gramas individuales de 1 a 4 de la siguiente manera:
# n-gram individual BLEU from nltk.translate.bleu_score import sentence_bleu reference = [['this','is','a','test']] candidate = ['this','is','a','test'] print('Individual 1-gram: %f'% sentence_bleu(reference, candidate, weights=(1, 0, 0, 0))) print('Individual 2-gram: %f'% sentence_bleu(reference, candidate, weights=(0, 1, 0, 0))) print('Individual 3-gram: %f'% sentence_bleu(reference, candidate, weights=(0, 0, 1, 0))) print('Individual 4-gram: %f'% sentence_bleu(reference, candidate, weights=(0, 0, 0, 1)))
Al ejecutar el ejemplo se obtienen los siguientes resultados.
Individual 1-gram: 1.000000 Individual 2-gram: 1.000000 Individual 3-gram: 1.000000 Individual 4-gram: 1.000000
Aunque podemos calcular las puntuaciones individuales del BLEU, no es así como el método fue pensado para ser usado y las puntuaciones no tienen mucho significado, o parecen ser interpretables.
Ejemplos Trabajados
En esta sección, tratamos de desarrollar más intuición para la puntuación BLEU con algunos ejemplos. Trabajamos a nivel de oración con una sola oración de referencia de las siguientes:
the quick brown fox jumped over the lazy dog
Primero, veamos una puntuación perfecta.
# partido perfecto from nltk.translate.bleu_score import sentence_bleu reference = [['the','quick','brown','fox','jumped','over','the','lazy','dog']] candidate = ['the','quick','brown','fox','jumped','over','the','lazy','dog'] score = sentence_bleu(reference, candidate) print(score)
Si se ejecuta el ejemplo se obtiene una coincidencia perfecta.
1.0
A continuación, cambiemos una palabra, de ‘quick’ a ‘fast’.
# Una palabra diferente from nltk.translate.bleu_score import sentence_bleu reference = [['the','quick','brown','fox','jumped','over','the','lazy','dog']] candidate = ['the','fast','brown','fox','jumped','over','the','lazy','dog'] score = sentence_bleu(reference, candidate) print(score)
Este resultado es un ligero descenso en la puntuación.
0.7506238537503395
¿Qué tal si hacemos que el candidato sea dos palabras más largas que la referencia?
# muy corto from nltk.translate.bleu_score import sentence_bleu reference = [['the','quick','brown','fox','jumped','over','the','lazy','dog']] candidate = ['the','quick'] score = sentence_bleu(reference, candidate) print(score)
Al ejecutar este ejemplo, primero se imprime un mensaje de advertencia que indica que no se puede realizar la parte de la evaluación de 3 grams o más (hasta 4 grams). Esto es justo dado que sólo tenemos 2 grams para trabajar con el candidato.
UserWarning: Corpus/Sentence contains 0 counts of 3-gram overlaps. BLEU scores might be undesirable; use SmoothingFunction(). warnings.warn(_msg)
A continuación, podemos obtener una puntuación muy baja.
0.0301973834223185
Te animo a que sigas jugando con los ejemplos. La matemática es bastante simple y también te animaría a leer el documento y explorar el cálculo de la puntuación a nivel de oración en una hoja de cálculo.
➡ Continúa aprendiendo con nuestro curso de Procesamiento de Lenguaje Natural: