Dieses Repository enthält Quellcode für unser EMNLP 2021 -Erkenntnispapier: Subword -Zuordnung und Verankerung über Sprachen.
In unserem Artikel schlagen wir eine neue Methode vor, um zweisprachige Subword -Vokabeln zu konstruieren. Wir identifizieren Fehlalarme (identische Unterwörter mit unterschiedlichen Bedeutungen über Sprachen) und falsch negative (unterschiedliche Unterwörter mit ähnlichen Bedeutungen) als Einschränkung gemeinsamer konstruierter Subword -Vokabulare. SMALA extrahiert Subword-Ausrichtungen mit einer unbeaufsichtigten Mapping-Technik auf dem neuesten Stand der Technik und erstellt sie basierend auf Subword-Ähnlichkeiten.
Für jede Sprache lernen wir zuerst Subwords getrennt und trainieren dann die entsprechenden Einbettungen. Anschließend wenden wir eine Zuordnungsmethode an, um Ähnlichkeitswerte zwischen den Einbettungen zu erhalten, mit denen wir Ausrichtungen zwischen den Unterwörtern der beiden Sprachen extrahieren. Wir binden schließlich die Parameter der ausgerichteten Unterwörter, um während des Trainings Anker zu erstellen.
Umgebung erstellen (optional): Idealerweise sollten Sie eine Umgebung für das Projekt schaffen.
conda create -n smala_env python=3.7.9
conda activate smala_env
Installieren Sie Pytorch 1.6.0 :
conda install pytorch==1.6.0 torchvision==0.7.0 -c pytorch
Klonen Sie das Projekt:
git clone https://github.com/GeorgeVern/smala.git
cd smala
Installieren Sie dann den Rest der Anforderungen:
pip install -r requirements.txt
Installieren Sie Tools (*), die für die Datenextraktion, Vorverarbeitung und Ausrichtung erforderlich sind:
bash install tools.sh
from .extract from extract
Download und Vorverarbeitungswikipedia-Daten vorab und lernen Sie sprachspezifisch für Englisch (EN) und eine andere Sprache, z. B. Griechisch (EL):
bash get-mono-data.sh en
bash get-mono-data.sh el el-tokenizer
Lernen Sie Subword -Einbettungen für jede Sprache:
bash learn_subw_embs.sh en
bash learn_subw_embs.sh el el-tokenizer
Zeichnen Sie das einsprachige Subword -Einbettung in einen gemeinsamen Raum unter Verwendung der unbeaufsichtigten Version von VecMap ab, da wir uns nicht auf Samenwörterbücher oder identische (Sub-) Wörter verlassen möchten. Klonen Sie das Github -Repo von (Vecmap) und rennen Sie dann:
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
Subword -Ausrichtungen aus den kartierten Subword -Einbettungen extrahieren:
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
Erstellen Sie ein neues Wortschatz für die Zielsprache (so dass die Subwords auf dieselbe Einbettung in beide Langaugens hinweisen) basierend auf den Ausrichtungen:
python3 utils/create_new_vocabs.py --tgt_tokenizer el-tokenizer --model_type ours --alignment_dir alignments/en-el
Initialisieren Sie die Einbettungsschicht des Zielmodells:
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
Die obigen Schritte dienen dazu, SMALA mit zusätzlicher Initialisierung der nicht ausgerichteten Subwörter ( ours+align im Papier) zu verwenden. Um mit den anderen Modellen zu vergleichen, die in dem Papier enthalten sind, müssen Sie diese Schritte ändern:
ours : wie oben, aber führen Sie das Skript extract_alignments.py ohne Flag aus--initialize~init_weight.py mit der Flag --prob None .joint : Überspringen Sie die Subword -Zuordnung und den ersten Schritt der Verankerung, führen Sie das Skript extract_alignments.py mit der --similarity surface_form und ohne die--initialize~create_new_vocabs.py mit dem --model_type joint und dem Skript init_weight.py mit dem --prob None Flag aus.ramen : Überspringen Sie die oben genannten Schritte, siehe Ramen, wie Sie den Probabilty-Vektor erstellen (wir auch Kleinbuchstaben) und das Skript init_weight.py mit dem richtigen --prob Flag und dem ursprünglichen Tokenizer (z --tgt_vocab el-tokenizer/vocab.txt Unsere Methode kann auch parallele Daten ausnutzen (in dem Papier verwenden wir Daten aus Europarl und Vereinten Nationen). Dazu müssen Sie zuerst (z. B. in data/para/en-el ) und vorverarbeitet (Tokenize und Kleinbuchstaben) einen parallelen Korpus. Dann rennen:
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
Dann fastalign laufen:
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
Um die Ähnlichkeitsmatrix von Fast-Align-Ausgangsausgang zu erhalten, klonen Sie den Ramen-Repo und rennen Sie:
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
Um Ausrichtungen zu extrahieren, neue Vokabeln zu erstellen und die Einbettungsschicht des Zielmodells zu initialisieren, rennen Sie:
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
Um eine vorgezogene LM mit Smala Run in eine neue Sprache zu übertragen :
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
Um den übertragenen LM in Xnli (in englischer) Lauf zu optimieren :
(Download XNLI 1.0 und XNLI-MT 1.0 Dateien von Xnli Repo und entpacken Sie sie im 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
Bis zum Zero-Shot -Test in der Zielsprache (z. B. Griechisch) laufen:
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
Um unsere Ergebnisse zu reproduzieren, verwenden Sie Samen 12 für LM-Training und Samen 12 , 93 , 2319 , 1210 und 21 für die Feinabstimmung von XNLI.
Wir möchten der Community dafür danken, dass sie ihren Code veröffentlicht haben! Dieses Repository enthält Code von Suggingface und aus Ramen-, VeCMap-, XLM- und Simalign -Repositories.
Wenn Sie dieses Repo in Ihrer Forschung verwenden, zitieren Sie bitte das Papier:
@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}
}