TF.Text Metrics

Ver no TensorFlow.org Executar no Google Colab Ver no GitHub Baixar caderno

Visão geral

O TensorFlow Text fornece uma coleção de classes e operações relacionadas a métricas de texto prontas para uso com o TensorFlow 2.0. A biblioteca contém implementações de métricas de similaridade de texto, como ROUGE-L, necessárias para avaliação automática de modelos de geração de texto.

A vantagem de usar esses ops na avaliação de seus modelos é que eles são compatíveis com a avaliação de TPU e funcionam bem com APIs de métricas de streaming TF.

Configurar

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

ROUGE-L

A métrica Rouge-L é uma pontuação de 0 a 1 indicando o quão semelhantes duas sequências são, com base no comprimento da subsequência comum mais longa (LCS). Em particular, Rouge-L é a média harmônica ponderada (ou medida f) combinando a precisão do LCS (a porcentagem da sequência de hipóteses coberta pelo LCS) e a recuperação do LCS (a porcentagem da sequência de referência coberta pelo LCS).

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

A implementação TF.Text retorna a medida F, a Precisão e a Recuperação para cada par (hipótese, referência).

Considere o seguinte par de hipótese / referência:

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

As hipóteses e referências devem ser tf.RaggedTensors de tokens. Os tokens são necessários em vez de frases brutas porque nenhuma estratégia de tokenização serve para todas as tarefas.

Agora podemos chamar text.metrics.rouge_l e obter nosso resultado de volta:

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 tem um hiperparâmetro adicional, alfa, que determina o peso da média harmônica usada para calcular o F-Measure. Os valores próximos a 0 tratam o recall como mais importante e os valores próximos a 1 tratam a precisão como mais importante. O padrão de alfa é 0,5, que corresponde ao peso igual para Precisão e Recuperação.

# 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)