Este ejemplo muestra cómo analizar el dataset generado a partir de los documentos TEI originales en XML. Se ha creado un fichero en formato CSV que es posible analizar con la librería Pandas de Python.
El corpus original se puede consultar en la Biblioteca Virtual Miguel de Cervantes: https://www.cervantesvirtual.com/portales/teatro_clasico_espanol/obra/canon-60-la-coleccion-esencial-del-tc12-teatro-clasico-espanol/
La colección se basa en los parlamentos de las obras incluidas en el corpus TCE60 organizados a modo de registro (idRegistro, idAutoridad, Personaje, Texto)
Al utilizar el modelo proporcionado por la librería Spacy para el reconocimiento de entidades en el texto (NER, de Named Entity Recognition en inglés) los resultados incluyen entidades incorrectas para lugares y personas.
Spacy permite entrenar un modelo a través de un etiquetado de entidades para mejorar los resultados.
import spacy
nlp = spacy.load("es_core_news_sm")
#Texto de ejemplo
text = """No te desconsueles, hija;
vuelve en ti, que tendrás presto
estado con el mejor
y más noble caballero
que agora tiene Castilla;
porque será por lo menos
el que por único llaman
el caballero de Olmedo.
Don Alonso en una feria
te vio, labradora Venus,
haciendo las cejas arco
y flecha los ojos bellos."""
corpus = []
doc = nlp(text.replace("\n"," "))
for sent in doc.sents:
corpus.append(sent.text)
#Build upon the spaCy Small Model
nlp = spacy.blank("es")
#Create the EntityRuler
ruler = nlp.add_pipe("entity_ruler")
#List of Entities and Patterns
patterns = [
{"label": "PERSON", "pattern": "Tello"},
{"label": "PERSON", "pattern": "Alonso"},
{"label": "PERSON", "pattern": "Don Rodrigo"},
{"label": "PERSON", "pattern": "Don Fernando"},
{"label": "PERSON", "pattern": "Don Pedro"},
{"label": "PERSON", "pattern": "Doña Inés"},
{"label": "PERSON", "pattern": "Ana"},
{"label": "PERSON", "pattern": "Fabia"},
{"label": "PERSON", "pattern": "El Rey Don Juan"},
{"label": "PERSON", "pattern": "Mendo"},
{"label": "GPE", "pattern": "Toledo"},
{"label": "GPE", "pattern": "Castilla"},
]
ruler.add_patterns(patterns)
TRAIN_DATA = []
#iterate over the corpus again
for sentence in corpus:
doc = nlp(sentence)
#remember, entities needs to be a dictionary in index 1 of the list, so it needs to be an empty list
entities = []
#extract entities
for ent in doc.ents:
#appending to entities in the correct format
entities.append([ent.start_char, ent.end_char, ent.label_])
TRAIN_DATA.append([sentence, {"entities": entities}])
print (TRAIN_DATA)
[['No te desconsueles, hija; vuelve en ti, que tendrás presto estado con el mejor y más noble caballero que agora tiene Castilla; porque será por lo menos el que por único llaman el caballero de Olmedo.', {'entities': [[117, 125, 'GPE']]}], ['Don Alonso en una feria te vio, labradora Venus, haciendo las cejas arco y flecha los ojos bellos.', {'entities': [[4, 10, 'PERSON']]}]]