Closed dmlls closed 3 years ago
Lo primero de todo es descargar el volcado. Emplearemos el volcado del proyecto Plain Text Wikipedia 2020-2011, ya que nos ofrece el texto extraído en formato json
.
No obstante, aún tenemos que realizar cierto pre-procesado de este volcado antes de poder entrenar nuestro modelo, dado que el volcado tiene la siguiente estructura:
[
{
"id": "62580990",
"text": "John Gläser (12 June 1888 – 27 May 1968) was a German operatic tenor [...].",
"title": "John Gläser"
},
{
"id": "62581004",
"text": "Goertz is a surname. Notable people with the surname include: *Allie Goertz (born 1991) [...].",
"title": "Goertz"
},
"..."
]
y de lo anterior solo nos interesa el campo text
.
Para ello, hemos escrito el siguiente script:
import sys
import json
from os import listdir
from blingfire import text_to_sentences
from pathlib import Path
OUTPUT_PREFIX = "processed_dumps/tokenized_"
if len(sys.argv) < 2:
print("ERROR: Specify directory containing the dumps.")
exit(1)
print("Processing...")
for dump_file in listdir(sys.argv[1]):
output_filename = f"{OUTPUT_PREFIX}{dump_file[:-4]}txt"
with open(Path(sys.argv[1]) / dump_file, 'r') as dump:
with open(Path(output_filename), "w+") as output:
dict_dump = json.loads(dump.read())
for entry in dict_dump:
sentences = text_to_sentences(entry['text'])
output.write(sentences)
output.write("\n")
print(f"Tokenized dump saved to {output_filename}.")
Este pequeño script además de parsear el JSON para quedarnos solo con el campo text
, tokeniza el texto en frases, de forma que las frases quedan separadas por un salto de línea (\n
). Para ello se emplea el módulo blingfire de Microsoft. Cada fichero procesado se guarda en uno nuevo, conteniendo estas frases ya separadas.
A la hora de entrenar el modelo, dividiremos a su vez estas frases en palabras. No obstante, debemos mantener la separación entre frases, dado que el modelo, a fin de "aprender" cuando una palabra lleva mayúscula o no, se fija en su contexto (las palabras que tiene alrededor), pero este contexto se limita a su frase.
Es decir, si tenemos la siguiente frase:
"The Tama Lakes are two crater lakes in New Zealand's Tongariro National Park."
,
seguida de
"They fill two (Upper and Lower Tama) of a series of explosion craters on the Tama Saddle."
,
para aprender si la palabra Lakes
de la primera frase debería llevar mayúscula, se fijará en las palabras Tama
, are
(bigramas) y las palabras The
y two
(trigramas), de manera que si en otro texto la palabra Lakes
aparece rodeada de estas palabras, entonces tendrá altas probabilidades de llevar mayúscula.
No obstante, para última palabra de la primera frase, Park
, no podemos fijarnos en las primeras palabras de la siguiente frase (They
y fill
). Con esto es a lo que nos referimos cuando decíamos anteriormente que aunque separemos las frases en palabras, aún debemos recordar dónde empieza y acaba cada frase para poder entrenar correctamente al modelo.
Debido a limitaciones temporales y de recursos de computación, se ha decidido marcar esta historia de usuario como no prioritaria. Se completará una vez realizada la entrega del TFG.
Antes de realizar este entrenamiento, se explorarán otros modelos de truecasing. La implementación del truecaser utilizado actualmente ya tiene unos años (2003), y es posible que existan modelos más avanzados. En el caso de encontrar un modelo pre-entrenado, es posible que no hiciera falta llevar a cabo ningún entrenamiento.
El modelo incluido por defecto en la librería truecase está entrenado con el corpus en inglés de NLTK. Entrenándolo con un volcado reciente de Wikipedia, se podría mejorar su precisión, especialmente en el caso de las entidades nombradas.