#!/usr/bin/env python # coding: utf-8 # ## Análisis de la colección TCE60 # # 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) # # Reconocimiento de entidades # # 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. # ### Importamos las librerías de Python # In[1]: import spacy # #### Ejemplo de entrenamiento # In[3]: 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) # ## Vemos el resultado de aplicar la lista de ejemplos de entrenamiento # In[4]: 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)