OpenNMT-py低BLEU分数为德语翻译

时间:2017-07-28 07:00:18

标签: machine-translation opennmt

我在Europarl培训过OpenNLP-py模型,从英语到德语,从意大利语到德语,我的BLEU得分非常低:英语为8.13 - >德语和4.79意大利语 - >德语。

由于我还不是NN的专家,我采用了库提供的默认配置。在两个案例中训练了13个时期大约20个小时。在这两种情况下,我使用80%的数据集进行培训,10%进行验证,10%进行测试。

以下是我用于创建意大利语的命令 - >德国模型,我对另一个模型使用了类似的命令序列。任何人都可以就如何提高模型的有效性给出任何建议吗?

# $ wc -l Europarl.de-it.de
# 1832052 Europarl.de-it.de

head -1465640 Europarl.de-it.de > train_de-it.de
head -1465640 Europarl.de-it.it > train_de-it.it

tail -n 366412 Europarl.de-it.de | head -183206 > dev_de-it.de
tail -n 366412 Europarl.de-it.it | head -183206 > dev_de-it.it

tail -n 183206 Europarl.de-it.de > test_de-it.de
tail -n 183206 Europarl.de-it.it > test_de-it.it

perl tokenizer.perl -a -no-escape -l de < ../data/train_de-it.de > ../data/train_de-it.atok.de
perl tokenizer.perl -a -no-escape -l de < ../data/dev_de-it.de > ../data/dev_de-it.atok.de
perl tokenizer.perl -a -no-escape -l de < ../data/test_de-it.de > ../data/test_de-it.atok.de

perl tokenizer.perl -a -no-escape -l it < ../data/train_de-it.it > ../data/train_de-it.atok.it
perl tokenizer.perl -a -no-escape -l it < ../data/dev_de-it.it > ../data/dev_de-it.atok.it
perl tokenizer.perl -a -no-escape -l it < ../data/test_de-it.it > ../data/test_de-it.atok.it

python3 preprocess.py \
-train_src ../data/train_de-it.atok.it \
-train_tgt ../data/train_de-it.atok.de \
-valid_src ../data/dev_de-it.atok.it \
-valid_tgt ../data/dev_de-it.atok.de \
-save_data ../data/europarl_de_it.atok.low \
-lower

python3 train.py \
-data ../data/europarl_de_it.atok.low.train.pt \
-save_model ../models_en_de/europarl_it_de_models \
-gpus 0

1 个答案:

答案 0 :(得分:2)

您可以在Training Romance Multi-Way modelTraining English-German WMT15 NMT engine获得大量提示。主要思想是在连接的XXYY训练语料库上运行BPE标记化,然后使用学习的BPE模型对训练语料库进行标记。

字节对编码标记化应该对德语有益,因为它的复合,该算法有助于将单词划分为子单元。诀窍在于,您需要在包含源和目标的单个训练语料库中训练BPE模型。见Jean Senellart's comment

  

BPE模型应仅在训练语料库上进行训练 - 理想情况下,您需要为源和目标训练一个单一模型,以便模型可以轻松地从源到目标翻译相同的单词片段。   因此,我将连接源和目标训练语料库 - 然后训练一次令牌化,然后在这个单一语料库中学习BPE模型,然后用于源目标中的测试/有效/训练语料库的标记化

另一个想法是使用-case_feature进行标记。对于字母可以有不同情况的所有语言来说,这也是一个好主意。见Jean's comment

  

一般情况下使用-case_feature对几乎所有语言都是一个好主意(有案例) - 并且在源中的目标案例变体中处理和呈现时表现出良好的性能(例如全部大写/小写或大写单词) ,...)。

要提高MT质量,您也可以尝试

  1. 获取更多语料库(例如WMT16语料库)
  2. 使用in-domain training
  3. 调整