Cyan's Blog

Search

Search IconIcon to open search

D2L-62-BLEU (Bilingual Evaluation Understudy)

Last updated Apr 20, 2022 Edit Source

# BLEU (Bilingual Evaluation Understudy)

2022-04-20

Tags: #BLEU #DeepLearning

# 定义

$$ \exp\left(\min\left(0, 1 - \frac{\mathrm{len}{\text{label}}}{\mathrm{len}{\text{pred}}}\right)\right) \prod_{n=1}^k p_n^{1/2^n}$$

其中:

另外,用 $p_n$ 表示 $n$ 元语法的精确度,它是两个数量的比值: $$p_n=\frac{\operatorname{Num}^{(n)}{match}}{\operatorname{Num}^{(n)}{total}}$$

举个例子,给定标签序列 $A$、$B$、$C$、$D$、$E$、$F$ 和 预测序列 $A$、$B$、$B$、$C$、$D$, 我们有 $p_1 = 4/5$、$p_2 = 3/4$、$p_3 = 1/3$ 和 $p_4 = 0$。

# 解释

# 上限: 完美情况

当两个序列完全相同的时候, BLEU=1.

# 系数: 惩罚短的预测

$$\exp\left(\min\left(0, 1 - \frac{\mathrm{len}{\text{label}}}{\mathrm{len}{\text{pred}}}\right)\right)$$

# 底数: 也在惩罚短的预测

# 代码实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
def bleu(pred_seq, label_seq, k):  #@save
    """计算BLEU"""
    pred_tokens, label_tokens = pred_seq.split(' '), label_seq.split(' ')
    len_pred, len_label = len(pred_tokens), len(label_tokens)
    score = math.exp(min(0, 1 - len_label / len_pred))
    for n in range(1, k + 1):
        num_matches, label_subs = 0, collections.defaultdict(int)
        for i in range(len_label - n + 1):
            label_subs[' '.join(label_tokens[i: i + n])] += 1
        for i in range(len_pred - n + 1):
            if label_subs[' '.join(pred_tokens[i: i + n])] > 0:
                num_matches += 1
                label_subs[' '.join(pred_tokens[i: i + n])] -= 1
        score *= math.pow(num_matches / (len_pred - n + 1), math.pow(0.5, n))
    return score

  1. 计算器套件 - GeoGebra ↩︎