Этот репозиторий содержит исходный код для наших выводов EMNLP 2021 Документ: Сопоставление подводов и привязка между языками.
В нашей статье мы предлагаем новый метод для построения двуязычных словесных слов. Мы идентифицируем ложные позитивы (идентичные подчинки с различными значениями между языками) и ложные негативы (разные подвесы с одинаковыми значениями) в качестве ограничения совместно построенных словесных слов. Smala извлекает выравнивания подчиков с использованием неконтролируемой современной методики отображения и использует их для создания межъязычных якорей на основе сходства подчиков.
Сначала мы изучаем подчинки отдельно для каждого языка, а затем обучаем соответствующие встраивания. Затем мы применяем метод отображения для получения показателей сходства между встроениями, которые мы используем для извлечения выравнивания между подчиками двух языков. Мы наконец -то связываем параметры выравниваемых подводов, чтобы создать якоря во время обучения.
Создать среду (необязательно): в идеале вы должны создать среду для проекта.
conda create -n smala_env python=3.7.9
conda activate smala_env
Установите Pytorch 1.6.0 :
conda install pytorch==1.6.0 torchvision==0.7.0 -c pytorch
Клонировать проект:
git clone https://github.com/GeorgeVern/smala.git
cd smala
Затем установите остальные требования:
pip install -r requirements.txt
Установить инструменты (*), необходимые для извлечения данных, предварительной обработки и выравнивания:
bash install tools.sh
(*) Вам придется изменить строку 66 с скрипта Wikiextractor/wikiextractor.py: from .extract -> from extract , в противном случае вы получите относительную ошибку импорта.
Загрузите и предварительно обрабатывайте данные Википедии и изучают специфичный для языка для английского языка (EN) и другого языка, например, греческий (EL):
bash get-mono-data.sh en
bash get-mono-data.sh el el-tokenizer
Узнайте встроенные подножки для каждого языка:
bash learn_subw_embs.sh en
bash learn_subw_embs.sh el el-tokenizer
Сопоставьте одноязычные встроенные подножки в общее пространство, используя неконтролируемую версию VECMAP, поскольку мы не хотим полагаться на словари семян или идентичные (под) слова. Клонировать репозиторие GitHub (VECMAP), а затем запустите:
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
Извлеките выравнивания подносов из сопоставленных встроенных подводов:
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
Создайте новый словарь для целевого языка (так что выровненные подчинки указывают на одно и то же встроение в обоих лангауг) на основе выравнивания:
python3 utils/create_new_vocabs.py --tgt_tokenizer el-tokenizer --model_type ours --alignment_dir alignments/en-el
Инициализируйте встроенный слой целевой модели:
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
Вышеуказанные шаги служат для использования Smala с дополнительной инициализацией неординарных подчинок ( ours+align в статье). Для сравнения с другими моделями, которые включены в статью, вам необходимо изменить эти шаги:
ours : как указано выше, но запустите сценарий extract_alignments.py без флага--initialize~init_weight.py с флага --prob None .joint : пропустите сопоставление подполосов и первый шаг привязки, запустите сценарий extract_alignments.py с помощью --similarity surface_form -и без--initialize~create_new_vocabs.py с помощью --model_type joint и сценария init_weight.py с флагом --prob None .ramen : пропустите вышеуказанные шаги, см. Рамен о том, как создать вектор с вероятностным вектором (мы также строчный) и запустить сценарий init_weight.py с помощью правильного флага --prob и оригинального токенизатора (например, --tgt_vocab el-tokenizer/vocab.txt ) Наш метод также может использовать параллельные данные (в статье мы используем данные из Europarl и United Nations). Для этого вы должны сначала загрузить (например, в data/para/en-el ) и предварительно обработать (токенизировать и строчный) параллельный корпус. Затем беги:
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
Затем запустите 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
Чтобы получить матрицу сходства от быстроразового вывода клона Ramen Repo и запустите:
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
Наконец, для извлечения выравнивания, создания нового словаря и инициализации слоя встраивания целевой модели, запустите:
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
Чтобы перенести предварительный LM на новый язык, используя 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
Чтобы точно настроить перенесенную LM в XNLI (на английском языке).
(Загрузите файлы XNLI 1.0 и XNLI-MT 1.0 из XNLI Repo и раскрипируйте их в папке 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
Для получения нулевого выстрела в целевом языке (например, греческий).
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
Чтобы воспроизвести наши результаты, используйте семена 12 для обучения LM и семян 12 , 93 , 2319 , 1210 и 21 для тонкой настройки Xnli.
Мы хотели бы поблагодарить сообщество за выпуск их кода! Этот репозиторий содержит код из Huggingface и из Ramen, Vecmap, XLM и Simalign.
Если вы используете это репо в своем исследовании, пожалуйста, укажите статью:
@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}
}