23 条词典、8 个虚词、4 条量词规则,6 句英文。逐词直译的平均 BLEU-1 是 0.731; 加上合并、补量词、时间短语前置三步调序后升到 0.820。没修好的是时态和量词补全。
上一节处理声音,这一节处理跨语言。 翻译看着离日常最远,其实它的骨架和上一章的方言翻译一模一样:词对齐加语序调整。
一、翻译的两个动作:对齐和调序
对齐决定哪个词对应哪个词。词典法靠查表,神经翻译靠注意力机制学出来。 调序决定中文的词按什么顺序排。 英文「a new book」是冠词加形容词加名词,中文是「一本新书」——量词要补,冠词要丢。 Demo 的直译版只做对齐,不做调序。所以「我喜欢这书」少了量词,「我去学校昨天」把时间放到了句尾。 调序版加了三步:合并「每 + 天/早上」、指示词后补量词、时间短语挪到主语后面。
二、三步调序各值多少分
逐句看 BLEU 就知道哪条规则在起作用: 「i like this book」从 0.82 升到 1.00——补量词那一步。 「that car is very good」从 0.78 升到 1.00——补量词,同时系动词「is」被丢掉。 「you go to school every morning」从 0.75 升到 0.88——时间短语前置。 「i buy an apple every day」两版都是 0.72——时间挪对了,但缺「一个」,所以分数没变。 平均从 0.731 到 0.820,涨 0.089。三条规则换来不到 0.1,说明剩下的差距不是调序能补的。
三、没修好的部分更值得看
「he read a new book」两版都是 0.47:输出「他读新书」,参考是「他读了一本新书」。 少的两个东西一个都没补上:时态(了)和量词(一本)。 时态要靠动词形态判断,英文 read 的过去式还是 read,光看词形根本看不出来。这就是词典法的死穴。 量词要靠名词判断,我给的是 4 条手工表(书→本、苹果→个、车→辆、学校→所)。 真实中文有上百个量词,手工列不完。 所以「0.820」这个数不用高兴。它是在 6 句极短句上刷出来的,句子一长、从句一多,规则法立刻崩。
四、BLEU 这个指标本身的问题
BLEU 只数 n 元组重叠,不看意思。所以它能被「堆词」骗——输出一堆高频词也能拿分。 对语序也不敏感。「我昨天去了学校」和「昨天我去了学校」意思一样,BLEU 会差一截。 那为什么还用?因为它快、稳定、可复现,适合做迭代时的对照。 改进一版跑一次,看分数涨没涨,方向对不对。 定稿一定要人评。自动指标负责筛,人负责判。这个分工在所有生成任务里通用。
五、动手 Demo:玩具翻译器:词对齐加三步调序,用 BLEU-1 量
建 23 条英中词典、8 个要丢掉的虚词、4 条量词对应; 对 6 句英文做两版翻译——一版只逐词替换,一版再加合并、补量词、时间前置三步; 两版都和人工参考译文算字符级 BLEU-1,逐句对比。
toks = [t for t in en.lower().split() if t not in DROP]
out = [DICT.get(t, t) for t in toks]
if out[i] == u'这' and out[i + 1] in MEAS:
res.append(out[i])
res.append(MEAS[out[i + 1]]) # 补量词
out.pop(k); out.insert(1, tw) # 时间短语挪到主语后
实跑输出:
--------------------------------------------------------------------
机器翻译:词对齐 + 语序调整,用 BLEU-1 量一量
--------------------------------------------------------------------
词典 23 条
直接丢掉的虚词 8 个(a、an、the、to、of、is、are、am)
量词表 4 条
英文 直译 调序后 参考译文 直译分 调序分
--------------------------------------------------------------------------------------------------------
i like this book 我喜欢这书 我喜欢这本书 我喜欢这本书 0.82 1.00
he read a new book 他读新书 他读新书 他读了一本新书 0.47 0.47
i buy an apple every day 我买苹果每天 我每天买苹果 我每天买一个苹果 0.72 0.72
you go to school every morning 你去学校每早上 你每天早上去学校 你每天早上都去学校 0.75 0.88
that car is very good 那车很好 那辆车很好 那辆车很好 0.78 1.00
i go to school yesterday 我去学校昨天 我昨天去学校 我昨天去了学校 0.85 0.85
直译平均 BLEU-1 0.731
调序平均 BLEU-1 0.820
调序版只加了三步:合并「每 + 天/早上」、指示词后补量词、时间短语挪到主语后面。三步就把平均分从 0.731 抬到 0.820。
没修好的是时态和量词:「他读了一本新书」还是翻成「他读新书」,因为词典里没有「了」也没有量词补全规则。
还有一点要记住:BLEU 只数 n 元组重叠,不看意思对不对。「我昨天去了学校」和「昨天我去了学校」BLEU 会差一截,人看却是同一句话。
两列分数一对比,能看出哪几句被规则救了:第一句和第五句都从 0.8 左右升到 1.00。 第五句「that car is very good」值得单看:直译是「那车很好」,补了量词变「那辆车很好」, 正好等于参考译文。 第二句两版都是 0.47,是全场最低。它缺的是时态和量词,这两条规则里都没有。 BLEU 用的是字符级而不是词级,因为我这边没有分词器。 字符级 BLEU 对中文还算合理,但对语序更不敏感——这也是它偏高的一部分原因。
30 秒实验
- 把量词表从 4 条加到 10 条,看平均分能涨多少。
- 加一条规则:动词后面的「了」自动补上,看第二句分数会不会涨。
- 想一想:为什么 BLEU 对语序不敏感反而是个问题?
常见误区
- 「翻译就是查词典」——语序、时态、量词,一个都躲不开。
- 「BLEU 高就是翻得好」——它只数重叠,能被堆词骗。
- 「规则法没用」——它便宜、可控,做领域固定文本(说明书、告示)仍然划算。
自测三问(点开对答案)
1. 翻译要做哪两个动作? —— 对齐(哪个词对哪个词)和调序(中文按什么顺序排)。 2. 为什么「他读新书」补不上「了」和「一本」? —— 时态要看动词形态(read 的过去式还是 read),量词要靠名词查表,词典法两头都没有。 3. BLEU 为什么不能单独用来定稿? —— 只数 n 元组重叠,不看意思,对语序也不敏感。翻译之后是同族的另一件事:把长文压成短文,也就是自动摘要。
- ☐ (本节完,下一节 6.2.5 自动摘要:快速理解与提炼文本内容的利器)