【手把手带你学习神经机器翻译--代码篇】

1.数据预处理

1.1 相关工具下载

  1. 下载 fairseq工具箱 (一个基于PyTorch的序列建模工具)
git clone https://github.com/pytorch/fairseq
cd fairseq
pip install --editable ./

2.下载 subword-nmt(BPE)

git clone https://github.com/rsennrich/subword-nmt.git

3.下载 Moses (SMT工具)

git clone https://github.com/moses-smt/mosesdecoder.git

1.2 数据集下载

WMT系列数据集

WMT(Conference on Machine Translation)由SIGMT主办,是一个涉及机器翻译多种任务的综合性会议,包括多领域翻译评测任务、质量评价任务。现在WMT已经成为机器翻译领域的旗舰评测会议,很多研究工作都以WMT评测结果作为基准。WMT涉及的语言范围较广,包括英语、德语、芬兰语、捷克语、罗马尼亚语等十多种语言,翻译方向一般以英语为核心,探索英语与其他语言之间的翻译性能,领域包括新闻、信息技术、生物医学。2017年,WMT与中国机器翻译评测大会CWMT合作,提供了中英机器翻译数据集。在这里插入图片描述
https://www.statmt.org/wmt17/

AI challenger 中英数据集

“AI Challenger全球AI挑战赛”将开放超过1000万条中英文翻译数据、70万个人体动作分析标注数据、30万张图片场景标注和语义描述数据,是国内迄今公开的规模最大的科研数据集。
https://download.csdn.net/download/qq_38361589/85929897?spm=1001.2014.3001.5501

1.3 中文分词处理

  1. 安装jieba分词
 pip install jieba
  1. 分词
python -m jieba -d " " 分词前数据名 > 分词后数据名

3.使用其他分词工具(北京大学 语言计算与机器学习研究组开发)
如:pkuseg 是基于论文Luo et. al, 2019 (点击下载)的工具包。其简单易用,支持细分领域分词,有效提升了分词准确度。

1.4 标点符号标准化

使用Moses工具包中的normalize-punctuation.perl

perl /home/demo/fanyi/mosesdecoder/scripts/tokenizer/normalize-punctuation.perl -l en </home/demo/fanyi/nmt/data/raw.en> /home/demo/fanyi/nmt/data/norm.en

perl /home/demo/fanyi/mosesdecoder/scripts/tokenizer/normalize-punctuation.perl -l zh </home/demo/fanyi/nmt/data/raw.zh> /home/demo/fanyi/nmt/data/norm.zh

1.5 Tokenize

1.将英文单词与标点符号用空格分开
2.将多个连续空格简化为一个空格
3.将很多符号替换成转义字符,如:把"替换成&quot;、把can't替换成can &apos;t

使用Moses工具包中的tokenizer.perl

perl /home/demo/fanyi/mosesdecoder/scripts/tokenizer/tokenizer.perl -l en < /home/demo/fanyi/nmt/data/norm.en > /home/demo/fanyi/nmt/data/norm.tok.en

perl /home/demo/fanyi/mosesdecoder/scripts/tokenizer/tokenizer.perl -l zh < /home/demo/fanyi/nmt/data/norm.seg.zh > /home/demo/fanyi/nmt/data/norm.seg.tok.zh

1.6 BPE

字节对编码(BPE, Byte Pair Encoder),又称 digram coding 双字母组合编码,是一种数据压缩算法,用来在固定大小的词表中实现可变⻓度的子词。该算法简单有效,因而目前它是最流行的方法。(可理解为细粒度分词处理)。
使用subword-nmt的learn_joint_bpe_and_vocab.py和apply_bpe.py

python /home/demo/fanyi/subword-nmt/subword_nmt/learn_joint_bpe_and_vocab.py --input /home/demo/fanyi/nmt/data/norm.tok.true.en  -s 32000 -o /home/demo/fanyi/nmt/data/bpecode.en --write-vocabulary /home/demo/fanyi/nmt/data/voc.en

python /home/demo/fanyi/subword-nmt/subword_nmt/apply_bpe.py -c /home/demo/fanyi/nmt/data/bpecode.en --vocabulary /home/demo/fanyi/nmt/data/voc.en < /home/demo/fanyi/nmt/data/norm.tok.true.en > /home/demo/fanyi/nmt/data/norm.tok.true.bpe.en

python /home/demo/fanyi/subword-nmt/subword_nmt/learn_joint_bpe_and_vocab.py --input /home/demo/fanyi/nmt/data/norm.seg.tok.zh  -s 32000 -o /home/demo/fanyi/nmt/data/bpecode.zh --write-vocabulary /home/demo/fanyi/nmt/data/voc.zh

python /home/demo/fanyi/subword-nmt/subword_nmt/apply_bpe.py -c /home/demo/fanyi/nmt/data/bpecode.zh --vocabulary /home/demo/fanyi/nmt/data/voc.zh < /home/demo/fanyi/nmt/data/norm.seg.tok.zh > /home/demo/fanyi/nmt/data/norm.seg.tok.bpe.zh

1.7 处理空白行

mv /home/demo/fanyi/nmt/data/norm.seg.tok.bpe.zh /home/demo/fanyi/nmt/data/toclean.zh

mv /home/demo/fanyi/nmt/data/norm.tok.true.bpe.en /home/demo/fanyi/nmt/data/toclean.en 

perl /home/demo/fanyi/mosesdecoder/scripts/training/clean-corpus-n.perl /home/demo/fanyi/nmt/data/toclean zh en /home/demo/fanyi/nmt/data/clean 1 512

perl /home/demo/fanyi/mosesdecoder/scripts/training/clean-corpus-n.perl /home/demo/fanyi/nmt/data/clean zh en /home/demo/fanyi/nmt/data/lean 1 512

1.8 生成训练测试验证集

python /home/demo/fanyi/nmt/utils/split.py /home/demo/fanyi/nmt/data/clean.zh /home/demo/fanyi/nmt/data/clean.en /home/demo/fanyi/nmt/data/

1.9 生成词表及二进制文件

fairseq-preprocess --source-lang zh --target-lang en --trainpref /home/demo/fanyi/nmt/data/train --validpref /home/demo/fanyi/nmt/data/valid --testpref /home/demo/fanyi/nmt/data/test --destdir /home/demo/fanyi/nmt/data/

2 训练中英翻译模型

本次使用Transformer模型进行训练,如需使用其他神经网络模型请参照模型篇,在–arch 后更换自定义的模型。
模型详细参数如下:
Transformer模型中编码器和解码器层数选择6层,多头注意力机制的头数为8,模型维度d_model设置为512维,前馈神经网络维度d_ff设置为1024维,dropout概率取0.1,集束搜索宽度beam_width设置为4,标签平滑设置为0.1。模型训练时激活函数使用ReLU,优化器采用Adam[32]。Adam优化器训练过程中会动态调整学习率,首先设置warm_step,在warm_step内,学习率会线性上升,经过warm_step后,学习率会逐渐衰减,Adam优化器相关参数设置如表所示。
在这里插入图片描述

CUDA_VISIBLE_DEVICES=0 fairseq-train /home/demo/fanyi/nmt/data/ --arch transformer --optimizer adam --adam-betas '(0.9, 0.98)' --clip-norm 0.0 --lr 5e-4 --lr-scheduler inverse_sqrt --warmup-updates 4000 --dropout 0.3 --weight-decay 0.0001 --criterion label_smoothed_cross_entropy --label-smoothing 0.1 --max-tokens 4096 --eval-bleu --eval-bleu-args '{"beam": 5, "max_len_a": 1.2, "max_len_b": 10}' --eval-bleu-detok moses --eval-bleu-remove-bpe --eval-bleu-print-samples --best-checkpoint-metric bleu --maximize-best-checkpoint-metric --no-progress-bar --log-interval 20 --save-dir /home/demo/fanyi/nmt/checkpoints/tf1/ --keep-interval-updates 20 --tensorboard-logdir Fairseq_Data-transformer | tee Fairseq_Data-transformer.log --fp16

3 测试中英翻译模型结果

3.1 解码

fairseq-generate  /home/demo/fanyi/nmt/data --path /home/demo/fanyi/nmt/checkpoints/tf1/checkpoint_best.pt --batch-size 128 --beam 8 > /home/demo/fanyi/nmt/data/result/bestbeam8.txt

3.2 抽取译文

grep ^H  /home/demo/fanyi/nmt/data/result/bestbeam8.txt | cut -f3- >  /home/demo/fanyi/nmt/data/result/predict.tok.true.bpe.en
grep ^T  /home/demo/fanyi/nmt/data/result/bestbeam8.txt | cut -f2- >  /home/demo/fanyi/nmt/data/result/answer.tok.true.bpe.en

3.3 去除bpe符号

sed -r 's/(@@ )| (@@ ?$)//g' < ${data_dir}/home/demo/fanyi/nmt/data/result/predict.tok.true.bpe.en  > ${data_dir}/home/demo/fanyi/nmt/data/result/predict.tok.true.en

sed -r 's/(@@ )| (@@ ?$)//g' < ${data_dir}/home/demo/fanyi/nmt/data/result/answer.tok.true.bpe.en  > ${data_dir}/home/demo/fanyi/nmt/data/result/answer.tok.true.en

3.4 恢复大小写

perl /home/demo/fanyi/mosesdecoder/scripts/tokenizer/normalize-punctuation.perl < ${data_dir}/home/demo/fanyi/nmt/data/result/predict.tok.true.en > ${data_dir}/home/demo/fanyi/nmt/data/result/predict.tok.en

perl /home/demo/fanyi/mosesdecoder/scripts/tokenizer/normalize-punctuation.perl < ${data_dir}/home/demo/fanyi/nmt/data/result/answer.tok.true.en > ${data_dir}/home/demo/fanyi/nmt/data/result/answer.tok.en

3.5 测试BLUE分数

perl /home/demo/fanyi/mosesdecoder/scripts/generic/multi-bleu.perl -lc /home/demo/fanyi/nmt/data/result/answer.tok.en < /home/demo/fanyi/nmt/data/result/predict.tok.en

同时可用tensorboard汇出LOSS曲线,观察训练中的情况及时调整参数,达到最优的效果。

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真不错鸭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值