Modelo NER especializado en la detección de personas y agrupaciones musicales en prensa musical española histórica (1918–1935), desarrollado en el marco del proyecto LexiMus (PID2022-139589NB-C33).
Basado en BETO (dccuchile/bert-base-spanish-wwm-cased) y ajustado con spaCy 3 sobre un corpus de textos de El Sol y ONDAS (prensa musical española, 1918–1935).
Evaluación sobre 1.183 predicciones revisadas por expertos humanos:
Clase
TP
FP
Precisión
COMPOSITOR
~318
~19
~94.4%
INTERPRETE
~220
~17
~92.8%
CANTANTE
~217
~24
~90.0%
AGRUPACION
~293
~6
~98.0%
GLOBAL
1.115
68
94.3%
Nota sobre F1: La evaluación automática contra anotaciones gold parciales arroja F1 = 0.40, cifra que subestima severamente el rendimiento real del modelo. Las anotaciones de referencia solo marcan un subconjunto de las entidades presentes en cada texto (el corpus fue anotado parcialmente, no de forma exhaustiva). La precisión del 94.3% obtenida por revisión humana directa es la métrica representativa del sistema.
Sistema completo: NER + Entity Ruler
El sistema combina el modelo transformer con un Entity Ruler léxico (1.035 patrones de nombres propios frecuentes en el corpus). El ruler actúa sin sobreescribir las predicciones del NER (overwrite_ents=False).
1import spacy
2import csv
3from pathlib import Path
45defcargar_leximus(ruta_modelo:str, ruta_csv:str):6"""Carga el modelo LexiMus con Entity Ruler integrado."""7 nlp = spacy.load(ruta_modelo)89# Reconstruir Entity Ruler desde el CSV de patrones10if"entity_ruler"in nlp.component_names:11 nlp.remove_pipe("entity_ruler")1213 patrones =[]14 vistos =set()15 etiquetas_validas ={"COMPOSITOR","INTERPRETE","CANTANTE","AGRUPACION"}1617withopen(ruta_csv, encoding="utf-8")as f:18 reader = csv.DictReader(f)19for fila in reader:20 etq = fila["etiqueta"]21if etq notin etiquetas_validas:22continue23 textos_patron ={fila["texto"].strip()}24if fila.get("variante_limpia","").strip():25 textos_patron.add(fila["variante_limpia"].strip())26 notas = fila.get("notas","")27if"Apodo:"in notas:28 apodo = notas.split("Apodo:")[-1].split("|")[0].strip()29if apodo:30 textos_patron.add(apodo)31for t in textos_patron:32ifnot t orlen(t)<2:33continue34 clave =(t.lower(), etq)35if clave in vistos:36continue37 vistos.add(clave)38 patrones.append({"label": etq,"pattern": t})3940 ruler = nlp.add_pipe("entity_ruler", last=True, config={"overwrite_ents":False})41 ruler.add_patterns(patrones)42print(f"Sistema listo: NER transformer + Entity Ruler ({len(ruler)} patrones)")43return nlp
444546# Ejemplo de uso47nlp = cargar_leximus(48 ruta_modelo="LexiMus-BETO-per-v1",49 ruta_csv="entidades_ner_leximus.csv"50)5152texto ="Anoche actuó la Orquesta Filarmónica de Madrid bajo la batuta de Bartolomé Pérez Casas, con el violinista Francesc Costa como solista."53doc = nlp(texto)5455for ent in doc.ents:56if ent.label_ in{"COMPOSITOR","INTERPRETE","CANTANTE","AGRUPACION"}:57print(f" [{ent.label_}] {ent.text}")
Salida esperada:
Sistema listo: NER transformer + Entity Ruler (1035 patrones)
[AGRUPACION] Orquesta Filarmónica de Madrid
[INTERPRETE] Bartolomé Pérez Casas
[INTERPRETE] Francesc Costa
Archivos del repositorio
LexiMus-BETO-per-v1/
├── README.md # Este archivo
├── entidades_ner_leximus.csv # Patrones del Entity Ruler (1.035 entradas)
├── cargar_modelo.py # Script de ejemplo completo
└── [carpetas del modelo spaCy] # config.cfg, meta.json, ner/, transformer/, etc.
Datos de entrenamiento
Corpus: Prensa musical española histórica — El Sol (1918–1935) y ONDAS (1925–1926)
Período: 1918–1935
Idioma: Español histórico (ortografía de época)
Anotación: Manual + revisión asistida por LLM (Gemini)
Tamaño del conjunto de validación: 1.200 textos (combinación de ejemplos positivos y negativos)
Limitaciones
Optimizado para prensa musical española de los años 1918–1935. El rendimiento puede degradarse en textos contemporáneos o de otros dominios.
La distinción INTERPRETE / CANTANTE puede ser ambigua en contextos sin información de rol explícita.
Nombres propios no incluidos en el Entity Ruler pueden no reconocerse si son poco frecuentes o presentan variantes ortográficas de época.
El modelo no reconoce entidades fuera de las 4 clases definidas (lugares, obras, fechas, etc.).
Cita
Si usas este modelo en tu investigación, por favor cita:
bibtex
1@misc{leximus-beto-per-v1,
2 title = {LexiMus-BETO-per-v1: NER para personas y agrupaciones musicales en prensa española histórica},
3 author = {{Grupo LexiMus, Universidad de Salamanca}},
4 year = {2026},
5 howpublished = {\url{https://huggingface.co/LexiMusUSAL/LexiMus-BETO-per-v1}},
6 note = {Proyecto PID2022-139589NB-C33, financiado por MCIN/AEI/10.13039/501100011033}
7}
Proyecto LexiMus
LexiMus: Léxico y ontología de la música en español (PID2022-139589NB-C33)
Financiado por: Ministerio de Ciencia e Innovación / Agencia Estatal de Investigación
Instituciones: Universidad de Salamanca · Instituto Complutense de Ciencias Musicales · Universidad de La Rioja