当前位置:   article > 正文

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

subword-nmt在python

1.数据预处理

1.1 相关工具下载

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

2.下载 subword-nmt(BPE)

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

3.下载 Moses (SMT工具)

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

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
  1. 分词
python -m jieba -d " " 分词前数据名 > 分词后数据名
  • 1

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
  • 2
  • 3

1.5 Tokenize

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

使用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
  • 2
  • 3

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

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/
  • 1

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
  • 1

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
  • 1

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
  • 1
  • 2

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
  • 1
  • 2
  • 3

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
  • 1
  • 2
  • 3

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
  • 1

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/907737
推荐阅读
相关标签
  

闽ICP备14008679号