该存储库包含我们的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}
}