天天看點

使用Fairseq進行機器翻譯 前言一、檔案存放位置二、資料預處理三、Train Test Valid 檔案的劃分四、Sub-BEP處理五、二值化處理六、進入訓練七、使用tensorbord檢視訓練的結果八、使用模型預測九、譯文處理總結

前言

一、檔案存放位置

二、資料預處理

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.對中文進行分詞操作

  1. 在/root/Fairseq_Data目錄下建立檔案夾ZH_EN_Token,此檔案存放經過plt分詞後的中文與經過normal與Token之後的英文。
  2. 在/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檔案

使用Fairseq進行機器翻譯 前言一、檔案存放位置二、資料預處理三、Train Test Valid 檔案的劃分四、Sub-BEP處理五、二值化處理六、進入訓練七、使用tensorbord檢視訓練的結果八、使用模型預測九、譯文處理總結

三、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 檔案夾下生成六個檔案。

使用Fairseq進行機器翻譯 前言一、檔案存放位置二、資料預處理三、Train Test Valid 檔案的劃分四、Sub-BEP處理五、二值化處理六、進入訓練七、使用tensorbord檢視訓練的結果八、使用模型預測九、譯文處理總結

四、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

使用Fairseq進行機器翻譯 前言一、檔案存放位置二、資料預處理三、Train Test Valid 檔案的劃分四、Sub-BEP處理五、二值化處理六、進入訓練七、使用tensorbord檢視訓練的結果八、使用模型預測九、譯文處理總結

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 檔案,其中生成六個檔案

使用Fairseq進行機器翻譯 前言一、檔案存放位置二、資料預處理三、Train Test Valid 檔案的劃分四、Sub-BEP處理五、二值化處理六、進入訓練七、使用tensorbord檢視訓練的結果八、使用模型預測九、譯文處理總結

五、二值化處理

​ 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檔案夾下存放生成的二值化資料

使用Fairseq進行機器翻譯 前言一、檔案存放位置二、資料預處理三、Train Test Valid 檔案的劃分四、Sub-BEP處理五、二值化處理六、進入訓練七、使用tensorbord檢視訓練的結果八、使用模型預測九、譯文處理總結

六、進入訓練

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的結構

使用Fairseq進行機器翻譯 前言一、檔案存放位置二、資料預處理三、Train Test Valid 檔案的劃分四、Sub-BEP處理五、二值化處理六、進入訓練七、使用tensorbord檢視訓練的結果八、使用模型預測九、譯文處理總結
使用Fairseq進行機器翻譯 前言一、檔案存放位置二、資料預處理三、Train Test Valid 檔案的劃分四、Sub-BEP處理五、二值化處理六、進入訓練七、使用tensorbord檢視訓練的結果八、使用模型預測九、譯文處理總結

6.訓練過程

使用Fairseq進行機器翻譯 前言一、檔案存放位置二、資料預處理三、Train Test Valid 檔案的劃分四、Sub-BEP處理五、二值化處理六、進入訓練七、使用tensorbord檢視訓練的結果八、使用模型預測九、譯文處理總結

七、使用tensorbord檢視訓練的結果

1.進入到指定好的儲存到日志儲存的上級目錄

cd /root/fairseq
           
使用Fairseq進行機器翻譯 前言一、檔案存放位置二、資料預處理三、Train Test Valid 檔案的劃分四、Sub-BEP處理五、二值化處理六、進入訓練七、使用tensorbord檢視訓練的結果八、使用模型預測九、譯文處理總結

2.輸入檢視指令

tensorboard --logdir=./Fairseq_Data-transformer
           

3.控制台輸出

使用Fairseq進行機器翻譯 前言一、檔案存放位置二、資料預處理三、Train Test Valid 檔案的劃分四、Sub-BEP處理五、二值化處理六、進入訓練七、使用tensorbord檢視訓練的結果八、使用模型預測九、譯文處理總結

4.tensorbord監控

在浏覽器中輸入 http://localhost:6006/ 檢視

使用Fairseq進行機器翻譯 前言一、檔案存放位置二、資料預處理三、Train Test Valid 檔案的劃分四、Sub-BEP處理五、二值化處理六、進入訓練七、使用tensorbord檢視訓練的結果八、使用模型預測九、譯文處理總結

詳細名額變化

使用Fairseq進行機器翻譯 前言一、檔案存放位置二、資料預處理三、Train Test Valid 檔案的劃分四、Sub-BEP處理五、二值化處理六、進入訓練七、使用tensorbord檢視訓練的結果八、使用模型預測九、譯文處理總結
使用Fairseq進行機器翻譯 前言一、檔案存放位置二、資料預處理三、Train Test Valid 檔案的劃分四、Sub-BEP處理五、二值化處理六、進入訓練七、使用tensorbord檢視訓練的結果八、使用模型預測九、譯文處理總結

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.翻譯過程

使用Fairseq進行機器翻譯 前言一、檔案存放位置二、資料預處理三、Train Test Valid 檔案的劃分四、Sub-BEP處理五、二值化處理六、進入訓練七、使用tensorbord檢視訓練的結果八、使用模型預測九、譯文處理總結

3.翻譯好的譯文會在隻能夠的 predict_test.txt中儲存

使用Fairseq進行機器翻譯 前言一、檔案存放位置二、資料預處理三、Train Test Valid 檔案的劃分四、Sub-BEP處理五、二值化處理六、進入訓練七、使用tensorbord檢視訓練的結果八、使用模型預測九、譯文處理總結

4.檢視翻譯結果

使用Fairseq進行機器翻譯 前言一、檔案存放位置二、資料預處理三、Train Test Valid 檔案的劃分四、Sub-BEP處理五、二值化處理六、進入訓練七、使用tensorbord檢視訓練的結果八、使用模型預測九、譯文處理總結

 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.翻譯過程

使用Fairseq進行機器翻譯 前言一、檔案存放位置二、資料預處理三、Train Test Valid 檔案的劃分四、Sub-BEP處理五、二值化處理六、進入訓練七、使用tensorbord檢視訓練的結果八、使用模型預測九、譯文處理總結

3.互動翻譯會在控制台直接輸出翻譯結果

使用Fairseq進行機器翻譯 前言一、檔案存放位置二、資料預處理三、Train Test Valid 檔案的劃分四、Sub-BEP處理五、二值化處理六、進入訓練七、使用tensorbord檢視訓練的結果八、使用模型預測九、譯文處理總結

九、譯文處理

1.将得到的譯文進行抽取處理

grep ^H predict_test.txt | cut -f3- > predict_test1.txt
           
使用Fairseq進行機器翻譯 前言一、檔案存放位置二、資料預處理三、Train Test Valid 檔案的劃分四、Sub-BEP處理五、二值化處理六、進入訓練七、使用tensorbord檢視訓練的結果八、使用模型預測九、譯文處理總結

 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進行機器翻譯 前言一、檔案存放位置二、資料預處理三、Train Test Valid 檔案的劃分四、Sub-BEP處理五、二值化處理六、進入訓練七、使用tensorbord檢視訓練的結果八、使用模型預測九、譯文處理總結

總結

使用fairseq以及其中的指令行進行簡單的機器翻譯任務。

繼續閱讀