TF.Text Metrics

Ver en TensorFlow.org Ejecutar en Google Colab Ver en GitHub Descargar cuaderno

Descripción general

TensorFlow Text proporciona una colección de clases y operaciones relacionadas con métricas de texto listas para usar con TensorFlow 2.0. La biblioteca contiene implementaciones de métricas de similitud de texto como ROUGE-L, necesarias para la evaluación automática de modelos de generación de texto.

El beneficio de usar estas operaciones para evaluar sus modelos es que son compatibles con la evaluación de TPU y funcionan bien con las API de métricas de transmisión TF.

Configuración

pip install -q tensorflow-text
import tensorflow as tf
import tensorflow_text as text

ROUGE-L

La métrica de Rouge-L es una puntuación de 0 a 1 que indica qué tan similares son dos secuencias, según la longitud de la subsecuencia común más larga (LCS). En particular, Rouge-L es la media armónica ponderada (o medida f) que combina la precisión de LCS (el porcentaje de la secuencia de hipótesis cubierta por la LCS) y la recuperación de LCS (el porcentaje de la secuencia de referencia cubierta por la LCS).

Fuente: https://www.microsoft.com/en-us/research/publication/rouge-a-package-for-automatic-evaluation-of-summaries/

La implementación de TF.Text devuelve la medida F, la precisión y la recuperación para cada par (hipótesis, referencia).

Considere el siguiente par de hipótesis / referencia:

hypotheses = tf.ragged.constant([['captain', 'of', 'the', 'delta', 'flight'],
                                 ['the', '1990', 'transcript']])
references = tf.ragged.constant([['delta', 'air', 'lines', 'flight'],
                                 ['this', 'concludes', 'the', 'transcript']])

Se espera que las hipótesis y referencias sean tf.RaggedTensors de tokens. Se requieren tokens en lugar de oraciones sin formato porque no hay una única estrategia de tokenización que se adapte a todas las tareas.

Ahora podemos llamar a text.metrics.rouge_l y recuperar nuestro resultado:

result = text.metrics.rouge_l(hypotheses, references)
print('F-Measure: %s' % result.f_measure)
print('P-Measure: %s' % result.p_measure)
print('R-Measure: %s' % result.r_measure)
F-Measure: tf.Tensor([0.44444448 0.57142854], shape=(2,), dtype=float32)
P-Measure: tf.Tensor([0.4       0.6666667], shape=(2,), dtype=float32)
R-Measure: tf.Tensor([0.5 0.5], shape=(2,), dtype=float32)

ROUGE-L tiene un hiperparámetro adicional, alfa, que determina el peso de la media armónica utilizada para calcular la F-Measure. Los valores más cercanos a 0 tratan la recuperación como más importante y los valores más cercanos a 1 tratan la precisión como más importante. alfa tiene un valor predeterminado de .5, que corresponde a la misma ponderación para Precisión y Recuperación.

# Compute ROUGE-L with alpha=0
result = text.metrics.rouge_l(hypotheses, references, alpha=0)
print('F-Measure (alpha=0): %s' % result.f_measure)
print('P-Measure (alpha=0): %s' % result.p_measure)
print('R-Measure (alpha=0): %s' % result.r_measure)
F-Measure (alpha=0): tf.Tensor([0.5 0.5], shape=(2,), dtype=float32)
P-Measure (alpha=0): tf.Tensor([0.4       0.6666667], shape=(2,), dtype=float32)
R-Measure (alpha=0): tf.Tensor([0.5 0.5], shape=(2,), dtype=float32)
# Compute ROUGE-L with alpha=1
result = text.metrics.rouge_l(hypotheses, references, alpha=1)
print('F-Measure (alpha=1): %s' % result.f_measure)
print('P-Measure (alpha=1): %s' % result.p_measure)
print('R-Measure (alpha=1): %s' % result.r_measure)
F-Measure (alpha=1): tf.Tensor([0.4       0.6666667], shape=(2,), dtype=float32)
P-Measure (alpha=1): tf.Tensor([0.4       0.6666667], shape=(2,), dtype=float32)
R-Measure (alpha=1): tf.Tensor([0.5 0.5], shape=(2,), dtype=float32)