sábado, 6 de junio de 2026

DATOS. Tratamiento de datos

Datos no estructurados (IV)

Reconocimiento de entidades (NER) (I)

Para seguir avanzando en el aprendizaje de cómo tratar los datos no estructurados, antes de pasar a la matematización del contenido de los textos, debemos retomar los procedimientos ejecutados hasta ahora pero con un texto y una problemática diferente a la del empleado en esos procedimientos.

Debo decir que ese texto (evidentemente inventado) sirvió perfectamente para el objetivo, pero dejó voluntariamente aparcada una problemática que resulta fundamental resolver dentro del ámbito de trabajo de los SEO: el manejo de datos confidenciales. Quedó también sin desarrollar un procedimiento que tiene también gran interés para el manejo de textos, y creo que muy especialmente para nosotros: la identificación temática del contenido o, mejor dicho, el rconocimiento de entidades (NER). Además resulta que ambas temáticas están relacionas, así que me propongo tratarlas en esta entrada y en otras que siguan, antes de avanzar en el grueso del procedimiento.

Para ello, como dije, es necesario emplear otro documento como texto de referencia. Al leerlo se entenderá el motivo.

El alumno Alejandro Martínez Soler, escolarizado en 4º de Primaria del CEIP San Juan Bautista de Oviedo, presenta dificultades de adaptación significati_vas. La tutora, Doña Carmen Villalobos, informa de que tras la reunión mantenida el pasado martes 12 de mayo con la madre del menor, la Sra. Elena Soler, no se ha observado mejoría en el aula. El Equipo de Orientación Educativa (EOEP) ha sido notificado por el Director del centro, Don Roberto Pando, clasificando el expediente como intervención prioritaria. Se ha solicitado formalmente la colaboración del Servicio de Salud del Principado de Asturias (SESPA) para coordinar la valoración psiquiátrica del menor antes del viernes 19 de junio. Nota: Toda la documentación clínica de Alejandro ha sido archivada en el aplicativo institucional SAECE según el protocolo de la Consejería de Educación.

No creo que sea necesario decirlo, pero para que no quepa duda: se trata de un texto generado por IA, totalmente inventado, por lo que ninguno de los datos personales son reales, aunque se presentan de forma que lo parezca, precisamente por motivos de aprendizaje. También he de decir que siendo su origen el que es, determinados contenidos o, mejor aun, lo que se peude inferir de ellos, no están correctamente expuestos, pero la verdad es que esta cuestión es ahora irrelevante.

Lo que no es irrelevante, y sí necesario antes de entrar realmente en materia es que procedamos a realizar una limpieza básica de errores manifiestos mediante un procedimiento ya conocido, aunque matizado en este caso, ya que por el momentos necesitamos mantener las mayúsculas, las tildes y los signos de puntuación, por lo que esta limpieza se limitará a la eliminación de código irrelevante y a corregir otros errores como la separación de palabras



import re

# Texto de trabajo

texto_base = """

El alumno Alejandro Martínez Soler, escolarizado en 4º de Primaria del CEIP San Juan Bautista de Oviedo, presenta dificultades de adaptación significati_vas. La tutora, Doña Carmen Villalobos, informa de que tras la reunión mantenida el pasado martes 12 de mayo con la madre del menor, la Sra. Elena Soler, no se ha observado mejoría en el aula. El Equipo de Orientación Educativa (EOEP) ha sido notificado por el Director del centro, Don Roberto Pando, clasificando el expediente como intervención prioritaria. Se ha solicitado formalmente la colaboración del Servicio de Salud del Principado de Asturias (SESPA) para coordinar la valoración psiquiátrica del menor antes del viernes 19 de junio. Nota: Toda la documentación clínica de Alejandro ha sido archivada en el aplicativo institucional SAECE según el protocolo de la Consejería de Educación.

""" # --- Función de limpieza ------------------------------------------------------- def limpieza_estructural_formato(texto): """ FASE 1. Elimina ruido de formato, etiquetas y repara la estructura física del texto sin alterar la gramática, la puntuación ni la capitalización. """ print("--- EJECUTANDO FASE 1: LIMPIEZA ESTRUCTURAL Y DE FORMATO ---") # 1. Eliminar marcado de etiquetas estructuradas (HTML, XML, componentes de interfaz) texto = re.sub(r'<[^>]+>', ' ', texto) # 2. Reparar palabras truncadas por guiones bajos o de final de línea ("significati_vas" -> "significativas") texto = re.sub(r'(\w+)_\s*(\w+)', r'\1\2', texto) # 3. Eliminar caracteres huérfanos de formato residuales (guiones bajos) texto = texto.replace('_', '') # 4. Normalización final de espacios en blanco y saltos de página/línea (aplana el texto en una sola línea continua) texto = re.sub(r'\s+', ' ', texto).strip() return texto # --- Llamada a la función -------------------------------------------------------- if __name__ == "__main__": texto_sintactico_puro = limpieza_estructural_formato(texto_base) print("\n[SALIDA FASE 1] TEXTO PREPARADO PARA PROCESAR:") print(texto_sintactico_puro)
Veamos el resultados:
El alumno Alejandro Martínez Soler, escolarizado en 4º de Primaria del CEIP San Juan Bautista de Oviedo, presenta dificultades de adaptación significativas. La tutora, Doña Carmen Villalobos, informa de que tras la reunión mantenida el pasado martes 12 de mayo con la madre del menor, la Sra. Elena Soler, no se ha observado mejoría en el aula. El Equipo de Orientación Educativa (EOEP) ha sido notificado por el Director del centro, Don Roberto Pando, clasificando el expediente como intervención prioritaria. Se ha solicitado formalmente la colaboración del Servicio de Salud del Principado de Asturias (SESPA) para coordinar la valoración psiquiátrica del menor antes del viernes 19 de junio. Nota: Toda la documentación clínica de Alejandro ha sido archivada en el aplicativo institucional SAECE según el protocolo de la Consejería de Educación.

Es muy imporante en este caso que el nuevo texto, además de "limpio" se presente como un único bloque de contenido, ya que de este modo podemos abordar el paso siguiente que consiste en la identificación de entidades, entendiendo por entidad una entidad una unidad básica dentro de un texto que posee un significado semántico específico y pertenece a una categoría predefinida, siendo, de hecho, la categorización el objetivo definitorio del procedimiento (personas (nombres de individuos), organizaciones (empresas, agencias, instituciones o grupos), lugares/ubicaciones...). Al conjunto de procedimientos empleados en la identificación de estas entidades se denomina NER (en inglés) - REN en español (Reconocimiento de Entidades Nombradas).

Por situarnos, NER/REN pertenencen al ámbito del NLP (en inglés) / PLN (en español Procesamiento del Lenguaje Natural) y, al igual que sucede en otros subcampos del PLN, se han desarrollado procedimientos basados en reglas o en modelos estadísticos (estos dentro del ML), pero también procedimientos Deep Learning (DL) discriminativos (modelos BERT) y finalmente mediante IA-Generativa, identificada como subcampo del DL, que aborda el NER transformando la extracción en una tarea de generación de texto nuevo estructurado a partir de un enunciado en lenguaje natural.

Aunque los primeros procedimientos NER se basaban exclusivamente en la implementación de reglas, el desarrollo de esta línea de investigación ha derivado a procesimientos que agilizan el trabajo en forma de bibliotecas, como es el caso de la biblioteca SpaCy, entorno de trabajo que empaqueta e integra varios enfoques (reglas, modelos estadísticos y DL discriminativo) y que pertenece al ecosistema Python. Esta será la referencia que tomaremos como punto de inicio para no inventar la rueda, por más que hacerlo no deje de tener interés didáctico, pero las limitaciones de tiempo mandan.

Planteo a continuación un script que pretende dar el salto hacia la NER mediante la aplicación de un segundo script Python-SpaCy al texto que limpiamos con el script anterior.



import spacy

# 1. Cargamos el modelo en español en local
nlp = spacy.load("es_core_news_md")

# 2. Cargamos el texto simulado limpio
texto_expediente = (
    "El alumno Alejandro Martínez Soler, escolarizado en 4º de Primaria del "
    "CEIP San Juan Bautista de Oviedo, presenta dificultades de adaptación significativas. "
    "La tutora, Doña Carmen Villalobos, informa de que tras la reunión mantenida "
    "el pasado martes 12 de mayo con la madre del menor, la Sra. Elena Soler, "
    "no se ha observado mejoría en el aula. El Equipo de Orientación Educativa (EOEP) "
    "ha sido notificado por el Director del centro, Don Roberto Pando, clasificando "
    "el expediente como intervención prioritaria. Se ha solicitado formalmente la "
    "colaboración del Servicio de Salud del Principado de Asturias (SESPA) para "
    "coordinar la valoración psiquiátrica del menor antes del viernes 19 de junio. "
    "Nota: Toda la documentación clínica de Alejandro ha sido archivada en el "
    "aplicativo institucional SAECE según el protocolo de la Consejería de Educación."
)

# 3. Procesamos el texto mediante SpaCy (tokeniza, analiza la sintaxis y extrae entidades)
doc = nlp(texto_expediente)

print("=== ENTIDADES NOMBRADAS DETECTADAS ===\n")

# 4. Iteramos sobre las entidades encontradas por el modelo
for entidad in doc.ents:
    print(f"Texto: {entidad.text:<50} | Categoría: {entidad.label_}")


=== ENTIDADES NOMBRADAS DETECTADAS ===
Texto: Alejandro Martínez Soler | Categoría: PER
Texto: Primaria del CEIP San Juan Bautista de Oviedo | Categoría: LOC
Texto: La tutora | Categoría: MISC
Texto: Doña Carmen Villalobos | Categoría: PER
Texto: Sra. Elena Soler | Categoría: PER
Texto: El Equipo de Orientación Educativa | Categoría: MISC
Texto: EOEP | Categoría: MISC
Texto: Director del centro | Categoría: MISC
Texto: Don Roberto Pando | Categoría: LOC
Texto: Servicio de Salud del Principado de Asturias | Categoría: ORG
Texto: SESPA | Categoría: ORG
Texto: Nota: Toda la documentación clínica | Categoría: MISC
Texto: Alejandro | Categoría: PER
Texto: SAECE | Categoría: MISC
Texto: Consejería de Educación | Categoría: ORG

Como puedes apreciar, el resultado que obtenemos deja mucho que desear, empezando por las ausencias y siguiendo por los errores. Sin ser muy exhaustivo...

  • El número de categorías es claramente insuficientes (sólo 4)
  • No captura las fechas en ninguno de sus formatos
  • Fusiona entidades: donde hay dos (o más) puede encontrar sólo una (Primaria del CEIP San Juan Bautista de Oviedo)
  • Confunde entidades (Don Roberto Pando| Categoría: LOC)

Por suerte disponemos de recursos para paliar estas limitaciones. De ello nos ocuparemos en próximas entradas

No hay comentarios:

Publicar un comentario

Comenta esta entrada