該存儲庫包含我們的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
(*)您將必須從wikiextractor/wikiextractor.py腳本: from .extract > from extract wikiextractor/wikiextractor更改行66,否則您將獲得相對導入錯誤。
下載和預處理Wikipedia數據,並學習特定於英語的語言(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版本將單語的子字嵌入到一個公共空間中,因為我們不想依靠種子詞典或相同的(sub)單詞。克隆(vecmap)的github倉庫,然後運行:
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
根據對齊方式創建目標語言的新詞彙(以便對齊子字指向兩個langauges中的相同嵌入):
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~--prob None標誌的init_weight.py腳本。joint :跳過子詞映射和錨定的第一步,以--similarity surface_form運行extract_alignments.py腳本--initialize~--model_type joint和init_weight.py腳本運行create_new_vocabs.py腳本,帶有--prob None nlag。ramen :跳過上述步驟,請參閱有關如何創建概率向量(我們也小寫)的拉麵,並使用正確的--prob flag和原始tokenizer運行init_weight.py腳本(例如--tgt_vocab el-tokenizer/vocab.txt )我們的方法還可以利用並行數據(在本文中,我們使用來自Europarl和聯合國的數據)。為此,您必須首先下載(例如, 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
然後運行factalign:
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
使用Smala Run將驗證的LM轉移到新語言中:
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
微調XNLI(英語)運行中傳輸的LM:
(從XNLI倉庫下載XNLI 1.0和XNLI-MT 1.0文件,然後將它們解壓縮在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
1210重現我們的結果93使用種子12進行LM訓練和種子12和21 2319 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}
}