Tutorial: Alineación automática de documentos con hunalign y MTUOC‐autoaligner - mtuoc/tutorials GitHub Wiki

1. Introducción

En este tutorial vamos a aprender a alinear documentos con Hunalign, un programa que tiene ya muchos años pero que se continúa utilizando muy activamente en la creación de corpus paralelos. Es un programa en Terminal que nos permitirá tener un mayor control sobre todo el proceso y alinear un gran número de documentos a la vez de una manera muy ágil. Dado que el proceso de alineación automática con Hunalign requiere realizar diversos pasos manuales anteriores y posteriores al uso de Hunalign, dentro del proyecto MTUOC se ha creado una herramienta denominada MTUOC-autoaligner-hunalign que permite realizar todos los pasos necesarios y configurarlos mediante un archivo yaml.

2. Lectura recomendada

[D. Varga, L. Németh, P. Halácsy, A. Kornai, V. Trón, V. Nagy (2005). Parallel corpora for medium density languages In Proceedings of the RANLP 2005, pages 590-596.]

3. Pasos genéricos de alineación de documentos

En la sección anterior hemos aprendido a utilizar LF-Aligner, un programa que se basa en el famoso programa hunalign. En esta sección vamos a aprender a utilizar directamente hunalign, lo que nos permitirá alinear un gran número de documentos en un solo paso. Pero hunalign, a diferencia de LF-Aligner, únicamente alinia los documentos, pero hay una serie de pasos genéricos que tendremos que realizar nosotros mismos. Los pasos genéricos para la alineación de documentos son:

  1. Conversión de los archivos a texto.
  2. Segmentación de los archivos de texto. En general querremos tener una alineación a nivel de oración o segmento, por lo que será necesario dividir el texto del documento, que de habitualmente está organizado en párrafos, en segmentos u oraciones.
  3. Alineación propiamente dicha, que la realizaremos con hunalign. El programa relacionará los segmentos del archivo original con los segmentos del archivo traducido.
  4. Selección de los segmentos, basada en un índice de calidad que ofrece hunalign para cada segmento.
  5. Conversión de la alineación al formato requerido. Al finalizar el proceso tendremos un archivo de texto tabulado que quizás necesitemos convertir en algún otro formato, como por ejemplo TMX.

MTUOC-autoaligner-hunalign permite realizar los pasos del 2 al 4 de manera automática en un solo paso. Los paso 1 i 5 los tendremos que realizar con programas auxiliares.

Un aspecto muy importante a tener en cuenta para poder alinear una gran candidad de documentos es que los documentos en una y otra lengua o bien:

  • tienen exactamente los mismo nombres, es decir por ejemplo, tenemos el documento en ingles documentoA.docx y su correspondiente en español se llama también documentoA.docx, y de la misma manera para todos los documentos.
  • los nombres difieren en un sufijo (normalmente indicativo de la lengua) antes de la extensió, como por ejemplo cuando tenemos el documento documentoA-eng.docx para el inglés y el documentoA-spa.docx para el español.

4. Archivos necesarios

4.1. Documentos a alinear

En este apartado aprenderemos a alinear unos 260 pares de documentos docx que podéis encontrar en los siguientes archivos comprimidos:

Descarga y descomprime estos archivos.

4.2. Diccionarios de alineación

Hunalign necesita un diccionario de alineación que consiste en palabras o expresiones en la lengua de partida y de llegada separadas por @ (pero con la lengua de llegada en primer lugar). El uso del diccionario es obligatorio, pero en caso de no disponer de uno, se puede utilizar el diccionario vacío null.dic que se distribuye con MTUOC-aligner. Pero el proyecto MTUOC proporciona los siguientes diccionarios:

Diccionarios hunapertium

Estos diccionarios se han creado a partir de los diccionarios de transferencia del sistema de traducción Apertium. Estos diccionarios y los scripts para crearlos se pueden obtener del siguiente repositorio: https://github.com/aoliverg/hunapertium.

Diccionarios a partir de los diccionarios MUSE

También es posible crear los diccionarios de alineación a partir de los diccionarios proporcionados por el proyecto MUSE. En este caso tenemos dos tipos de diccionarios

Diccionarios bilingües entre diversas lenguas

Son los siguientes diccionarios:

src-tgt German English Spanish French Italian Portuguese
German - full train test full train test full train test full train test full train test
English full train test - full train test full train test full train test full train test
Spanish full train test full train test - full train test full train test full train test
French full train test full train test full train test - full train test full train test
Italian full train test full train test full train test full train test - full train test
Portuguese full train test full train test full train test full train test full train test -

Si nos interesa concretamente uno de estos diccionarios podemos descargar la versión full y convertirlo mediante el programa MUSE2Hunalign que se distribuye con MTUOC-aligner. Este programa se distribuye en versión Terminal, que pide como primer parámetro el archivo que contiene el diccionario MUSE y como segundo parámetro el archivo de diccionario de alineación resultante, pro ejemplo:

python MUSE2Hunalign.py en-es.txt dictali-eng-spa.txt

Donde en el archivo dictali-eng-spa.txt tendremos el diccionario de alineación en el formato requerido por Hunalign.

Este programa también se distribuye en versió con una interfaz gráfica sencilla (y en versiones ejecutables para diversos sistemas operativos en la Releases recientes): MUSE2HunalignGUI. Cuando se pone en marcha aparece la siguiente interfaz gráfica:

donde tendremos que indicar el archivo MUSE y el de salida y hacer clic en el botón Process.

Diccionarios entre diversas lenguas y el inglés

El proyecto MUSE nos ofrece también los siguientes diccionarios entre diversas lenguas y el inglés:

LANG to ENG

Afrikaans: full train test Albanian: full train test Arabic: full train test Bengali: full train test
Bosnian: full train test Bulgarian: full train test Catalan: full train test Chinese: full train test
Croatian: full train test Czech: full train test Danish: full train test Dutch: full train test
English: full train test Estonian: full train test Filipino: full train test Finnish: full train test
French: full train test German: full train test Greek: full train test Hebrew: full train test
Hindi: full train test Hungarian: full train test Indonesian: full train test Italian: full train test
Japanese: full train test Korean: full train test Latvian: full train test Littuanian: full train test
Macedonian: full train test Malay: full train test Norwegian: full train test Persian: full train test
Polish: full train test Portuguese: full train test Romanian: full train test Russian: full train test
Slovak: full train test Slovenian: full train test Spanish: full train test Swedish: full train test
Tamil: full train test Thai: full train test Turkish: full train test Ukrainian: full train test
Vietnamese: full train test

Y también entre el inglés y diversas lenguas:

ENG to LANG

Afrikaans: full train test Albanian: full train test Arabic: full train test Bengali: full train test
Bosnian: full train test Bulgarian: full train test Catalan: full train test Chinese: full train test
Croatian: full train test Czech: full train test Danish: full train test Dutch: full train test
English: full train test Estonian: full train test Filipino: full train test Finnish: full train test
French: full train test German: full train test Greek: full train test Hebrew: full train test
Hindi: full train test Hungarian: full train test Indonesian: full train test Italian: full train test
Japanese: full train test Korean: full train test Latvian: full train test Littuanian: full train test
Macedonian: full train test Malay: full train test Norwegian: full train test Persian: full train test
Polish: full train test Portuguese: full train test Romanian: full train test Russian: full train test
Slovak: full train test Slovenian: full train test Spanish: full train test Swedish: full train test
Tamil: full train test Thai: full train test Turkish: full train test Ukrainian: full train test
Vietnamese: full train test

Esto nos permite crear los diccionarios de alineación del inglés a estas lenguas y de estas lenguas al inglés utilizando el programa que hemos visto en el apartado anterior. Pero además, con estos diccionarios podemos crear los diccionarios de alineación entre todas estas lenguas utilizando el programa MUSE2Hunalign-X-en-Y.py. Por ejemplo, si queremos crear el diccionario de alineación entre el croata y el griego descargaremos el diccionario full hr-en.txt y el diccionario el-en.txt y utilizaremos el programa MUSE2Hunalign-X-en-Y.py de la siguiente manera:

python MUSE2Hunalign-X-en-Y.py hr-en.txt el-en.txt dictali-hrv-ell.txt

Este programa también se distribuye con una interfaz gráfica sencilla: MUSE2Hunalign-X-en-Y-GUI, que además está disponible en la Release como ejecutable para diversos sistemas operativos. Al ponerse en marcha aparece la siguiente interfaz gráfica:

en la que seleccionamos los archivos y hacemos clic a Process

5. Pasos de alineación de múltiples documentos

PASO 1. Conversión de los archivos a texto

Los archivos a alinear tienen que estar en formato texto. Este primer paso lo podéis hacer con el programa que prefiráis. Aquí veremos un programa del conjunto de herramientas MTUOC que permite convertir un gran número de formatos a texto: MTUOC-any2text

Todos los detalles sobre cómo utilizar esta herramienta los podéis encontrar en su Wiki, por lo que aquí símplemete reproduciré las instrucciones que tenemos que utilizar para realizar la conversión. Antes de ejectuar los programas no olvides instalar los prerequisitos o bien utilizar la versión ejecutable para vuestro sistema operativo.

PASOS 2,3 y 4. Alineación con MTUOC-autoaligner-hunalig

Este programa nos permite realizar los pasos:

  1. Segmentación de los archivos de texto. En general querremos tener una alineación a nivel de oración o segmento, por lo que será necesario dividir el texto del documento, que de habitualmente está organizado en párrafos, en segmentos u oraciones.
  2. Alineación propiamente dicha, que la realizaremos con hunalign. El programa relacionará los segmentos del archivo original con los segmentos del archivo traducido.
  3. Selección de los segmentos, basada en un índice de calidad que ofrece hunalign para cada segmento.

Su uso es muy sencillo ya que únicamente requiere configurar convenientemente el archivo config.yaml, que es un archivo que se puede editar en cualquier editor de texto y que tiene los siguientes campos:

dirSL: ./2023-text-en
dirTL: ./2023-text-es
dirALI: ./2023-ali-en-es
batchfile: batchfile.txt
srxfile: segment.srx
SLname: English
TLname: Spanish
paramark: True
r1: None
r2: None
alignmentdictionary: hunapertium-en-es.dic
minconfidence: 0
outfile: alineacion-2023-eng-spa.txt
OperatingSystem: Windows
#one of Windows, Linux, MacOS

A continuación ofrecemos la explicación de cada uno de estos parámetros:

  • dirSL: es la ruta al directorio que contine los archivos en la lengua de partida ya convertidos a texto.
  • dirTL: es la ruta al directorio que contine los archivos en la lengua de llegada ya convertidos a texto.
  • dirALI: es la ruta al directorio que contendrá los archivos de alineación para cada par de documentos. Si este directorio no existe, se creará-
  • batchfile: es el nombre del archivo batch que se creará para llevar a cabo la alineación. Normalmente no se utilizará para nada, pero permite la inspección o la reproducción manual de la alineación.
  • srxfile: es la ruta al archivo SRX que contiene las reglas de segmentación que se van a utilizar.
  • SLname: es el nombre de la lengua de partida tal y como aparece en el archivo SRX utilizado.
  • TLname: es el nombre de la lengua de llegada tal y como aparece en el archivo SRX utilizado.
  • paramark: True si se quieren utilizar las marcas de párrafo () en la segmentación; False si no se quieren utilizar. Se recomienda en la mayoría de los casos utilizar True.
  • r1: None si el nombre del archivo en la lengua de partida es el mismo que el de la lengua de llegada. Si no, la parte final del archivo que se tiene que eliminar para que los nombres coincidan. Por ejemplo: eng.docx.
  • r2: None si el nombre del archivo en la lengua de llegada es el mismo que el de la lengua de partida. Si no, la parte final del archivo que se tiene que eliminar para que los nombres coincidan. Por ejemplo: spa.docx.
  • alignmentdictionary: la ruta al diccionario de alineación que vamos a utilizar. Si no se dispone de diccionario de alineación utiliza el diccionario vacía null.dic.
  • minconfidence: el nivel de confianza mínimo para seleccionar una alineación como válida. 0 es una buena opción de partida. Se puede determinar observando alguno de los archivos de alineación individiuales que se encuentran en el directorio indicado. El índice de confianza es el número final de cada línea.
  • outfile: la ruta y nombre de archivo que contendrá la alineación.
  • OperatingSystem: el sistema operativo utilizado (Windows, Linux o Mac)

Una vez configurado el archivo de configuración config.yaml, podemos llevar a cabo la alineación escribiendo en Terminal:

python MTUOC-autoaligner-hunalign.py config.yaml

(el archivo de configuración puede tener otro nombre).

Si no indicamos ningún archivo o bien ejectuamos el programa haciendo doble clic en el explorador de archivos, aparecerá una interfaz gráfica que nos permitirá escoger el archivo de configuración e iniciar el proceso de alineación haciendo clic en el botón Align.

PASO 5. Conversión de la alineación al formato requerido

El programa MTUOC-autoaligner-hunalign proporciona la alineació en formato de texto tabulado. Es importante tener en cuenta que esta alineación puede contener segmentos repetidos. Para eliminar los segmentos repetidos puedes utilizar un terminal de linux escribiendo:

cat alineacion-2023-eng-spa.txt | sort | uniq | shuf > alineacio-2023-uniq-eng-spa.txt

o bien utilizar el programa MTUOC-sort-uniq-shuf-GUI.

No ya para entrenar motores, pero sí quizás para utilizar este corpus paralelo como memoria de traducción en nuestras herramientas de traducción asistida, nos puede interesar convertir la alineación en formato TMX. Para ello podemos utilizar el programa MTUOC-tabtxt2TMX.py. Este programa muestra la ayuda con la opción -h:

python3 MTUOC-tabtxt2TMX.py -h
usage: MTUOC-tabtxt2TMX.py [-h] -i FENTRADA -o FSORTIDA -s L1 -t L2

MTUOC-tabtxt2TMX: A script to convert a parallel corpus in tabbed text into a TMX file.

options:
  -h, --help            show this help message and exit
  -i FENTRADA, --input FENTRADA
                        The input file to convert.
  -o FSORTIDA, --output FSORTIDA
                        Fix some issues in PDF conversion.
  -s L1, --L1code L1    The language code for the source language.
  -t L2, --L2code L2    The language code for the target language.

Para convertir el archivo alineacion-unic-eng-spa.txt a TMX podemos escribir:

python3 MTUOC-tabtxt2TMX.py -i alineacion-2023-unic-eng-spa.txt -o alineacion-2023-eng-spa.tmx -s en-US -t es-ES

Este programa también está disponible en versión con interfaz gráfica y como ejectuable para diversos sitemas operativos: MTUOC-tabtxt2TMX-GUI:

Símplemente tenemos que indicar el archivo de texto tabulado de entrada, el TMX de salida y los códigos de lengua que queremos utilizar y hacer clic al botón Convert!