Tutorial: Creació de corpus comparables a partir de la Wikipedia - mtuoc/tutorials GitHub Wiki

1. Introducció

Aquest tutorial el dedicarem a aprendre a crear corpus comparables a partir de la Viquipèdia. Aquest pot ser un recurs molt interessant, ja que aquesta enciclopèdia està en molts idiomes i tracta molts de temes.

2. Lectura recomanada

En aquest tutorial us recomano la lectura d'un article que parla de com s'ha creat el corpus Wikimatrix, ja que té certa relació amb el que farem nosaltres.

Schwenk, H., Chaudhary, V., Sun, S., Gong, H., & Guzmán, F. (2021, April). WikiMatrix: Mining 135M Parallel Sentences in 1620 Language Pairs from Wikipedia. In Proceedings of the 16th Conference of the European Chapter of the Association for Computational Linguistics: Main Volume (pp. 1351-1361).

3. Viquipèdia

La Viquipèdia és una enciclopèdia col·laborativa disponible en unes 300 llengües diferents. Sobre la Viquipèdia cal tenir en compte el següent:

  • Les Viquipèdies en cada llengua són independents. Encara que dues Viquipèdies tinguin un article sobre el mateix tema, no significa que siguin traduccions. Els articles es generen de manera independent, encara que és cert que sovint es parteix de la traducció d'un article en una altra llengua. Per tant, no es pot esperar que els articles sobre el mateix tema en dues llengües siguin traduccions.

  • Els articles de la Viquipèdia tenen un enllaç interlingüístic, de manera que a partir de l'article en una llengua es pot anar directament al mateix article en una d'altra.

  • Els articles estan classificats per temes basats en una sèrie de categories. Aquestes categories en principi són lliures, però hi ha una sèrie de categories molt utilitzades que solen ser comunes. Aquestes categories, a més a més, poden estar relacionades amb àrees de coneixement. Mira: Wikipedia: Contents/progies.

  • Hi ha projectes que converteixen els continguts de la Viquipèdia en bases de dades, per exemple dBPedia

  • Tot el contingut de la Viquipèdia és descarregable a través dels dumps. Són fitxers molt voluminosos. A la segona part d'aquest tutorial aprendrem a treballar amb ells.

4. Creació de corpus comparables amb CCWikipedia

Per a aquesta part de l'activitat farem servir https://github.com/aoliverg/CCWikipedia. En el wiki s'explica amb detall aquesta aplicació. Com veureu, hi ha una versió amb interfície visual. Podeu utilitzar aquesta, però us aconsello usar la versió a Terminal, ja que la podreu usar fins i tot en servidors sense interfície gràfica.

Recordeu que abans de començar cal obtenir la base de dades CPfromWiki. sqlite. No la creeu vosaltres encara, encara que es pogueu! Per a baixar- la feu:

wget http://lpg.uoc.edu/smarterp/CPfromWiki.sqlite

Ara podem obtenir CCWikipedia fent:

git clone https://github.com/aoliverg/CCWikipedia.git

Usarem el programa createCCWCorpus.py que ofereix l'opció - h per obtenir l'ajuda:

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 volem descarregar els articles de medicina en anglès i fins a dos nivells per sota podem escriure:

python3 createCCWCorpus.py -d CPfromWiki.sqlite -c Medicine --level 2 --lang en -o medicine-eng -a medicine-eng.txt

Important, el directori de sortida ha d'existir, així que els hem de crear amb:

mkdir medicine-eng
mkdir medicine-spa

A la pantalla apareixerà la llista d'articles (que també es desarà en el fitxer medicine- eng.txt) juntament amb el total d'articles. Per confirmar que volem descarregar-los s'ha de fer clic a Y.

...
Desmethylchlorotrianisene
Alpha-Hydroxyetizolam
Cannabielsoin
Deuterated drug
TOTAL PAGES 13554
Download? (Y/N)

I ara per a l'espanyol (fixeu-vos que la categoria o categories s'han de donar en anglè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)

Poseu a descarregar aquests articles o els corresponents a les llengües i temes que més us interessin.

Una vegada descarregats segmentarem tots els fitxers dels directoris corresponents a la llengua de partida i a la d' arribada:

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

Ara concatenarem tots els segments de cada llengua i eliminarem els repetits:

cat ./medicine-seg-eng/* | sort | uniq | shuf > medicine-uniq-eng.txt
cat ./medicine-seg-spa/* | sort | uniq | shuf > medicine-uniq-spa.txt

Podem comptar els segments obtinguts:

wc -l medicine-uniq-*
   742062 medicine-uniq-eng.txt
   185324 medicine-uniq-spa.txt

I ara podem "alinear-los", o més aviat buscar possibles segments que siguin equivalents de traducció. Podem fer-ho:

Si tenim GPU al nostre ordinador:

python3 MTUOC-bitext_mining-GPU.py medicine-uniq-eng.txt medicine-uniq-spa.txt medicine-aligned-brut-eng-spa.txt

Si no disposem de GPU farem (però recordeu que el procés pot ser molt lent):

python3 MTUOC-bitext_mining.py medicine-uniq-eng.txt medicine-uniq-spa.txt medicine-aligned-brut-eng-spa.txt

Podeu descarregar els resultats dels processos dels següents enllaços:

Si observeu el resultat de l'alineació, veureu que en les primeres posicions (recordeu que el fitxer d'alineació està ordenat amb les alineacions amb índexs de confiança més grans a les primeres disposicions) hi ha alineacions anglès - anglès. Això es deu a que en els articles en espanyol hi ha també segments en anglès i per això s'alineen. Però això ho podrem filtrar automàticament mitjançant tècniques de neteja de corpus, que veurem la setmana que ve.

5. Ús directe dels dumps de la Viquipèdia

En l'apartat anterior hem explicat la manera de crear corpus comparables a partir de la Viquipèdia mitjançant un programa específic. El programa usa una gran base de dades per tal de saber quins articles descarregar, però els articles es descarreguen directament de la Viquipèdia. Això fa que es produeixein consultes massives a la pàgina de la Viquipèdia, amb el que en casos extrems, es poden produir problemes massius per a la mateixa. Per evitar aquestes consultes massives es pot treballar directament amb els dumps de la Viquipèdia, que són fitxers molt grans que contenen tots els articles de la Viquipèdia en una determinada llengua.

Els dumps de la Viquipèdia, i de tota la resta de projectes de Wikimedia, es poden descarregar de https://dumps.wikimedia.org/backup-index.html

Per exemple, si volem baixar la Viquipèdia anglesa hem de buscar en aquesta pàgina "enwiki" i seguir l'enllaç. Podem fer el mateix amb la Viquipèdia espanyola buscant "eswiki". El problema és que aquests fitxers són ENORMES i per tant la descàrrega dura una bona estona. A més a més, utilitzarem molt espai de disc.

Per agilitzar aquest tram, practicarem amb dues llengües que tenen Viquipèdies de menor mida. Concretament, us proposo treballar amb les Viquipèdies en asturià i occità. Tot el que farem serà exactament el mateix que per a Viquipèdies més grans, com l'anglesa i l'espanyola. Però les proves seran molt més àgils amb les Viquipèdies petites.

Baixem les Viquipèdies:

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

Els arxius que es descarreguen estan comprimits en bz2. NO ELS DESCOMPRIMIU! Treballarem directament amb els arxius comprimits. Això és epecialment important quan treballem amb Viquipèdies grans. Per exemple, podem visualitzar el contingut amb bzmore o bzcat, en lloc de more i cat.

Observeu el contingut d'aquests fitxers. Com podeu veure, aquests fitxers són fitxers XML que contenen diversa informació sobre els articles i el text dels fitxers en si, que està en format wiki.

5.1. Conversió del dump en fitxers de text

Una vegada tenim els dump ens interessa extreure un fitxer de text per a cada un dels articles d'interès. Potser ens interessa extreure els textos de tots els articles, o bé ens interessarà limitar-nos a una sèrie de categories.

En el repositori htts:/github.com/aoliverg/dumpsWikipedia teniu disponibles una sèrie d'scripts que ens facilitaran aquesta tasca.

L' script wikipedia2text.py, que disposa de l' opció - h que mostra l' ajuda, ens permet convertir un dump de Viquipèdia en fitxers de text, un per a cada article:

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 volem convertir tot el dump de la wikipedia (adapteu el nom del dump al que tingueu descarregat):

python3 wikipedia2text.py -d astwiki-20240501-pages-articles.xml.bz2 -l ast -o wikipedia-ast/

El directori de sortida, wikipedia- ast en l'exemple, es crearà si no existeix i contindrà un fitxer de text per cada article. En el fitxer title- list.txt es desen el títol dels fitxers baixats. Podem especificar un altre nom per aquest fitxer amb l'opció - t.

Ara bé, en molts casos ens interessarà limitar els articles convertits a text en una sèrie de categories. Per això podem crear un fitxer de text, per exemple categories.txt, que contingui una categoria per línia. El nom de la categoria ha d'estar en la llengua corresponent al dump que estem tractant. Per ara creeu un fitxer de text categories.txt que contingui per exemple Medicina (si tracteu el dump en asturià). En el següent apartat veurem com podem explorar les categories en una llengua. Per a limitar la conversió als articles de la categoria Medicina (o la que tingueu en el fitxer categories.txt) podeu escriure:

python3 wikipedia2text.py -d astwiki-20240501-pages-articles.xml.bz2 -l ast -o wikipedia-medicina-ast/ -c categorias.txt

5.2. Exploració de les categories

Per a saber quines categories posar al fitxer de categories i així limitar els fitxers generats tenim diverses opcions:

  • Opció manual I. La Viquipèdia anglesa ofereix una pàgina amb categories organitzades per disciplines acadèmiques: [https://en.wikipedia.org/wiki/Outline_ of_ academic_disciplines](http://en.wikipedia.org/wiki/Outline_ of_ academic_ disciplines). Si us fixeu a la part superior, aquesta mateixa pàgina està disponible en altres llengües. Si la llengua que us interessa està entre aquestes llengües, podeu obtenir informació interessant sobre les categories que us interessen allà.
  • Opció manual II. Podeu cercar articles relacionats amb les temàtiques que us interessin, i fixar-vos en la part inferior, a quines categories estan relacionades aquestes pàgines. Si feu clic sobre aquesta categoria, s'obrirà una pàgina que moltes vegades conté informació sobre subcategories. Explorant tot això podreu anar generant el fitxer de categories.
  • Opció automàtica: En el mateix repositori tenim el programa exploreCategories.py que ens permet explorar les categories que tenen els articles. Aquest programa també disposa de l'opció -h que ens mostra l'ajuda:
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.

Per exemple, si volem veure les categories associades a Medicina, podem escriure:

python3 exploreCategories.py -d astwiki-20240501-pages-articles.xml.bz2 -l ast -c Medicina --limit 100 -o categorias-medicina-ast.txt

El procés és bastant lent, de manera que es pot usar l' ocpió -- limit que atura el procés quan heu trobat un nombre de pàgines amb la categoria donada (a l'exemple 100). Si no s'indica cap límit el programa explora tot el dump. El programa crearà el fitxer categories-medicina- ast.txt que contindrà la llista de categories relacionades per ordre descendent de freqüència d'aparició, per exemple:

Medicina
Especialitats mèdiques
Biologia
Anatomia
Biografies per activitat
Bioquímica
Fàrmacs
Ètica
Biofísica
Química
Wikipedia:Artículos ensin plantía llistaref
Mitologia grega
Lingüística
Premis Nobel
Fisiologia
Psicologia
Antropologia
Sociologia

Per pantalla s'ofereixen a més a més les categories juntament amb la seva freqüència:

Medicina 33
Especialitats mèdiques 5
Biologia 3
Anatomia 2
Biografies per activitat 1
Bioquímica 1
Fàrmacs 1
Ètica 1
Biofísica 1
Química 1
Wikipedia:Artículos ensin plantía llistaref 1
Mitologia grega 1
Lingüística 1
Premis Nobel 1
Fisiologia 1
Psicologia 1
Antropologia 1
Sociologia 1

Aquest fitxer el podem editar per adaptar-lo a les nostres necessitats i utilitzar-lo amb el programa wikipedia2text.py explicat anteriorment.

En lloc d'una única categoria, és possible indicar una sèrie de categories separades per ":", per exemple:

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