Ce référentiel contient un code source pour notre article de découverte EMNLP 2021: mappage de sous-mots et ancrage entre les langues.
Dans notre article, nous proposons une nouvelle méthode pour construire des vocabulaires de sous-mots bilingues. Nous identifions les faux positifs (sous-mots identiques avec différentes significations entre les langues) et les faux négatifs (différents sous-mots avec des significations similaires) à la limitation des vocabulaires de sous-mots construits conjointement. SMALA extrait les alignements de sous-mots à l'aide d'une technique de cartographie de pointe non supervisée et les utilise pour créer des ancres interdicules basées sur des similitudes de sous-mots.
Nous apprenons d'abord des sous-mots séparément pour chaque langue, puis formons les incorporations correspondantes. Nous appliquons ensuite une méthode de mappage pour obtenir des scores de similitude entre les intégres, que nous utilisons pour extraire les alignements entre les sous-mots des deux langues. Nous lions enfin les paramètres des sous-mots alignés pour créer des ancres pendant la formation.
Créer un environnement (facultatif): Idéalement, vous devez créer un environnement pour le projet.
conda create -n smala_env python=3.7.9
conda activate smala_env
Installez Pytorch 1.6.0 :
conda install pytorch==1.6.0 torchvision==0.7.0 -c pytorch
Clone le projet:
git clone https://github.com/GeorgeVern/smala.git
cd smala
Installez ensuite le reste des exigences:
pip install -r requirements.txt
Installer des outils (*) nécessaires à l'extraction des données, au prétraitement et à l'alignement:
bash install tools.sh
(*) Vous devrez modifier la ligne 66 à partir du script Wikiextractor / wikiextractor.py: from .extract -> from extract sinon vous obtiendrez une erreur d'importation relative.
Télécharger et prétraiter les données Wikipedia et apprendre la langue spécifique à l'anglais (en) et une autre langue, par exemple grec (EL):
bash get-mono-data.sh en
bash get-mono-data.sh el el-tokenizer
Apprenez des incorporations de sous-mots pour chaque langue:
bash learn_subw_embs.sh en
bash learn_subw_embs.sh el el-tokenizer
Cartez les incorporations de sous-mots monolingues dans un espace commun en utilisant la version non supervisée de VecMap, car nous ne voulons pas compter sur des dictionnaires de semences ou des mots identiques (sub). Clone le repo github de (VECMAP) puis exécutez:
python3 vecmap/map_embeddings.py --unsupervised smala/data/mono/txt/en/WP/en.train.wp.vec smala/data/mono/txt/el/WP/el.train.wp.vec smala/data/mono/txt/en/WP/mapped_en_el_embs.txt smala/data/mono/txt/el/WP/mapped_el_embs.txt
Extraire les alignements de sous-mots des incorporations de sous-mots mappées:
python3 extract_alignments.py --src_emb data/mono/txt/en/WP/mapped_en_el_embs.txt --tgt_emb data/mono/txt/el/WP/mapped_el_embs.txt --similarity cosine --alignment_dir en-el --initialize
Créez un nouveau vocabulaire pour la langue cible (afin que les sous-mots alignés pointent vers la même intégration dans les deux langauges) sur la base des alignements:
python3 utils/create_new_vocabs.py --tgt_tokenizer el-tokenizer --model_type ours --alignment_dir alignments/en-el
Initialiser la couche d'intégration du modèle cible:
python3 utils/init_weight.py --tgt_vocab alignments/en-el/new_tgt_vocab.txt --prob alignments/en-el/prob_vector --tgt_model emb_layer/el/bert-ours_align_embs
Les étapes ci-dessus servent à utiliser SMALA avec une initialisation supplémentaire des sous-mots non alignés ( ours+align dans l'article). Pour comparer avec les autres modèles inclus dans l'article, vous devez modifier ces étapes:
ours : comme ci-dessus mais exécutez le script extract_alignments.py sans le drapeau--initialize~init_weight.py avec l'indicateur --prob None .joint : sautez le mappage de sous-mots et la première étape de l'ancrage, exécutez le script extract_alignments.py avec le --similarity surface_form et sans le--initialize~create_new_vocabs.py avec le script --model_type joint et le script init_weight.py avec l'indicateur --prob None .ramen : Ignorez les étapes ci-dessus, voir Ramen sur la façon de créer le vecteur probabilte (nous également en minuscules) et d'exécuter le script init_weight.py avec l'indicateur correct --prob et le tokenizer original (par exemple --tgt_vocab el-tokenizer/vocab.txt ) Notre méthode peut également exploiter des données parallèles (dans l'article, nous utilisons les données d'Europarl et des Nations Unies). Pour ce faire, vous devez d'abord télécharger (par exemple dans data/para/en-el ) et le prétraitement (tokenize et minuscules) un corpus parallèle. Puis courez:
python3 utils/apply_tokenizer.py --tokenizer bert --file data/para/en-el/en-el.en.txt
python3 utils/apply_tokenizer.py --tokenizer el-tokenizer --file data/para/en-el/en-el.el.txt
Ensuite, exécutez Fastalign:
bash run_fast-align.sh en el data/para/en-el/WP/en-el.en.wp data/para/en-el/WP/en-el.el.wp data/para/en-el/WP/fast-align
Pour obtenir la matrice de similitude à partir de la sortie à aligne rapide, le Ramen Repo and Run:
python3 ramen/code/alignment/get_prob_para.py --bitxt smala/data/para/en-el/WP/fast-align/cleared.en-el --align smala/data/para/en-el/WP/fast-align/align.en-el --save smala/data/para/en-el/WP/fast-align/probs.para.en-el.pth
Enfin, pour extraire les alignements, créez un nouveau vocabulaire et initialisez la couche d'intégration du modèle cible, exécutez:
python3 extract_alignments_para.py --tgt_tokenizer el-tokenizer --similarity_matrix data/para/en-el/WP/fast-align/probs.para.en-el.pth --alignment_dir en-el_fastalign
python3 utils/create_new_vocabs.py --tgt_tokenizer el-tokenizer --model_type ours --alignment_dir alignments/en-el_fastalign
python3 utils/init_weight.py --tgt_vocab alignments/en-el_fastalign/new_tgt_vocab.txt --prob alignments/en-el_fastalign/prob_vector --tgt_model emb_layer/el/bert-ours_align_para_embs
Pour transférer un LM pré-entraîné à une nouvelle langue en utilisant Smala Run:
python3 fine-tune_biBERTLM.py
--tgt_lang el
--output_dir ckpts/greek_ours_align
--foreign_model emb_layer/el/bert-ours_align_embs
--biLM_model_name ours
--alignment_dir alignments/en-el
--tgt_tokenizer_name alignments/en-el/new_tgt_vocab.txt
--do_train --do_eval
--evaluation_strategy steps
--seed 12
--per_device_eval_batch_size 38
--max_steps 120000
--eval_steps 5000
--logging_steps 5000
--save_steps 5000
--per_device_train_batch_size 38
--eval_accumulation_steps 1
Pour affiner le LM transféré dans XNLI (en anglais) Run:
(Téléchargez les fichiers XNLI 1.0 et XNLI-MT 1.0 à partir du repo XNLI et se décompressez-les dans le dossier data )
python3 fine-tune_xnli.py
--data_dir data/
--biLM_model_name ours
--biLM ckpts/greek_ours_align/checkpoint-120000/
--foreign_model emb_layer/el/bert-ours_align_embs
--language en
--output_dir ckpts/greek_xnli_ours_align/
--tgt_tokenizer_name alignments/en-el/new_tgt_vocab.txt
--alignment_dir alignments/en-el/
--do_train --do_eval
--seed 12
À un test zéro dans la langue cible (par exemple grec) exécuter:
python3 fine-tune_xnli.py
--data_dir data/
--biLM_model_name ours
--biLM ckpts/greek_ours_align/checkpoint-120000/
--foreign_model emb_layer/el/bert-ours_align_embs
--language el
--output_dir ckpts/greek_xnli_ours_align/
--tgt_tokenizer_name alignments/en-el/new_tgt_vocab.txt
--alignment_dir alignments/en-el/
--do_test
--seed 12
Pour reproduire nos résultats, utilisez les graines 12 pour l'entraînement LM et les graines 12 , 93 , 2319 , 1210 et 21 pour le réglage fin XNLI.
Nous tenons à remercier la communauté d'avoir publié leur code! Ce référentiel contient du code de HuggingFace et des référentiels ramen, vecmap, xlm et simalign.
Si vous utilisez ce dépôt dans votre recherche, veuillez citer le document:
@misc{vernikos2021subword,
title={Subword Mapping and Anchoring across Languages},
author={Giorgos Vernikos and Andrei Popescu-Belis},
year={2021},
eprint={2109.04556},
archivePrefix={arXiv},
primaryClass={cs.CL}
}