test woche 4 - mkappus1/DatenmanagementMTHS24 GitHub Wiki
Semana 4. Creación de corpus paralelos (III). Alineación de sitios web descargados. mtuoc edited this page Jun 7, 2024 · 8 revisions
- Introducción
Esta semana vamos a repasar la alineación automática de documentos alineando el sitio web que descargamos la semana pasada. Además, aprenderemos también a buscar segmentos paralelos en corpus comparables. 2. Lectura recomendada
Esta semana os recomiendo una lectura sobre la creación del corpus CCMatrix, ya que se basa en la búsqueda automática de pares de segmentos traducidos en corpus no paralelos.
En este apartado vamos a repasar la alineación de documentos a partir de la web descargada la semana passada. Además de descargarla, también la pasamos a texto y obtivimos dos directorios, uno con todos los archivos de texto en inglés y otro con todos los archivos en español. Podéis descargar directamente estos archivos de los siguentes enlaces:
Archivos en inglés: [lpg.uoc.edu/seminarioTAN/semana_3/text-en.zip](http://lpg.uoc.edu/seminarioTAN/semana_3/text-en.zip)
Archivos en español: [lpg.uoc.edu/seminarioTAN/semana_3/text-es.zip](http://lpg.uoc.edu/seminarioTAN/semana_3/text-es.zip)
Y descomprimirlos, o utilizar los que habéis generado vosotros.
Si os fijáis, los nombres de los archivos en inglés y en castellano son los mismos y sólo difieren en -en.txt (para los ingleses) y -es.txt (para los españoles).
Ahora vamos a repasar cada uno de los pasos de la alineación con estos archivos:
Segmentación
Alineación
Selección de los segmentos
Pondré todos los pasos necesarios, incluso la instalación de los prerequisitos, pero recordad que si tenéis los programas descargados y los prerequisitos instalados, no es necesario volverlo a hacer. 3.1. Segmentación
Para hacer la segmentación podemos utilizar MTUOC-segmenter. Para obtenerlo podéis escribir:
git clone https://github.com/mtuoc/MTUOC-segmenter.git
Con los archivos hay un requirements.txt. Podéis instalar todos los prerequisitos escribiendo:
sudo pip3 install -r requirements.txt
Como queremos segmentar todos los archivos de un directorio, utilizaremos el programa MTUOC-segmenterDIR.py
python3 MTUOC-segmenterDIR.py -i text-en -o seg-en -s segment.srx -l English -p
y
python3 MTUOC-segmenterDIR.py -i text-es -o seg-es -s segment.srx -l Spanish -p
Ahora en los directorios seg-en y seg-es tendremos los textos segmentgados en inglés y español respectivamente. Son muchos archivos a segmentar, así que paciencia, que puede tardar un ratito (no demasiado) 3.2. Alineación
Para alinear los archivos utilizaremos hunalign. Dispones de este programa y otros programas que facilitan la tarea en MTUOC-segmenter. Obtened los programas haciendo:
git clone https://github.com/mtuoc/MTUOC-aligner.git
Para alinear los archivos es recomendable disponer de un diccionario de alineación. El diccionario inglés-español lo podéis obtener haciendo:
wget https://raw.githubusercontent.com/aoliverg/hunapertium/main/hunapertium-en-es.dic
Ahora para hacer la alineación crearemos un archivo batch mediante el programa MTUOC-create-batchfile.py:
python3 MTUOC-create-batchfile.py --dirSL seg-en --dirTL seg-es --dirALI ali-en-es --batchfile batchEnEs.txt --r1 en.txt --r2 es.txt
En pantalla probablemente veréis algo así (puede diferir si utilizáis vuestra propia descarga)
*** a624013-en.txt *** a624014-en.txt *** a624015-en.txt *** appendixa-en.txt *** appendixb-en.txt *** lowvision -en.txt *** webevaldownload-en.txt *** webeval_transcript-en.txt
Estos son los archivos en inglés de los cuales no ha encontrado el equivalente en español y que por lo tanto no se alinearán.
Ahora podemos hacer la alineación escribiendo:
./hunalign -batch hunapertium-en-es.dic -text -utf -realign batchEnEs.txt
Como que hay muchos documentos a alinear, es posible que el proceso dure un buen rato. Cuando acabe en el directorio ali-en-es tendremos todas las alineaciones. 3.3. Selección de los segmentos
Ahora seleccionaremos las alineaciones con un índice de confianza superior a 0 mediante el script selectAlignmentsDir.py escribiendo:
python3 selectAlignmentsDir.py -i ali-en-es -o medline-eng-spa.txt -c 0
En el archivo medline-eng-spa.txt tendremos el resultado de la alineación. Podemos contar los segmentos haciendo:
wc -l medline-eng-spa.txt 215768 medline-eng-spa.txt
Recordad que podemos eliminar los segmentos repetidos escribiendo:
cat medline-eng-spa.txt | sort | uniq | shuf > medline-uniq-eng-spa.txt
Y ahora podemos contar los resultados:
wc -l medline-uniq-eng-spa.txt
59835 medline-uniq-eng-spa.txt
Si os fijáis, el número de segmentos se ha reducido muchísimo. Inspeccionad el archivo para ver si los resultados de la alineación son satisfactorios.
Si los resultados son malos, se puede repetir la selección de los segmentos con un índice de confianza mayor. 4. Búsqueda de segmentos paralelos en corpus no paralelos
Hasta ahora hemos alineado documentos paralelos, es decir, documentos en la que la mayoría de segmentos del documento en una lengua también están en el documento de la otra lengua. Los programas que hemos visto son capaces de detectar segmentos que falta, e incluso buscar alineaciones con relaciones diferentes de 1:1.
En este apartado veremos una técnica que permite buscar si en dos documentos que no son paralelos, existen segmentos que son equivalentes de traducción entre ellos. Esto es posible hacerlo mediante los llamados sentence embeddings, que es un concepto similar a los word embeddings, pero que en lugar de representar una palabra con un vector, representa toda una oración. Para esta tarea utiliaremos modelos de sentence embeddings multilingües, que permiten representar oraciones en diferentes lenguas en un mismo espacio vectorial. De esta manera, oraciones que estén próximas en el espacio vectorial, tendrá muchas posibilidades de ser equivalentes de traducción.
Los pasos para buscar segmentos equivalentes de traducción en corpus no paralelos son los siguientes:
Disponemos de un archivo con segmentos en una determinada lengua (L1) y otro con segmentos en otra lengua (L2)
Representamos los segmentos de cada archivo mediante un modelo de sentence embeddings multilingüe.
Comparamos los vectores resultantes correspondientes a los segmentos en L1 con todas las representaciones vectoriales de los segmentos en L2.
Si un segmento en L1 tiene un segmento L2 con vectores suficientemente similares, estos segmentos en L1 y L2 probablemente serán equivalentes de traducción.
Este proceso lo podemos hacer con los programas MTUOC-bitext_mining.py y MTUOC-bitext_mining-GPU.py del repostorio https://github.com/mtuoc/MTUOC-aligner. Los dos programas son el mismo, pero el segundo permite utilizar unidades GPU. El proceso de representación en vectores y la búsqueda de vectores similares tiene un gran coste computacional, por lo que se hace necesario en muchas ocasiones utilizar unidades GPU.
Para probar estos alorimos utilizaremos el resultad de la conversión a texto de la descarga de medline con el programa genérico, que si recordáis creaba dos archivos de texto, uno con todos los segmentos en inglés y otro con todos los segmentos en español. Podéis descargar estos archivos de los siguientes enlaces:
http://lpg.uoc.edu/seminarioTAN/semana_3/text-en.txt
http://lpg.uoc.edu/seminarioTAN/semana_3/text-es.txt
wget http://lpg.uoc.edu/seminarioTAN/semana_3/text-en.txt
wget http://lpg.uoc.edu/seminarioTAN/semana_3/text-es.txt
Eliminaremos los segmentos repetidos de estos archivos:
cat text-en.txt | sort | uniq | shuf > text-uniq-en.txt cat text-es.txt | sort | uniq | shuf > text-uniq-es.txt
Y ahora podremos ejecutar el programa de la siguiente manera:
python3 MTUOC-bitext_mining.py text-uniq-en.txt text-uniq-es.txt aliSBERT-uniq-brut-en-es.txt
(quizás os falte algún prerequisito, así que si os da error instaladlo: sentence_transformes y faiss-cpu, si no disponéis de GPU)
EL proceso sin GPU es bastante lento, así que paciencia.
Podéis descargar el resultado directamente de: http://lpg.uoc.edu/seminarioTAN/semana_4/aliSBERT-uniq-brut-eng-spa.txt
La alineación consiste en el segmento en la L1, tabulador, el segmento en la L2, tabulador y un índice de confianza. Los resultados están ordenados por este índice de confianza.
Aquí es importante hacer una inspección visual. Abrid el archivo de alineación con un editor de textos e id bajando hasta que los resultados sean malos para determinar el índice más bajo a partir del que rechazaremos los resultados. Después podréis utilizar el programa selectAlignmentsFile.py para seleccionar los segmentos con un índice superior al encontrado.
Fijaos también que hay alineaciones de segmentos L1 - L2, en el ejemplo, inglés - inglés. Esto es así porque han aparecido estos segmentos en los textos españoles. Por ahora consideradlos una buena alineación. En la semana 6 aprenderemos a limpiar corpus y a comprobar automáticamente la lengua de los segmentos.