{ "cells": [ { "cell_type": "markdown", "id": "1daa77c9", "metadata": {}, "source": [ "## Análisis de la colección TCE60\n", "\n", "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. \n", "\n", "El corpus original se puede consultar en la Biblioteca Virtual Miguel de Cervantes:\n", "https://www.cervantesvirtual.com/portales/teatro_clasico_espanol/obra/canon-60-la-coleccion-esencial-del-tc12-teatro-clasico-espanol/\n", "\n", "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) " ] }, { "cell_type": "markdown", "id": "da44bfef", "metadata": {}, "source": [ "# Reconocimiento de entidades\n", "\n", "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.\n", "\n", "Spacy permite entrenar un modelo a través de un etiquetado de entidades para mejorar los resultados." ] }, { "cell_type": "markdown", "id": "128e6210", "metadata": {}, "source": [ "### Importamos las librerías de Python" ] }, { "cell_type": "code", "execution_count": 1, "id": "558aad51", "metadata": {}, "outputs": [], "source": [ "import spacy" ] }, { "cell_type": "markdown", "id": "644f8c1e", "metadata": {}, "source": [ "#### Ejemplo de entrenamiento" ] }, { "cell_type": "code", "execution_count": 3, "id": "45870a37", "metadata": {}, "outputs": [], "source": [ "nlp = spacy.load(\"es_core_news_sm\")\n", "\n", "#Texto de ejemplo\n", "text = \"\"\"No te desconsueles, hija;\n", "vuelve en ti, que tendrás presto\n", "estado con el mejor\n", "y más noble caballero\n", "que agora tiene Castilla;\n", "porque será por lo menos\n", "el que por único llaman\n", "el caballero de Olmedo.\n", "Don Alonso en una feria\n", "te vio, labradora Venus,\n", "haciendo las cejas arco\n", "y flecha los ojos bellos.\"\"\"\n", "\n", "corpus = []\n", "\n", "doc = nlp(text.replace(\"\\n\",\" \"))\n", "for sent in doc.sents:\n", " corpus.append(sent.text)\n", "\n", "#Build upon the spaCy Small Model\n", "nlp = spacy.blank(\"es\")\n", "\n", "#Create the EntityRuler\n", "ruler = nlp.add_pipe(\"entity_ruler\")\n", "\n", "#List of Entities and Patterns\n", "patterns = [\n", " {\"label\": \"PERSON\", \"pattern\": \"Tello\"},\n", " {\"label\": \"PERSON\", \"pattern\": \"Alonso\"},\n", " {\"label\": \"PERSON\", \"pattern\": \"Don Rodrigo\"},\n", " {\"label\": \"PERSON\", \"pattern\": \"Don Fernando\"},\n", " {\"label\": \"PERSON\", \"pattern\": \"Don Pedro\"},\n", " {\"label\": \"PERSON\", \"pattern\": \"Doña Inés\"},\n", " {\"label\": \"PERSON\", \"pattern\": \"Ana\"},\n", " {\"label\": \"PERSON\", \"pattern\": \"Fabia\"},\n", " {\"label\": \"PERSON\", \"pattern\": \"El Rey Don Juan\"},\n", " {\"label\": \"PERSON\", \"pattern\": \"Mendo\"},\n", " {\"label\": \"GPE\", \"pattern\": \"Toledo\"},\n", " {\"label\": \"GPE\", \"pattern\": \"Castilla\"},\n", " ]\n", "\n", "ruler.add_patterns(patterns)" ] }, { "cell_type": "markdown", "id": "602cbe07", "metadata": {}, "source": [ "## Vemos el resultado de aplicar la lista de ejemplos de entrenamiento" ] }, { "cell_type": "code", "execution_count": 4, "id": "4cabd323", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "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.', {'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']]}]]\n" ] } ], "source": [ "TRAIN_DATA = []\n", "\n", "#iterate over the corpus again\n", "for sentence in corpus:\n", " doc = nlp(sentence)\n", " \n", " #remember, entities needs to be a dictionary in index 1 of the list, so it needs to be an empty list\n", " entities = []\n", " \n", " #extract entities\n", " for ent in doc.ents:\n", "\n", " #appending to entities in the correct format\n", " entities.append([ent.start_char, ent.end_char, ent.label_])\n", " \n", " TRAIN_DATA.append([sentence, {\"entities\": entities}])\n", "\n", "print (TRAIN_DATA)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.12" } }, "nbformat": 4, "nbformat_minor": 5 }