自定义实现BLEU分数与NLTK结果不一致及取值范围问题咨询
Q1 实现代码的错误排查
你自定义实现的BLEU计算逻辑存在以下几处核心错误,导致和NLTK官方实现结果不一致:
- 简洁惩罚(BP)计算逻辑写反
标准BP规则是:当预测序列长度c>= 参考序列长度r时,BP=1;当c<r时,BP = exp(1 - r/c)。你的代码中将判断条件写成了len(reference) < len(output)时BP=1,刚好把判断逻辑搞反。 - n-gram截断计数逻辑错误
标准的截断计数要求是:统计预测序列中每个n-gram的出现次数,取该次数和参考序列中对应n-gram出现次数的最小值作为有效计数,不是用集合对n-gram去重后只要出现过就计数1次,重复出现的有效n-gram也需要计入总数。 - n-gram精度的求和逻辑错误
标准公式中是对每个n-gram精度取对数后再加权求和,不是直接对精度本身求和,你代码中直接对clip/count的结果求和,属于公式理解错误。 - n-gram的阶数范围错误
NLTK默认计算BLEU时取1~4阶n-gram,你的代码中循环范围是range(1, len(pred)),会根据预测句子长度计算远高于4阶的n-gram,和默认实现的统计范围不一致。 - 参考序列匹配逻辑错误
你调用Bleu函数时传入的ref是未分词的字符串,做final in ref判断时是字符串子串匹配,不是分词后的n-gram匹配,会出现很多误判的匹配结果。
Q2 BLEU分数取值范围的疑问
你对BLEU计算公式的理解存在疏漏,正确的公式为:
BLEU = BP * exp( sum( w_n * ln(p_n) ) )
其中p_n是第n阶n-gram的精度,取值范围为[0,1],因此ln(p_n)的取值范围是(-∞, 0],求和后得到的指数部分一定小于等于0,exp(x)当x≤0时取值范围为(0, 1],再乘以取值范围为(0,1]的BP,最终BLEU分数的取值范围自然在0到1之间。
你之前的理解漏掉了对p_n取对数的步骤,才会误以为指数部分为正、结果会大于1。
内容的提问来源于stack exchange,提问作者devanshu singh
相关产品推荐
相关产品推荐

