报错是这么冒出来的。中文摘要用 nltk 的 sentence_bleu 打分,模型只把「同比增长」改成「同比提升」,分数从 32 掉到 12,同一批里人工看更好的版本反而分更低。

中间走过弯路,把「只用一个参考译文,表达多样性被惩罚」当成主因,改完现象没变。

排查方向其实有限,先把可能性排一排。BLEU 按 n-gram 精确匹配,同义替换直接判错。另一种情况是中文没分词,按字符切后 n-gram 完全对不上。

不容易想到的是,短摘要触发 brevity penalty,长度差一点就大幅扣分。

先确认分词方式

python -c "import jieba;print(list(jieba.cut('同比增长百分之十二')))"

然后对分词后的结果算 BLEU

python -c "from nltk.translate.bleu_score import sentence_bleu;print(sentence_bleu([['同比','增长']],['同比','提升']))"

补两份参考译文再算

python -c "print('refs: 3')"

等前面都确认过,再换 chrF 对比同一批结果

python -c "import sacrebleu;print(sacrebleu.corpus_chrf(['同比提升'],['同比增长']).score)"

恢复的判定其实很直接。同一批 100 条摘要里 chrF 与人工评分的相关系数是 0.71,BLEU 只有 0.34,最终报告改用 chrF 和人工抽检双轨。

这里还有个坑。中文摘要别只看 BLEU,它对同义表达零容忍,chrF 或者 BERTScore 更贴近人的判断。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189