如何在多语言翻译场景中实现源句与译句的词级对齐?
多语言词级对齐的最优实现方案
一、优先用成熟工具,别从头造轮子
目前业内最实用的方案是直接用经过验证的对齐工具,比自己从零开发效率高得多,覆盖绝大多数场景:
- FastAlign:基于统计模型的轻量工具,专门做词对齐,支持双向对齐(源→目标、目标→源),能自动处理一对一、一对多、多对一的情况。输出格式就是你需要的“源索引-目标索引”形式,后续只要做简单格式化就能得到
6-[7,8]这种合并后的写法。 - Hunalign:适合小语种或平行语料较少的场景,支持结合双语词典辅助对齐,输出灵活,能应对句子长度差异大的情况。
- Transformer预训练模型:如果追求更高精度(比如处理复杂语序调换、拆分组合的情况,像你例子里的英文
saying the same thing对应德语dasselbe zu sagen),可以用mBART、MarianMT这类翻译模型,通过解析模型的encoder-decoder注意力权重提取对齐关系——Transformer的注意力机制本身就编码了源词和目标词的关联,精度比统计模型更高。
二、快速上手步骤(以FastAlign为例)
- 准备平行语料:把英文、德语句子按行配对,每行格式为
英文句子\t德语句子,比如:i saw the man walking on the street\tich sah den mann auf der straẞe gehen it is a different way of saying the same thing\tes ist eine andere art , dasselbe zu sagen - 运行命令生成对齐:
输出的# 生成源到目标的正向对齐 fast_align -i parallel_corpus.txt -d -o -v > forward.align # 生成目标到源的反向对齐 fast_align -i parallel_corpus.txt -d -o -v -r > reverse.align # 合并双向对齐,得到更准确的最终结果 atools -i forward.align -j reverse.align -c grow-diag-final-and > final.alignfinal.align里会包含类似0-0 1-1 6-7 6-8 7-6的结果,你只需要写个简单脚本,把同一源索引的多个目标索引合并成6-[7,8]的格式就行。
三、处理复杂对齐场景
如果用Transformer模型提取对齐,大致步骤是:
- 用
transformers库加载预训练翻译模型和对应的tokenizer,对源句、目标句做tokenize(注意处理subword拆分的情况)。 - 获取模型最后几层的encoder-decoder注意力权重,取平均值降低噪声。
- 对每个源词,筛选出注意力权重超过阈值的所有目标词;或者对每个目标词,找到权重最高的源词,以此得到一对多/多对一的对齐关系。
- 把subword级的对齐结果合并成单词级——比如tokenizer把
straẞe拆成两个subword,就把这两个subword对应的源词对齐合并到straẞe这个单词上。
另外,不管用哪种工具,都可以加一些后处理规则:比如针对德语动词后置的特点,修正英文动词和德语动词的对齐;或者结合专业词典,强制固定术语的对齐关系,提升准确率。
内容的提问来源于stack exchange,提问作者Lena
相关产品推荐
相关产品推荐

