最近学习Seq2Seq内容,碰到模型评价指标计算,编写一下BLEU加深印象,指标介绍参见
详解机器翻译任务中的BLEU_Iareges的博客-CSDN博客
使用DP优化计算两个序列相同n元语法的部分
def max_common_seq(s1, s2, m, n, k):
# 求出s1, s2, 的k元语法下最多匹配词组数
m = m - k + 1
n = n - k + 1
dp = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(m):
for j in range(n):
if s1[i:i+k] == s2[j:j+k]:
dp[i+1][j+1] = dp[i][j] + 1
else:
dp[i+1][j+1] = max(dp[i][j+1], dp[i+1][j])
return dp[-1][-1]
def BLEU(label, pred, k):
# 计算label 与 pred 在最大k元语法下的BLEU
assert k > 0
assert len(pred) >= k
m = len(label)
n = len(pred)
score = exp(min(0, 1 - m/n))
for p in range(1, k+1):
score *= (max_common_seq(label, pred, m, n, p) / (n - p + 1)) ** (1 / (2 ** p))
return score