OLD‐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. Creación de corpus comparables con CCWikipedia
Para esta parte de la actividad vamos a utilizar https://github.com/aoliverg/CCWikipedia. En el wiki se explica con detalle esta aplicación. Como veréis, hay una versión con interfaz visuals. Podéis utilizar esta, pero os aconsejo utilizar la versión en Terminal, ya que la podréis utilizar incluso en servidores sin interfaz gráfica.
Recordad que antes de empezar se tiene que obtener la base de datos CPfromWiki.sqlite. ¡No la creéis vosotros todavía, aunque se pueda hacer). Para descargadla haced:
wget http://lpg.uoc.edu/smarterp/CPfromWiki.sqlite
Ahora podemos obtener CCWikipedia haciendo:
git clone https://github.com/aoliverg/CCWikipedia.git
Utilizaremos el programa createCCWCorpus.py que ofrece la opción -h para obtener la ayuda:
python3 createCCWCorpus.py -h
usage: createCCWCorpus.py [-h] -d FILENAME -c CATEGORIA --level LEVEL --lang LANG -o OUTDIR [-a ARTICLELIST]
Script for the creation of parallel corpora from Wikipedia
options:
-h, --help show this help message and exit
-d FILENAME, --database FILENAME
The CCW sqlite database to use.
-c CATEGORIA, --categories CATEGORIA
The categories to search for (a category or a list of categories separated by ,
--level LEVEL The category level depth.
--lang LANG The language (two letter ISO code used in Wikipedia.
-o OUTDIR, --output OUTDIR
The name of the sqlite database to be created.
-a ARTICLELIST, --articlelist ARTICLELIST
The name of the text file containing the list of files.
Si queremos descargar los artículos de medicina en inglés y hasta dos niveles por debajo podemos escribir:
python3 createCCWCorpus.py -d CPfromWiki.sqlite -c Medicine --level 2 --lang en -o medicine-eng -a medicine-eng.txt
Importante, el directorio de salida debe existir, así que tenemos que crearlos con:
mkdir medicine-eng
mkdir medicine-spa
Por pantalla aparecerá la lista de artículos (que también se guardará en el archivo medicine-eng.txt) y el total de artículos. Para confirmar que queremos descargarlos se tiene que hacer clic en Y.
...
Desmethylchlorotrianisene
Alpha-Hydroxyetizolam
Cannabielsoin
Deuterated drug
TOTAL PAGES 13554
Download? (Y/N)
Y ahora para el español (fijaros que la categoría o categorías se tienen que dar en inglés):
python3 createCCWCorpus.py -d CPfromWiki.sqlite -c Medicine --level 2 --lang es -o medicine-spa -a medicine-spa.txt
TOTAL CATEGORIES 350
TOTAL PAGES 3707
Download? (Y/N)
Poned a descargar estos artículos o los correspondientes a las lenguas y temas que más os interesen.
Una vez descargados segmentaremos todos los archivos de los directorios correspondientes a la lengua de partida y a la de llegada:
python3 MTUOC-segmenterDIR.py -i medicine-eng -o medicine-seg-eng -s segment.srx -l English
python3 MTUOC-segmenterDIR.py -i medicine-spa -o medicine-seg-spa -s segment.srx -l Spanish
Ahora concatenamos todos los segmentos de cada lengua y eliminamos repetidos:
cat ./medicine-seg-eng/* | sort | uniq | shuf > medicine-uniq-eng.txt
cat ./medicine-seg-spa/* | sort | uniq | shuf > medicine-uniq-spa.txt
Podemos contar los segmentos obtenidos:
wc -l medicine-uniq-*
742062 medicine-uniq-eng.txt
185324 medicine-uniq-spa.txt
Y ahora podemos "alinearlos", o más bien buscar posibles segmentos que sean equivalentes de traducción. Podemos hacerlo:
Si tenemos GPU en nuestro ordenador:
python3 MTUOC-bitext_mining-GPU.py medicine-uniq-eng.txt medicine-uniq-spa.txt medicine-aligned-brut-eng-spa.txt
Si no disponemos de GPU haremos (pero recordad que el proceso puede ser realmente muy lento):
python3 MTUOC-bitext_mining.py medicine-uniq-eng.txt medicine-uniq-spa.txt medicine-aligned-brut-eng-spa.txt
Podéis descargar los resultados de los procesos de los siguientes enlaces:
- Artículos en inglés: http://lpg.uoc.edu/seminarioTAN/semana_5/medicine-eng.zip
- Artículos en español: http://lpg.uoc.edu/seminarioTAN/semana_5/medicine-spa.zip
- Artículos en inglés segmentados: http://lpg.uoc.edu/seminarioTAN/semana_5/medicine-seg-eng.zip
- Artículos en español segmentados: http://lpg.uoc.edu/seminarioTAN/semana_5/medicine-seg-spa.zip
- Resultado de la alineació: http://lpg.uoc.edu/seminarioTAN/semana_5/medicine-aligned-brut-eng-spa.txt
Si observáis el resultado de la alineación, veréis que en las primera posiciones (recordad que el archivo de alineación está ordenado con las alineaciones con índices de confianza mayores en las primeras posicions) ha alineaciones inglés - inglés. Esto se debe a que en los artículos en español hay también segmentos en inglés y por esto se alinean. Pero esto lo podremos filtrar automàticamente mediante técnicas de limpieza de corpus, que veremos la semana que viene.
5. Uso directo de los dumps de la Wikipedia
En el apartado anterior hemos explicado la manera de crear corpus comparables a partir de la Wikipedia mediante un programa específico. El programa utiliza una gran base de datos para sabér qué artículos descargar, pero los artículos se descargan directamente de la Wikipedia. Esto hace que se hagan consultas masivas a la web de la Wikipedia con lo que en el extremos puedes crear un problema para la misma Wikipedia. Para evitar estas consultas masivas se puede trabar directamente con los dumps de la Wikipedia, que son archivos muy grandes que contienen todos los artículos de la wikipedia en una determinada lengua.
Los dumps de la Wikipedia, y de todo el resto de proyectos de Wikimedia, se pueden descargar de https://dumps.wikimedia.org/backup-index.html
Por ejemplo, si queremos bajar la wikipedia Inglesa buscamos en esta página "enwiki" y seguimos el enlace. Podemos hacer lo mismo con la wikipedia española buscando "eswiki". El problema es que estos archivos son ENORMES y por lo tanto la descarga dura un buen rato y además vamos a utilizar mucho espacio de disco.
Para hacer esta parte más ágil, vamos a practicar con dos lenguas que tienen Wikipedias de menor tamaño. Concretamente os propongo trabajar ahora mismo con las Wikipedia en asturiano y en occitano. Todo lo que hagamos será exactamente igual que para Wikipedias más grandes, como la inglesa y la española. Pero las pruebas serán mucho más ágiles con las Wikipedias pequeñas.
Bajamos las Wikipedias:
wget https://dumps.wikimedia.org/astwiki/20240501/astwiki-20240501-pages-articles.xml.bz2
wget https://dumps.wikimedia.org/ocwiki/20240501/ocwiki-20240501-pages-articles.xml.bz2
Los archivos que se descargan están comprimidos en bz2. ¡NO LOS DESCOMPRIMÁIS! Trabajaremos directamente con los archivos comprimidos. Esto es epecialmente importante cuando trabajemos con Wikipedias grandes. Por ejemplo, podemos visualizar el contenido con bzmore o bzcat, en lugar de more y cat.
Observad el contenido de estos archivos. Como podéis ver estos archivos son archivos XML que contienen diversa información sobre los artículos y el texto de los archivos en sí, que está en formato wiki.
5.1. Conversión del dump en archivos de texto
Una vez tenemos los dump nos interesa extraer un archivo de texto para cada uno de los artículos de interés. Quizás nos interese extraer los textos de todos los artículos, o bien nos interesará limitarnos a una serie de categorías.
En el repositorio https://github.com/aoliverg/dumpsWikipedia tenéis disponibles una serie d'scripts que nos facilitarán esta tarea.
El script wikipedia2text.py, que dispone de la opción -h que muestra la ayuda, nos permite convertir un dump de wikipedia en archivos de texto, uno para cada artículo:
python3 wikipedia2text.py -h
usage: wikipedia2text.py [-h] -d DUMP_PATH -l LANGUAGE -o OUTDIR [-c CATEGORIES] [-t TITLESFILE]
Script to convert Wikipedia dumps to text files according to a set of categories
options:
-h, --help show this help message and exit
-d DUMP_PATH, --dump DUMP_PATH
The wikipedia dump.
-l LANGUAGE, --language LANGUAGE
The language code (en, es, fr ...).
-o OUTDIR, --outdir OUTDIR
The output directory.
-c CATEGORIES, --categories CATEGORIES
A file with one category per line.
-t TITLESFILE, --titlesfile TITLESFILE
A file where the converted article titles will be stored. By default titles-list.txt.
Si queremos convertir todo el dump de la wikipedia (adaptad el nombre del dump al que tengáis descargado:
python3 wikipedia2text.py -d astwiki-20240501-pages-articles.xml.bz2 -l ast -o wikipedia-ast/
El directorio de salida, wikipedia-ast en el ejemplo, se creará si no existe y contendrá un archivo de texto por cada artículo. En el archivo titles-list.txt se guardan el título de los archivos descargados. Podemos especificar otro nombre para este archivo con la opción -t.
Ahora bien, en muchos casos nos interesará limitar los artículos convertidos a texto a una serie de categorias. Para ello podemos crear un archivo de texto, por ejemlo categorias.txt, que contenga una categoria por línea. El nombre de la categoría tiene que estar en la lengua correspondiente al dump que estamos tratando. Por ahora cread un archivo de texto categorias.txt que contenga por ejemplo Medicina (si tratáis el dump en asturiano). En el siguiente apartado veremos cómo podemos explorar las categorías en una lengua. Para limitar la conversión a los artículos de la categoria Medicina (o la que tengáis en el archivo categorias.txt podéis escribir:
python3 wikipedia2text.py -d astwiki-20240501-pages-articles.xml.bz2 -l ast -o wikipedia-medicina-ast/ -c categorias.txt
5.2. Exploración de las categorías
Para saber qué categorías poner en el archivo de categorías y así limitar los archivos generados tenemos diversas opciones:
- Opción manual I. La Wikipedia inglesa ofrece una página con categorías organizadas por disciplinas académicas: https://en.wikipedia.org/wiki/Outline_of_academic_disciplines. Si os fijáis en la parte superior, esta misma página está disponible en otras lenguas. Si la lengua que os interesa está entre estas lenguas, podéis obtener información interesante sobre las categorías que os interesan allí.
- Opción manual II. Podéis buscar artículos relacionados con las temática que os interesa, i fijaros en la parte inferior, a qué categorías están relacionadas estas página. Si hacéis clic sobre esa categoría, se abrirá una página de categoría que muchas veces contiene información sobre subcategorías. Explorando todo esto podréis ir generando el archivo de categorías.
- Opción automática: En el mismo repositorio tenemos el programa exploreCategories.py que nos permite explorar las categorías que tienen los artículos que tienen una serie de categorías que queremos explorar. Este programa también dispone de la opción -h que nos muestra la ayuda:
python3 exploreCategories.py -h
usage: exploreCategories.py [-h] -d DUMP_PATH -l LANGUAGE -c CATEGORY -o OUTFILE [--limit LIMIT]
Script to explore categories from a Wikipedia dump
options:
-h, --help show this help message and exit
-d DUMP_PATH, --dump DUMP_PATH
The wikipedia dump.
-l LANGUAGE, --language LANGUAGE
The language code (en, es, fr ...).
-c CATEGORY, --categories CATEGORY
A category or a list of categories separated by :.
-o OUTFILE, --outfile OUTFILE
The output directory.
--limit LIMIT The limit in number of articles found.
Por ejemplo, si queremos ver las categorías asociadas a Medicina, podemos escribir:
python3 exploreCategories.py -d astwiki-20240501-pages-articles.xml.bz2 -l ast -c Medicina --limit 100 -o categorias-medicina-ast.txt
El proceso es bastante lento, por lo que se puede utilizar la ocpión --limit que detiene el proceso cuando ha encontrado un número de páginas con la categoría dada (en el ejemplo 100). Si no se indica ningún límite el programa explora todo el dump. El programa creará el archivo categorias-medicina-ast.txt que contendrá la lista de categorías relacionadas por orden descendente de frecuencia de aparición, por ejemplo:
Medicina
Especialidaes médiques
Bioloxía
Anatomía
Biografíes por actividá
Bioquímica
Fármacos
Ética
Biofísica
Química
Wikipedia:Artículos ensin plantía llistaref
Mitoloxía griega
Llingüística
Premios Nobel
Fisioloxía
Sicoloxía
Antropoloxía
Socioloxía
Por pantalla se ofrece además las categorías junto a su frecuencia:
Medicina 33
Especialidaes médiques 5
Bioloxía 3
Anatomía 2
Biografíes por actividá 1
Bioquímica 1
Fármacos 1
Ética 1
Biofísica 1
Química 1
Wikipedia:Artículos ensin plantía llistaref 1
Mitoloxía griega 1
Llingüística 1
Premios Nobel 1
Fisioloxía 1
Sicoloxía 1
Antropoloxía 1
Socioloxía 1
Este archivo lo podemos editar para adaptarlo a nuestras necesidades y utilizarlo con el programa wikipedia2text.py explicado anteriormente.
En lugar de una única categoría, es posible indicar una sere de categorías separadas por ":", por ejemplo:
python3 exploreCategories.py -d astwiki-20240501-pages-articles.xml.bz2 -l ast -c "Medicina:Anatomía:Especialidaes médiques" --limit 100 -o categorias-medicina-ast.txt