يحتوي هذا المستودع على رمز المصدر لورقة نتائج 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 ، لأننا لا نريد الاعتماد على قواميس البذور أو الكلمات المتطابقة (الفرعية). استنساخ repo 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
قم بإنشاء مفردات جديدة للغة المستهدفة (بحيث تشير الكلمات الفرعية المحاذاة إلى نفس التضمين في كلا 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 in the Paper). للمقارنة مع النماذج الأخرى المدرجة في الورقة التي تحتاجها لتعديل هذه الخطوات:
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 flag.ramen : تخطي الخطوات المذكورة أعلاه ، راجع رامين حول كيفية إنشاء متجه probabilty (نقوم أيضًا بتسجيل الدخول) وقم بتشغيل البرنامج النصي init_weight.py مع العلامة الصحيح- --prob و tokenizer الأصلي (على سبيل المثال- --tgt_vocab el-tokenizer/vocab.txt ) يمكن أن تستغل طريقتنا أيضًا بيانات متوازية (في الورقة نستخدم البيانات من Europarl و United الأمم المتحدة). للقيام بذلك ، يجب عليك أولاً تنزيل (على سبيل المثال في 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
أخيرًا ، لاستخراج المحاذاة ، إنشاء مفردات جديدة وتهيئة طبقة التضمين للنموذج الهدف ، تشغيل:
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}
}