dmlls / jizt-tfg

Servicio de Resumen de Textos con AI en la Nube (versión TFG).
https://dmlls.github.io/jizt-tfg-website/
GNU General Public License v3.0
13 stars 3 forks source link

[Post-procesador] Entrenar truecase con volcado de Wikipedia #42

Closed dmlls closed 3 years ago

dmlls commented 3 years ago

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.

dmlls commented 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.

dmlls commented 3 years ago

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.

dmlls commented 3 years ago

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.