前言
一、檔案存放位置
二、資料預處理
1.對中文進行分詞操作
2.對英文資料操作
2.1 Normalize punctuation
2.2 Tokenizer
三、Train Test Valid 檔案的劃分
四、Sub-BEP處理
五、二值化處理
六、進入訓練
七、使用tensorbord檢視訓練的結果
八、使用模型預測
1.生成式翻譯
2.互動式翻譯
九、譯文處理
總結
前言
使用fairseq工具以及簡單的中英文語料使用transfomer進行翻譯任務。詳細的方法參照文檔 https://fairseq.readthedocs.io/en/latest/command_line_tools.html
一、檔案存放位置
将中英文對照檔案放入源檔案位置:/root/Fairseq_Data/Origianl_Data/下的zh.txt與en.txt
二、資料預處理
1.對中文進行分詞操作
- 在/root/Fairseq_Data目錄下建立檔案夾ZH_EN_Token,此檔案存放經過plt分詞後的中文與經過normal與Token之後的英文。
- 在/root/fairseq/examples/translation/utils 檔案夾中的Tokener.py 是對中文進行分詞的python程式。
- 示例代碼如下:
cd /root/fairseq/examples/translation/utils
python Tokener.py
3.執行完畢之後會在 /root/Fairseq_Data/ZH_EN_Token 目錄下生成zh_Token.txt。
2.對英文資料操作
2.1 Normalize punctuation
1.進入到 /root/fairseq/examples/translation 目錄下使用mosesdecoder檔案中的腳本對英文資料進行處理
#進入到指定目錄
cd /root/fairseq/examples/translation
2.使用/normalize-punctuation.perl 腳本對資料操作
perl /root/fairseq/example/translation/mosesdecoder/scripts/tokenizer/normalize-punctuation.perl -l en </root/Fairseq_Data/Origianl_Data/en.txt > /root/Fairseq_Data/ZH_EN_Token/norm.en
3.處理完成後會在/root/Fairseq_Data/ZH_EN_Token/的目錄下生成norm.en檔案
2.2 Tokenizer
1.進入到 /root/fairseq/examples/translation 目錄下使用mosesdecoder檔案中的腳本對英文資料進行處理
#進入到指定目錄
cd /root/fairseq/examples/translation
2.使用tokenizer.perl -a -l 指令對已經noemalize好的英文資料進行分詞梳處理
perl /root/fairseq/examples/translation/mosesdecoder/scripts/tokenizer/tokenizer.perl -a -l en </root/Fairseq_Data/ZH_EN_Token/norm.en > /root/Fairseq_Data/ZH_EN_Token/norm.tok.en
3.處理完畢之後會在/root/Fairseq_Data/ZH_EN_Token檔案下生成norm.tok.en檔案
三、Train Test Valid 檔案的劃分
因為用到的工具類都存放為/root/fairseq/examples/translation/utils位置,是以需要進到/root/fairseq/examples/translation/utils目錄下
#進入到指定位置
/root/fairseq/examples/translation/utils
#執行檔案劃分程式
python prepare_6_files.py
執行完畢之後會在 /root/Fairseq_Data/Split_Train_Test_Valid 檔案夾下生成六個檔案。
四、Sub-BEP處理
1.将/root/fairseq/examples/translation/下 subword-nmt檔案的路徑變為動态路徑友善後續使用
export PYTHONPATH=$(pwd)/subword-nmt:$PYTHONPATH
2.對/root/Fairseq_Data/Split_Train_Test_Valid 檔案下的 train.zh和train.en進行處理,建立詞彙表
#進入指定目錄
cd /root/Fairseq_Data/Split_Train_Test_Valid
#建立詞彙表
python -m learn_joint_bpe_and_vocab --input train.zh train.en -s 32000 -o bpe.codes --write-vocabulary bpe.vocab.zh bpe.vocab.en
3.運作成功後會在/root/Fairseq_Data/Split_Train_Test_Valid檔案夾下生成三個檔案
1.bpe.vocab.zh 2.bpe.vocab.en 3.bpe.codes
4.将位元組對編碼應用于我們的訓練、開發和測試資料
mkdir ne_WIPO_BPE_zh_en
python -m apply_bpe -c bpe.codes --vocabulary bpe.vocab.zh --vocabulary-threshold 50 < train.zh > ne_WIPO_BPE_zh_en/train.zh
python -m apply_bpe -c bpe.codes --vocabulary bpe.vocab.en --vocabulary-threshold 50 < train.en > ne_WIPO_BPE_zh_en/train.en
python -m apply_bpe -c bpe.codes --vocabulary bpe.vocab.zh --vocabulary-threshold 50 < valid.zh > ne_WIPO_BPE_zh_en/valid.zh
python -m apply_bpe -c bpe.codes --vocabulary bpe.vocab.en --vocabulary-threshold 50 < valid.en > ne_WIPO_BPE_zh_en/valid.en
python -m apply_bpe -c bpe.codes --vocabulary bpe.vocab.zh --vocabulary-threshold 50 < test.zh > ne_WIPO_BPE_zh_en/test.zh
python -m apply_bpe -c bpe.codes --vocabulary bpe.vocab.en --vocabulary-threshold 50 < test.en > ne_WIPO_BPE_zh_en/test.en
5.運作結束後會在 /root/Fairseq_Data/Split_Train_Test_Valid 檔案夾下生成ne_WIPO_BPE_zh_en 檔案,其中生成六個檔案
五、二值化處理
1.退回到需要退到fairseq檔案夾下
cd /root/fairseq
2.執行指令行
TEXT=/root/Fairseq_Data/Split_Train_Test_Valid/ne_WIPO_BPE_zh_en
fairseq-preprocess --source-lang zh --target-lang en --trainpref $TEXT/train --validpref $TEXT/valid --testpref $TEXT/test --destdir data-bin/ne_WIPO.tokenized.zh-en --workers 20
3.運作成功之後會在在data-bin下會生成檔案夾ne_WIPO.tokenized.zh-en檔案夾下存放生成的二值化資料
六、進入訓練
1.建立screen 并進入
screen -S train
screen -r train
2.激活建立的fairseq虛拟環境
conda activate fairseq
3.進入到fairseq目錄下
cd /root/fairseq
4.開始訓練
CUDA_VISIBLE_DEVICES=7 fairseq-train data-bin/ne_WIPO.tokenized.zh-en --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 checkpoints_WIPO --keep-interval-updates 20 --tensorboard-logdir Fairseq_Data-transformer | tee Fairseq_Data-transformer.log
5.Transfomer的結構
6.訓練過程
七、使用tensorbord檢視訓練的結果
1.進入到指定好的儲存到日志儲存的上級目錄
cd /root/fairseq
2.輸入檢視指令
tensorboard --logdir=./Fairseq_Data-transformer
3.控制台輸出
4.tensorbord監控
在浏覽器中輸入 http://localhost:6006/ 檢視
詳細名額變化
blue不斷上升 loss不斷下降 模型訓練正常。
八、使用模型預測
訓練好模型後,可以使用fairseq-generate(用于二進制資料)或fairseq-interactive(用于原始文本)生成翻譯
1.生成式翻譯
1.使用生成式翻譯需要用到fairseq-generate,翻譯的語料是之前已經準備好在 /root/fairseq/data-bin/ne_WIPO.tokenized.zh-en 下的檔案
#進入fairseq目錄下
cd /root/fairseq
#使用fairseq-generate生成翻譯
fairseq-generate data-bin/ne_WIPO.tokenized.zh-en --path checkpoints_WIPO/checkpoint_best.pt --skip-invalid-size-inputs-valid-test --beam 5 --remove-bpe > predict_test.txt
2.翻譯過程
3.翻譯好的譯文會在隻能夠的 predict_test.txt中儲存
4.檢視翻譯結果
5.結果分析
S 是經過分詞後的源語言。
T 是經過Token之後的目智語言。
H 是模型預測的句子,H前的數字是這個句子的預測機率的log再除總長度
P 是每個單詞的預測機率的log,全部相加除句子總長度等于H
2.互動式翻譯
1.使用互動式翻譯需要用到 fairseq-interactive,翻譯的語料是之前已經準備好在 /root/fairseq/data-bin/ne_WIPO.tokenized.zh-en 下的檔案
#進入fairseq目錄下
cd /root/fairseq
#使用fairseq-generate生成翻譯
fairseq-interactive data-bin/ne_WIPO.tokenized.zh-en --path checkpoints_WIPO/checkpoint_best.pt --skip-invalid-size-inputs-valid-test --beam 5 --remove-bpe
2.翻譯過程
3.互動翻譯會在控制台直接輸出翻譯結果
九、譯文處理
1.将得到的譯文進行抽取處理
grep ^H predict_test.txt | cut -f3- > predict_test1.txt
2.去除bpe符号,将處理好的檔案儲存在predict_test2.txt中
sed -r 's/(@@ )| (@@ ?$)//g' < predict_test1.txt > predict_test2.txt
3.計算bleu值,對比标準是用tokenized後的檔案:
使用mosesdecoder工具中的multi-bleu.perl進行計算
perl /root/fairseq/examples/translation/mosesdecoder/scripts/generic/multi-bleu.perl /root/Fairseq_Data/Split_Train_Test_Valid/test.en < /root/fairseq/predict_test2.txt
4.計算結果
總結
使用fairseq以及其中的指令行進行簡單的機器翻譯任務。