Este repositorio contiene código fuente para nuestro documento de hallazgos EMNLP 2021: mapeo y anclaje por subvenciones en todos los idiomas.
En nuestro artículo proponemos un método novedoso para construir vocabularios de subvenciones bilingües. Identificamos falsos positivos (subvenciones idénticas con diferentes significados en todos los idiomas) y falsos negativos (diferentes subvenciones con significados similares) como limitación de vocabularios de subvenciones construidos conjuntamente. Smala extrae alineaciones de subvenciones utilizando una técnica de mapeo de última generación no supervisada y las utiliza para crear anclajes interlingües basados en similitudes de subvenciones.
Primero aprendemos subfrenciones por separado para cada idioma y luego capacitamos los incrustaciones correspondientes. Luego aplicamos un método de mapeo para obtener puntajes de similitud entre los incrustaciones, que usamos para extraer alineaciones entre las subvenciones de los dos idiomas. Finalmente vinculamos los parámetros de las subvenciones alineadas para crear anclajes durante el entrenamiento.
Crear entorno (opcional): idealmente, debe crear un entorno para el proyecto.
conda create -n smala_env python=3.7.9
conda activate smala_env
Instale Pytorch 1.6.0 :
conda install pytorch==1.6.0 torchvision==0.7.0 -c pytorch
Clon el proyecto:
git clone https://github.com/GeorgeVern/smala.git
cd smala
Luego instale el resto de los requisitos:
pip install -r requirements.txt
Instalación de herramientas (*) necesarias para la extracción de datos, preprocesamiento y alineación:
bash install tools.sh
(*) Tendrá que cambiar la línea 66 desde WIKIExtractor/wikiextractor.py script: from .extract -> from extract , de lo contrario obtendrá un error de importación relativo.
Descargar y preprocesar datos de wikipedia y aprender el idioma específico para inglés (EN) y otro idioma, por ejemplo, griego (EL):
bash get-mono-data.sh en
bash get-mono-data.sh el el-tokenizer
Aprenda incrustaciones de subvención para cada idioma:
bash learn_subw_embs.sh en
bash learn_subw_embs.sh el el-tokenizer
Mapee la subvención monolingüe incrustaciones en un espacio común utilizando la versión no supervisada de VECMAP, ya que no queremos confiar en diccionarios de semillas o palabras idénticas (sub). Clon el repositorio de GitHub de (VECMAP) y luego ejecute:
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
Extraer alineaciones de subvenciones de los incrustaciones de subvención asignada:
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
Cree un nuevo vocabulario para el lenguaje de destino (de modo que las subvenciones alineadas apunten a la misma incrustación en ambos Langauges) en función de las alineaciones:
python3 utils/create_new_vocabs.py --tgt_tokenizer el-tokenizer --model_type ours --alignment_dir alignments/en-el
Inicializar la capa de incrustación del modelo objetivo:
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
Los pasos anteriores sirven para emplear SMALA con inicialización adicional de las subvenciones no alineadas ( ours+align en el documento). Para comparar con los otros modelos que se incluyen en el documento, debe modificar estos pasos:
ours : como arriba pero ejecute el script extract_alignments.py sin la bandera--initialize~init_weight.py con el indicador --prob None .joint : omita el mapeo de subvenciones y el primer paso de anclaje, ejecute el script extract_alignments.py con la --similarity surface_form y sin el--initialize~create_new_vocabs.py con el indicador --model_type joint y el script init_weight.py con el indicador --prob None .ramen : omita los pasos anteriores, vea el ramen sobre cómo crear el vector probabilioso (también en minúsculas) y ejecute el script init_weight.py con el indicador correcto --prob y el tokenizer original (por ejemplo, --tgt_vocab el-tokenizer/vocab.txt ) Nuestro método también puede explotar datos paralelos (en el documento utilizamos datos de Europarl y Naciones Unidas). Para hacerlo, primero debe descargar (por ejemplo en data/para/en-el ) y preprocesos (tokenizar y minúsculas) un corpus paralelo. Luego corre:
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
Luego corre 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
Para obtener la matriz de similitud del clon de salida de alineación rápida, el repositorio de ramen y la ejecución:
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
Finalmente, para extraer alineaciones, cree un nuevo vocabulario e inicialice la capa de incrustación del modelo de destino, ejecute:
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
Para transferir una LM previa a un nuevo idioma usando 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
Para ajustar el LM transferido en xnli (en inglés) Run:
(Descargue los archivos XNLI 1.0 y XNLI-MT 1.0 desde el repositorio XNLI y descózalos dentro de la carpeta 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
A prueba de disparo cero en el idioma de destino (por ejemplo, griego) Ejecutar:
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
Para reproducir nuestros resultados, use la semilla 12 para el entrenamiento LM y las semillas 12 , 93 , 2319 , 1210 y 21 para el ajuste fino xnli.
¡Nos gustaría agradecer a la comunidad por lanzar su código! Este repositorio contiene código de Huggingface y de los repositorios Ramen, VECMAP, XLM y Simalign.
Si usa este repositorio en su investigación, cite el documento:
@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}
}