Tutorial: Creación de corpus comparables a partir de la Wikipedia - mtuoc/tutorials GitHub Wiki
1. Introducción
Este tutorial lo dedicaremos a aprender a crear corpus comparables a partir de la Wikipedia. Este puede ser un recurso muy interesante, ya que esta enciclopedia está en muchos idiomas y habla de muchísimos temas.
2. Lectura recomendada
En este tutorial os recomiendo la lectura de un artículo que habla de cómo se ha creado el corpus Wikimatrix, ya que tiene cierta relación con lo que vamos a hacer nosotros.
3. Wikipedia
La Wikipedia es una enciclopedia colaborativa que está disponible en unas 300 lenguas diferentes. Sobre la Wikipedia hay que tener en cuenta lo siguiente:
-
Las wikipedias en cada lengua son independientes. Aunque dos wikipedias tengan un artículo sobre el mismo tema no significa que sean traducciones. Los artículos se generan de manera independiente, aunque es cierto que a menudo se parte de la traducción de un artículo en otra lengua. Por lo tanto no se puede esperar que los artículos sobre el mismo tema en dos lenguas vayan a ser traducciones.
-
Los artículos de la Wikipedia tienen un enlace interlingüístico, de manera que a partir del artículo en una lengua se pueden ir directament al mismo artículo en otra lengua.
-
Los artículos están clasificados por temas en base a una serie de categorías. Estas categorías en principio son libres, pero existen una serie de categorías muy utilizadas que suelen ser comunes. Estas categorías, además, pueden estar relacionadas con áreas de conocimiento. Mira: Wikipedia:Contents/Categories.
-
Hay proyectos que convierten los contenidos de la Wikipedia en bases de datos, por ejemplo dBPedia
-
Todo el contenido de la Wikipedia es descargable mediate los dumps. Son archivos muy voluminosos, en la segunda parte de este tutorial aprenderemos a trabajar con estos archivos.
4. Descarga de artículos versus uso de dumps
Para crear los corpus tendremos dos opciones diferenciadas:
-
Bajar artículo a artículo las páginas de interés. Esta forma es adecuada para crear pequeños corpus con un conjunto limitado de artículos. El problema es que hacemos peticiones masivas a la Wikipedia y esto hace que abusemos de su tráfico de datos, por lo que es una práctica poco recomendada por la Wikipedia misma. Podríamos decir que si tenemos que bajar hasta 500 artículos, esta práctica sería adecuada (es una cifra orientativa).
-
Utilizar los dumps de la Wikipedia, ya que bajando un único archivo y procesándolo,podremos crear corpus con cualquier número de activos sin perjudicar a los servidores de la Wikipedia. En este caso el problema es que lo archivos dump son entre muy grandes y realmente enormes, dependiendo de la versión lingüística de la Wikipedia que necesitemos. Además, antes de crear los corpus tendremos que preprocesar estos dumps (creando una base de datos), para que la búsqueda de archivos por título se rápida. Estre preprocesamiento puede durar entre horas y días, dependiendo otra vez de la versión lingüística de la Wikipedia con la que queramos trabajar. Además, para utilizar esta opción necesitaremos gran cantidad de disco libre en nuestro ordenador.
En el siguiente apartado veremos los pasos para la creación de corpus comparables a partir de la Wikipedia y observaremos que algunos pasos son comunes para las dos estrategias.
5. Pasos para la creación de corpus comparables a partir de la Wikipedia
1- Creación de la lista de artículos a descargar. Esta creación se puede hacer de manera manual, pero aprenderemos a crearla de manera automática a partir de una serie de categorías de nuestro interés. Para hacer este paso necesitamos una base de datos espefíca que podremos descagar o crear nosotros mismos. Explicaremos también el proceso de creación, pero habitualmente no es necesario hacerlo, ya que podréis obtener fácilmente una versión relativamente reciente de la base de datos necesaria.
2- Obtención de los artículos seleccionados. Como hemos comentado, esto lo podremos hacer de dos maneras
2a- Mediante la descarga de los artículos
2b- Mediante los dumps de la Wikipedia. Esta acción requerirá dos pasos: 1) Creación de la base de datos a partir del archivo dump; 2) Obtención de los textos a parti de la base de datos.
1. Creación de la lista de artículos a descargar
Para crear la lista de categorías y artículos a descargar necesitamos una base de datos que se calucla a partir de ciertos archivos del dump de la Wikipedia inglesa https://dumps.wikimedia.org/enwiki/ (concretamente los archivos langlinks.sql.gz and pages-articles.xml.bz2). Al final de este tutorial se explica cómo crear esta base de dados, aunque en la mayoría de los casos no sera necesario, ya que se puede descargar la base de datos ya creada de http://lpg.uoc.edu/CCWikipedia/CPfromWiki-20250301.sqlite.
Una vez disponemos de la base de datos podemos utilizar el programa createWikipediaDatabase (que está disponible en versión en línea de comandos y en versió con interfaz gráfica de usuario en https://github.com/mtuoc/MTUOC-Wikipedia.
La versión en Terminal dispone de la versión -h que ofrece la ayuda del programa:çç
python createLists.py -h
usage: createLists.py [-h] -d DATABASE -c CATEGORIES --depth DEPTH --lang LANG [-cl CATEGORY_LIST] [-tl TITLE_LIST]
Create category and title lists from a database.
options:
-h, --help show this help message and exit
-d DATABASE, --database DATABASE
Path to the SQLite database file.
-c CATEGORIES, --categories CATEGORIES
Comma-separated list of categories to start with.
--depth DEPTH Depth of category relations.
--lang LANG Language code.
-cl CATEGORY_LIST, --category_list CATEGORY_LIST
Output file for the category list.
-tl TITLE_LIST, --title_list TITLE_LIST
Output file for the title list.
Con la opción -d
indicamos la base de datos descargada o creada, por ejemplo CPfromWiki-20250301.sqlite.
Con la opción -c
o `--categories`` debemos indicar una categoría o varias, separadas por "," que nos interesen para la descarga. Las categorías se deben indicar en inglés y un buen lugar para explorarlas es https://en.wikipedia.org/wiki/Outline_of_academic_disciplines.
Con la opción --depth
debemos indicar la profundidad de las categorías, es decir, si queremos incluir subcategorías (depth 2), subsubcategorías (depth 3), etc. Aunque las categorías de la Wikipedia son libres , el proyecto dbPedia ha organizado las categorías por niveles y esta información se utiliza para crear la lista de categorías.
Con --lang
indicamos la lengua con la que queremos trabajar.
Con -cl
indicamos el archivo en el que queremos que se guarde la lista de categorías que se ha generado.
Con -tl
indicamos el archivo en el que queremos que se guarde la lista de artículos que se ha generado.
Por ejemplo:
python createLists.py -d CPfromWiki-20250301.sqlite -c Medicine --depth 3 --lang es -cl categories-Medicine-spa.txt -tl titles-medicine-spa.txt
Si abrimos el archivo que contiene las categorías observaremos dos cosas: (1) las categorías están en inglés; (2) hay un total de 2.272 categorías. Si ahora abrimos el archivo que contiene los título veremos: (2) que están en español (ya que hemos indicado --lang es); (2) y que hay un total de 12.637 títulos.
Estos archivos se pueden editar en cualquier editor de textos y añadir o eliminar títulos.
Si queremos tener la lista de más de una categoría las podemos indicar separadas por comas:
python createLists.py -d CPfromWiki-20250301.sqlite -c Medicine,Health --depth 3 --lang es -cl categories-Medicine-spa.txt -tl titles-medicine-spa.txt
Este mismo programa se ofrece en versión visual, createLists-GUI, que presenta la siguiente interfaz que pide los mismo parámetros:
Cuando hacemos clic en Create lists! nos ofrece también el número de categorías y artículos.
Ahora ya podremos descargar la lista de artículos, pero si queremos obtener un corpus comparable en dos lenguas necesitaremos tener la lista de artículos en la otra lengua. Esto lo podemos hacer de dos maneras:
-
Crear una lista independiente de categorías y artículos para la otra lengua.
-
Traducir la lista de artículos a la otra lengua. Con traducir nos referimos a recuperar automáticamente los títulos de los artículos en la otra lengua, si es que existe.
Cada una de estas estrategias tiene sus ventajas e inconvenientes. Si una de las dos Wikipedias es mucho más grande que la otra, la opción 1 puede crear listas de artículos muy descompensadas. En este caso es mejor la estrategia 2, pero empezando por la lengua que tenga una Wikipedia menor y "traducir" los títulos a la otra lengua.
Podemos traducir la lista de títulos con el programa translateTitleList, que dispone de la opción -h
para mostrar la ayuda.
python translateTitleList.py -h
usage: translateTitleList.py [-h] -d FILENAME -i INPUTFILE --sl SL --tl TL -o OUTPUTFILE
Translates a list of wikipedia titles
options:
-h, --help show this help message and exit
-d FILENAME, --database FILENAME
The CCW sqlite database to use.
-i INPUTFILE, --input INPUTFILE
The text file containing the list of titles to translate
--sl SL The source language code.
--tl TL The target language code.
-o OUTPUTFILE, --output OUTPUTFILE
The path of the output file.
Para traducir la lista de artículos creada anteriormente al inglés podemos escribir:
python translateTitleList.py -d CPfromWiki-20250301.sqlite -i titles-medicine-spa.txt --sl es --tl en -o titles-medicine-eng.txt
Es posible que la primera vez que se ejecute sobre una base de datos tarde un poco más ya que crea algún índice necesario para acelerar el proceso. En este caso la pantalla muestra:
Verifying indexes.
Creating index: titles_title_idx
Creating index: langlinks_ident_idx
Creating index: langlinks_title_idx
Este programa también se ofrece en versión con interfaz gráfica de usuario, translateTitleLis-GUI:
2. Obtención de los artículos
2.a. Descarga de los artículos
Esto lo podemos hacer con el programa downloadWikipediaArticles, que ofrece la ayuda con la opción -h
python downloadWikipediaArticles.py -h
usage: downloadWikipediaArticles.py [-h] --tl TITLELIST --lang LANG -o OUTDIR
Script for the creation of parallel corpora from Wikipedia
options:
-h, --help show this help message and exit
--tl TITLELIST The file containing the list of titles to download.
--lang LANG The language (two letter ISO code used in Wikipedia).
-o OUTDIR, --output OUTDIR
The path to the output dir where the article files will be stored (if it does'nt exist, it is
created).
Por ejemplo, para descargar los artículo en español, podemos escribir:
python downloadWikipediaArticles.py --tl titles-medicine-spa.txt --lang es -o medicine-spa
y para obtener los artículos en inglés:
python downloadWikipediaArticles.py --tl titles-medicine-eng.txt --lang en -o medicine-eng
Este programa también se ofrece e una versión con una interfaz gráfica sencilla: downloadWikipediaArticles-GUI:
2.b. Conversión de los dumps a texto
Podemos obtener el texto de los artículos de la Wikipedia a partir de los dumps. Para ello utilizaremos también la lista de títulos que hemos obtenido en los pasos anteriores. Para hacer este paso de creación eficiente a partir de los dumps, se tiene que convertir el dump de la Wikipedia a una base de datos SQLite que tiene los títulos y el texto de los artículos. Se puede crear fácilmente esta base de datos con el programa createWikipediaDatabase, que dispone de la opción -h
que muestra la ayuda:
python createWikipediaDatabase.py -h
usage: createWikipediaDatabase.py [-h] --dump DUMP --database DATABASE
Processes a Wikipedia dump to create a SQLite database with titles and texts.
options:
-h, --help show this help message and exit
--dump DUMP Wikipedia dump file in .bz2
--database DATABASE SQLite database
Únicamente tenemos que indicar el dump que queremos utilizar con la opción --dump
y el nombre que queremos dar a la base de datos resultante mediante la opción --database
. Por ejemplo:
python createWikipediaDatabase.py --dump eswiki-20250301-pages-articles.xml.bz2 --database eswiki-20250301.sqlite
También existe una versión de este programa con una interfaz gráfica sencilla, createWikipediaDatabase-GUI, que cuando se pone en marcha muestra la siguiente interfaz que pide los mismos parámetros:
Es importante tener en cuenta que el proceso de creación de la base de datos pueder durar horas, dependiendo del tamaño del dump de la Wikipedia,
Una vez disponemos de la base de datos de la Wikipedia podemos obtener los textos de los artículos con el programa wikipedia2textByTitles que dispone de la opción -h
que proporciona la ayuda:
python wikipedia2textByTitles.py -h
usage: wikipedia2textByTitles.py [-h] -d DATABASE -o OUTDIR [-t TITLESFILE]
Script to convert Wikipedia dumps to text files from a list of titles
options:
-h, --help show this help message and exit
-d DATABASE, --database DATABASE
The wikipedia database create from de dump file.
-o OUTDIR, --outdir OUTDIR
The output directory.
-t TITLESFILE, --titlesfile TITLESFILE
A file where the converted article titles will be stored. By default titles-list.txt.
donde con la opción -d
indicamos la base de datos que acabamos de crear a partir del dump de la Wikipedia; con -o
indicamos el directorio de salida donde se guardará un archivo por artículo. El nombre del archivo coincide con el del título. Con la opción -t
indicamos el archivo que contiene los títulos a descargar. Por ejemplo:
python wikipedia2textByTitles.py -d enwiki-20250301.sqlite -o directorio -t listatitulos.txt
Este programa también tiene una variante visual, wikipedia2textByTitles-GUI, que ofrece la siguiente interfaz que pide los mismos parámetros:
3. Pasos adiciones
Hasta ahora hemos obtenido un directorio que contiene un archivo de texto por cada artículo relevante de la Wikipedia en la lengua escogida. Ahora nos interesará obtener un único archivo de texto que contenga todos los segmentos de estos archivos. Para ello haremos lo siguiente:
- Segmentar todos los archivos del directorio. Lo podemos hacer con los programas del repositorio [MTUOC-segmenter] (https://github.com/mtuoc/MTUOC-segmenter)
- Concatenar todos los archivos del directorio y eliminar repetidos. Esto se puede hacer fácimente en terminal con intrucciones de Unix o bien con los programas del repositorio MTUOC-utils.
Ahora ya tenemos un corpus de la temática y la lengua escogido. Si repetimos todos los pasos para la misma temática pero en otra lengua, dispondremos de un corpus comparables entre las dos lenguas.
Recordad que es posible buscar los segmentos que son equivalentes de traducción en un corpus comparable. Esto se puede hacer con el programa MTUOC-bitext_mining del repositorio MTUOC-aligner (o las variantes para GPU o con GUI). De esta manera obtendremos un corpus paralelo a partir de uno comparable. Este corpus comparable se tendrá que limpiar y/o realizar un proceso de rescoring.