Repositori ini berisi kode sumber untuk EMNLP 2021 Temuan Kertas: Pemetaan Subword dan Penahan lintas bahasa.
Dalam makalah kami, kami mengusulkan metode baru untuk membangun kosa kata subword bilingual. Kami mengidentifikasi positif palsu (subword identik dengan makna yang berbeda di seluruh bahasa) dan negatif palsu (subword berbeda dengan makna yang sama) sebagai batasan kosa kata subword yang dibangun bersama. Smala mengekstrak perataan subword menggunakan teknik pemetaan canggih yang tidak diawasi dan menggunakannya untuk membuat jangkar lintas-bahasa berdasarkan kesamaan subword.
Kami pertama -tama belajar subword secara terpisah untuk setiap bahasa dan kemudian melatih embeddings yang sesuai. Kami kemudian menerapkan metode pemetaan untuk mendapatkan skor kesamaan antara embeddings, yang kami gunakan untuk mengekstrak keberpihakan antara subword dari kedua bahasa. Kami akhirnya mengikat parameter subword yang disejajarkan untuk membuat jangkar selama pelatihan.
Buat lingkungan (opsional): Idealnya, Anda harus menciptakan lingkungan untuk proyek.
conda create -n smala_env python=3.7.9
conda activate smala_env
Instal Pytorch 1.6.0 :
conda install pytorch==1.6.0 torchvision==0.7.0 -c pytorch
Klon proyek:
git clone https://github.com/GeorgeVern/smala.git
cd smala
Kemudian pasang sisa persyaratan:
pip install -r requirements.txt
Instal Tools (*) yang diperlukan untuk ekstraksi data, preprocessing dan penyelarasan:
bash install tools.sh
(*) Anda harus mengubah baris 66 dari wikiextractor/wikiextractor.py skrip: from .extract -> from extract jika tidak Anda akan mendapatkan kesalahan impor relatif.
Unduh dan Preprocess Wikipedia Data dan Pelajari Bahasa-Khusus untuk Bahasa Inggris (EN) dan Bahasa Lain, misalnya bahasa Yunani (EL):
bash get-mono-data.sh en
bash get-mono-data.sh el el-tokenizer
Pelajari embeddings subword untuk setiap bahasa:
bash learn_subw_embs.sh en
bash learn_subw_embs.sh el el-tokenizer
Peta embedding subword monolingual ke dalam ruang umum menggunakan versi VECMAP yang tidak diawasi , karena kami tidak ingin mengandalkan kamus benih atau kata -kata yang identik (sub). Klon Repo GitHub (VECMAP) dan kemudian jalankan:
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
Ekstrak Alignment Subword dari Embeddings Subword yang dipetakan:
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
Buat kosakata baru untuk bahasa target (sehingga subword yang selaras menunjuk ke embedding yang sama di kedua langauge) berdasarkan keberpihakan:
python3 utils/create_new_vocabs.py --tgt_tokenizer el-tokenizer --model_type ours --alignment_dir alignments/en-el
Inisialisasi lapisan penyematan model target:
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
Langkah-langkah di atas berfungsi untuk menggunakan Smala dengan inisialisasi tambahan dari subword yang tidak selaras ( ours+align di koran). Untuk membandingkan dengan model lain yang termasuk dalam makalah, Anda perlu memodifikasi langkah -langkah ini:
ours : seperti di atas tetapi jalankan skrip extract_alignments.py tanpa bendera--initialize~init_weight.py dengan bendera --prob None .joint : Lewati pemetaan subword dan langkah pertama penahan, jalankan skrip extract_alignments.py dengan --similarity surface_form dan tanpa--initialize~create_new_vocabs.py dengan flag --model_type joint dan skrip init_weight.py dengan flag --prob None .ramen : Lewati langkah-langkah di atas, lihat ramen tentang cara membuat vektor probabilitas (kami juga huruf kecil) dan menjalankan skrip init_weight.py dengan bendera --prob yang benar dan tokenizer asli (misalnya --tgt_vocab el-tokenizer/vocab.txt ) Metode kami juga dapat mengeksploitasi data paralel (dalam makalah kami menggunakan data dari Europarl dan PBB). Untuk melakukannya, Anda harus terlebih dahulu mengunduh (misalnya dalam data/para/en-el ) dan preprocess (tokenize dan huruf kecil) sebuah korpus paralel. Kemudian jalankan:
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
Kemudian jalankan 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
Untuk mendapatkan matriks kesamaan dari klon output cepat-cepat Ramen Repo dan jalankan:
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
Akhirnya, untuk mengekstrak keberpihakan, membuat kosakata baru dan menginisialisasi lapisan penyematan model target, menjalankan:
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
Untuk mentransfer LM pretrain ke bahasa baru menggunakan 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
Untuk menyempurnakan LM yang ditransfer dalam XNLI (dalam bahasa Inggris) Run:
(Unduh file XNLI 1.0 dan XNLI-MT 1.0 dari xnli repo dan unzip di dalam folder 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
Uji zero-shot dalam bahasa target (misalnya bahasa Yunani) Jalankan:
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
Untuk mereproduksi hasil kami, gunakan benih 12 untuk pelatihan LM dan biji 12 , 93 , 2319 , 1210 dan 21 untuk fine-tuning xnli.
Kami ingin mengucapkan terima kasih kepada komunitas karena telah merilis kode mereka! Repositori ini berisi kode dari Huggingface dan dari Ramen, Vecmap, XLM dan Simalign Repositories.
Jika Anda menggunakan repo ini dalam riset Anda, silakan kutip kertas:
@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}
}