当简洁惩罚中的输出长度为零时会发生什么?

人工智能 自然语言处理 机器翻译
2021-10-26 11:40:38

简洁惩罚定义为

bp=e(1r/c),

在哪里r是参考长度和c是输出长度。

但是如果输出长度变为零会发生什么?有没有标准的方法来处理这个问题?

1个回答

除以零在数学没有定义。

处理此问题的通常或标准方法是引发异常。例如,在 Python 中,如果碰巧被零除,则会在运行时ZeroDivisionError引发异常。

如果执行以下程序

zero = 0
numerator = 10
numerator / zero

你会得到

Traceback (most recent call last):
  File "main.py", line 3, in <module>
    numerator / zero
ZeroDivisionError: division by zero

但是,如果您想避免此运行时异常,您可以检查除以零并以适合您的程序的方式处理此问题(无需终止它)。

在论文BLEU: a Method for Automatic Evaluation of Machine Translation中引入了 BLEU(和简洁惩罚)度量,作者将简洁惩罚定义为

(1)BP={1,if c>re(1r/c)if cr

该定义没有明确考虑除以零。

Python 包nltk不会引发异常,但它(显然是任意地)在c == 0. 请注意,BLEU 指标的范围是从 0 到 1。例如,如果您执行以下程序

from nltk.translate.bleu_score import brevity_penalty, closest_ref_length

reference1 = list("hello") # A human reference translation. 
references = [reference1] # You could have more than one human reference translation.

# references = [] Without a reference, you will get a ValueError.

candidate = list() # The machine translation.
c = len(candidate)

r =  closest_ref_length(references, c)
print("brevity_penalty =", brevity_penalty(r, c))

你会得到

brevity_penalty = 0

在上面的示例中,唯一的人工参考(翻译)是reference1 = list("hello"),唯一的候选(机器翻译)是一个空列表。但是,如果references = [](您没有参考资料),那么您将收到错误ValueError: min() arg is an empty sequence,其中references用于查找与 candidate(机器翻译)最接近的参考资料(最接近的人工翻译),因为可能有多个人工参考资料翻译,并且需要选择一个来计算针对您给定候选人的简洁惩罚。

其实在函数的文档中brevity_penalty,写了如下注释

# If hypothesis is empty, brevity penalty = 0 should result in BLEU = 0.0.

其中hypothesis是候选者(机器翻译)的同义词,候选者的长度是c在公式1c在上面的例子中)。

为了更直接地回答您的第二个问题,我认为没有处理该问题的标准方法,但我还没有完全阅读 BLEU 论文。