พื้นที่เก็บข้อมูลนี้มีซอร์สโค้ดสำหรับ EMNLP 2021 ผลการวิจัยของเรา: การทำแผนที่คำย่อยและการยึดข้ามภาษา
ในบทความของเราเราเสนอวิธีการใหม่ในการสร้างคำศัพท์ subword สองภาษา เราระบุ ผลบวกที่ผิดพลาด (คำย่อยที่เหมือนกันที่มีความหมายที่แตกต่างกันในภาษา) และ ลบเท็จ (คำย่อยที่แตกต่างกันที่มีความหมายคล้ายกัน) เป็นข้อ จำกัด ของคำศัพท์คำศัพท์ subword ที่สร้างขึ้นร่วมกัน SMALA สกัดการจัดตำแหน่ง subword โดยใช้เทคนิคการทำแผนที่ที่ทันสมัยที่ไม่ได้รับการดูแลและใช้เพื่อสร้างจุดยึดข้ามภาษาตามความคล้ายคลึงกันของคำย่อย
ก่อนอื่นเราจะเรียนรู้ คำย่อย แยกต่างหากสำหรับแต่ละภาษาจากนั้นฝึกอบรมการฝังที่สอดคล้องกัน จากนั้นเราใช้วิธี การทำแผนที่ เพื่อให้ได้คะแนนความคล้ายคลึงกันระหว่างการฝังตัวซึ่งเราใช้ในการแยก การจัดตำแหน่ง ระหว่างคำย่อยของทั้งสองภาษา ในที่สุดเราก็ผูกพารามิเตอร์ของคำย่อยที่จัดตำแหน่งเพื่อสร้าง จุดยึด ระหว่างการฝึกอบรม
สร้างสภาพแวดล้อม (เป็นทางเลือก): โดยหลักแล้วคุณควรสร้างสภาพแวดล้อมสำหรับโครงการ
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 script: from .extract -> from extract มิฉะนั้นคุณจะได้รับข้อผิดพลาดในการนำเข้าสัมพัทธ์
ดาวน์โหลดและประมวลผลข้อมูล 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
ทำแผนที่การฝังคำย่อยแบบ monolingual ลงในพื้นที่ส่วนกลางโดยใช้ VECMAP รุ่น ที่ไม่ได้รับการดูแล เนื่องจากเราไม่ต้องการพึ่งพาพจนานุกรมเมล็ดพันธุ์หรือคำที่เหมือนกัน (ย่อย) โคลน GitHub repo ของ (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
แยกการจัดตำแหน่ง subword จากการฝังคำย่อยที่แมป:
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
สร้างคำศัพท์ใหม่สำหรับภาษาเป้าหมาย (เพื่อให้การจัดตำแหน่ง subwords ชี้ไปที่การฝังเดียวกันใน 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~init_weight.py ด้วย --prob None การตั้งค่าสถานะjoint : ข้ามการแม็พ subword และขั้นตอนแรกของการยึดให้เรียกใช้สคริปต์ extract_alignments.py ด้วย - --similarity surface_form และไม่มี--initialize~create_new_vocabs.py ด้วย --model_type joint Flag และสคริปต์ init_weight.py ด้วย --prob None Flagramen : ข้ามขั้นตอนข้างต้นดู Ramen เกี่ยวกับวิธีการสร้างเวกเตอร์ probabilty (เรายังพิมพ์ตัวพิมพ์เล็ก) และเรียกใช้สคริปต์ init_weight.py ด้วยธงที่ถูกต้อง --prob และ tokenizer ดั้งเดิม (เช่น --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
เพื่อให้ได้เมทริกซ์ความคล้ายคลึง
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
ในที่สุดเพื่อแยกการจัดตำแหน่งให้สร้างคำศัพท์ใหม่และเริ่มต้นเลเยอร์ฝังของโมเดลเป้าหมาย Run:
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 Regatories
หากคุณใช้ repo นี้ในการวิจัยของคุณโปรดอ้างอิงกระดาษ:
@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}
}