Este repositório inclui os códigos e scripts para aumento de dados direcionados a palavras raras para a tradução da máquina neural proposta em nosso artigo.
Se você usar este código, cite:
@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}
}
Antes de treinar o modelo de idioma monolíngue em [SRC/TRG], você precisará pré -processar os dados para a direção avançada e para trás usando 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
Isso produzirá arquivos data.h5 e data.json que serão passados para o script de treinamento.
Após pré -processamento dos dados, você precisará treinar dois modelos de idiomas em direções para frente e para trás.
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
Há muito mais sinalizadores que você pode usar para configurar o treinamento.
A entrada vocabfreq é a lista de freqüência de palavras na configuração de baixo recurso que precisa aumentar mais tarde usando esses modelos de idiomas. O formato é:
...
change 3028
taken 3007
large 2999
again 2994
...
Depois de treinar os modelos de idiomas, você pode gerar novas frases em sua mordida para [src trg]. Você pode executar isso:
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 é o lado do bitext que você está direcionando para aumentar as palavras raras. vocabfreq é a lista de frequência usada para detectar palavras raras. topk indica o número máximo de substituições que você deseja ter para cada posição na frase.
A execução desses dois códigos fornecerá a você corpora aumentada com uma lista de substituições de um lado: train.en.subs e train.en.rev.subs . Para encontrar substituras que melhor correspondam ao contexto, você precisará encontrar a interseção dessas duas listas:
perl ./scripts/generate_intersect.pl train.en.subs train.en.rev.subs subs.intersect
subs.intersect contém as substituições que podem ser usadas para aumentar a mordida. Aqui está um exemplo da saída:
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{}
.{}
A primeira linha é a frase original, e cada linha depois disso é uma palavra na frase e substituições sugeridas com as respectivas frequências.
Usando a saída de substituição, o lado [TRG/SRC] do Bitext, o alinhamento e o arquivo de probabilidade lexical, você pode gerar o corpora aumentado.
Você pode usar o fast_align para obter alinhamentos para o seu bitext. O formato da entrada de alinhamento é:
...
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
...
A entrada de probabilidade lexical pode ser obtida de um dicionário ou dos alinhamentos. O formato é:
...
safely sicher 0.0051237409068
safemode safemode 1
safeness antikollisionssystem 0.3333333
safer sicherer 0.09545972221228
...
Para gerar o Bitext aumentado, você pode executar:
perl ./scripts/data_augmentation.pl subs.intersect train.de alignment.txt lex.txt augmentedOutput
Isso gerará dois arquivos: augmentedOutput.augmented augmentedOutput.fillout O primeiro arquivo é o lado do Bitext aumentado, direcionado às palavras raras. O segundo arquivo são as respectivas traduções das sentenças aumentadas.
Se você quiser ter mais de uma alteração em cada frase, você também pode executar:
perl ./scripts/data_augmentation_multiplechanges.pl subs.intersect train.de alignment.txt lex.txt augmentedOutput
Aqui está uma frase do arquivo aumentado em [src/trg]:
at the same time , the rights of consumers began:604~need to be maintained .
e respectiva frase do arquivo de preenchimento em [trg/src]:
gleichzeitig begann~müssen die rechte der verbraucher geschützt werden .
No arquivo aumentado, a palavra começou com o Frequncy 604 substitui a palavra necessidade . No arquivo de preenchimento, a tradução da palavra, começou , substitui a palavra original müssen .
Para remover todas as marcas e ter um Bitext limpo que pode ser usado para treinamento de tradução que você pode executar:
perl ./scripts/filter_out_augmentations.pl augmentedOutput.en augmentedOutput.de 1000
Você pode impor mais limite de frequncy a palavras raras que deseja aumentar aqui.
Neste trabalho, este código é utilizado: