Ce référentiel comprend les codes et scripts pour l'augmentation des données ciblant les mots rares pour la traduction de la machine neurale proposée dans notre article.
Si vous utilisez ce code, veuillez citer:
@InProceedings{fadaee-bisazza-monz:2017:Short2,
author = {Fadaee, Marzieh and Bisazza, Arianna and Monz, Christof},
title = {Data Augmentation for Low-Resource Neural Machine Translation},
booktitle = {Proceedings of the 55th Annual Meeting of the Association for Computational Linguistics (Volume 2: Short Papers)},
month = {July},
year = {2017},
address = {Vancouver, Canada},
publisher = {Association for Computational Linguistics},
pages = {567--573},
url = {http://aclweb.org/anthology/P17-2090}
}
Avant d'entraîner le modèle de langage monolingue dans [SRC / TRG], vous devrez prétraiter les données pour la direction avant et vers l'arrière en utilisant preprocess.no_preset_v.py .
python src/preprocess.no_preset_v.py --train_txt ./wiki.train.txt
--val_txt ./wiki.val.txt --test_txt ./wiki.test.txt
--output_h5 ./data.h5 --output_json ./data.json
Cela produira des fichiers data.h5 et data.json qui seront transmis au script de formation.
Après avoir prétraité les données, vous devrez former deux modèles de langue dans les directions avant et arrière.
th src/train.lua -input_h5 data.h5 -input_json data.json
-checkpoint_name models_rnn/cv -vocabfreq vocab_freq.trg.txt
th src/train.lua -input_h5 data.rev.h5 -input_json data.rev.json
-checkpoint_name models_rnn_rev/cv -vocabfreq vocab_freq.trg.txt
Il existe de nombreux autres drapeaux que vous pouvez utiliser pour configurer la formation.
L'entrée vocabfreq est la liste de fréquences des mots dans le paramètre à faible ressource qui nécessitent une augmentation plus tard en utilisant ces modèles de langage. Le format est:
...
change 3028
taken 3007
large 2999
again 2994
...
Après avoir entraîné les modèles de langue, vous pouvez générer de nouvelles phrases dans votre Buttext pour [src trg]. Vous pouvez exécuter ceci:
th src/substitution.lua -checkpoint models_rnn/cv_xxx.t7 -start_text train.en
-vocabfreq vocab_freq.trg.txt -sample 0 -topk 1000 -bwd 0 > train.en.subs
th src/substitution.lua -checkpoint models_rev.rnn/cv_xxx.t7 -start_text train.en.rev
-vocabfreq vocab_freq.trg.txt -sample 0 -topk 1000 -bwd 1 > train.en.rev.subs
start_text est le côté du MOTEXT que vous ciblez pour l'augmentation des mots rares. vocabfreq est la liste de fréquences utilisée pour détecter les mots rares. topk indique le nombre maximal de substitutions que vous souhaitez avoir pour chaque position dans la phrase.
L'exécution de ces deux codes vous donnera des corpus augmentés avec une liste de substitutions d'un côté: train.en.subs et train.en.rev.subs . Afin de trouver des remplacements qui correspondent le mieux au contexte, vous devrez trouver l'intersection de ces deux listes:
perl ./scripts/generate_intersect.pl train.en.subs train.en.rev.subs subs.intersect
subs.intersect contient les substitutions qui peuvent être utilisées pour augmenter le MOTX. Voici un exemple de la sortie:
information where we are successful will be published in this unk .
information{}
where{}
we{doctors:136 humans:135}
are{became:764 remained:245}
successful{}
will{}
be{}
published{interested:728 introduced:604 kept:456 performed:289 placed:615 played:535 released:477 written:790}
in{behind:932 beyond:836}
this{henry:58}
unk{}
.{}
La première ligne est la phrase d'origine, et chaque ligne après cela est un mot dans la phrase et des substitutions suggérées avec des fréquences respectives.
À l'aide de la sortie de substitution, le côté [TRG / SRC] du MOTEXT, l'alignement et le fichier de probabilité lexical que vous pouvez générer les corpus augmentés.
Vous pouvez utiliser Fast_align pour obtenir des alignements pour votre BOWXT. Le format de l'entrée d'alignement est:
...
0-0 1-10 2-3 2-4 2-5 3-13 4-14 5-8 5-9 6-16 7-14 8-11 10-6 11-7 12-17
0-0 1-0 2-0 2-2 3-1 3-3 4-5 5-5 6-6 8-8 9-9 10-10 11-11
...
L'entrée de probabilité lexicale peut être obtenue à partir d'un dictionnaire ou des alignements. Le format est:
...
safely sicher 0.0051237409068
safemode safemode 1
safeness antikollisionssystem 0.3333333
safer sicherer 0.09545972221228
...
Afin de générer la bordée augmentée, vous pouvez exécuter:
perl ./scripts/data_augmentation.pl subs.intersect train.de alignment.txt lex.txt augmentedOutput
Cela générera deux fichiers: augmentedOutput.augmented dans [src / trg] et augmentedOutput.fillout dans [trg / src]. Le premier fichier est le côté de la morsure augmentée ciblant les rares mots. Le deuxième fichier est des traductions respectives des phrases augmentées.
Si vous voulez avoir plus d'un changement dans chaque phrase, vous pouvez également exécuter:
perl ./scripts/data_augmentation_multiplechanges.pl subs.intersect train.de alignment.txt lex.txt augmentedOutput
Voici une phrase du fichier augmenté dans [SRC / TRG]:
at the same time , the rights of consumers began:604~need to be maintained .
et phrase respective du fichier de remplissage dans [trg / src]:
gleichzeitig begann~müssen die rechte der verbraucher geschützt werden .
Dans le fichier augmenté, le mot a commencé par Frequncy 604 substituts le mot besoin . Dans le fichier de remplissage, la traduction du mot, a commencé , remplace le mot original Müssen .
Pour éliminer tous les balisages et avoir une baise propre qui peut être utilisée pour la formation de traduction, vous pouvez exécuter:
perl ./scripts/filter_out_augmentations.pl augmentedOutput.en augmentedOutput.de 1000
Vous pouvez imposer une limite de Frequncy supplémentaire aux mots rares que vous souhaitez augmenter ici.
Dans ce travail, ce code est utilisé: