Modelo de reconocimiento de entidades nombradas (NER) para la identificación y catalogación de reacciones adversas de medicamentos en textos farmacéuticos en español.
Este modelo forma parte del Proyecto Fin de Grado (PFG) "Aplicación de modelos de Inteligencia Artificial para la identificación y catalogación de reacciones adversas de medicamentos" del Grado en Ingeniería Informática de la Universidad Nacional de Educación a Distancia (UNED).
Autor: Luis Miguel Guerrero Guirado
Director: Salvador Ros Muñoz
Curso académico: 2025/2026
Descripción del modelo
CIMA-BERTIN-4.8-NER es un modelo de clasificación de tokens (NER) entrenado en dos fases secuenciales para reconocer cuatro tipos de entidades en textos de fichas técnicas de medicamentos españoles:
Entidad
Etiqueta
Descripción
Principio activo
ACTIVE
Sustancia farmacológica activa del medicamento
Reacción adversa
REACT
Efecto secundario o reacción adversa identificada
Frecuencia
FREQ
Frecuencia de aparición de la reacción adversa (muy frecuente, frecuente, poco frecuente, rara, muy rara, frecuencia no conocida)
Sistema orgánico
SYS
Sistema del cuerpo humano afectado (ej. Trastornos del sistema nervioso)
El esquema de etiquetado utiliza el formato BIO (Beginning-Inside-Outside) con 9 clases:
ID
Etiqueta
Descripción
0
O
Fuera de cualquier entidad
1
B-ACTIVE
Inicio de principio activo
2
I-ACTIVE
Continuación de principio activo
3
B-REACT
Inicio de reacción adversa
4
I-REACT
Continuación de reacción adversa
5
B-FREQ
Inicio de frecuencia
6
I-FREQ
Continuación de frecuencia
7
B-SYS
Inicio de sistema orgánico
8
I-SYS
Continuación de sistema orgánico
Modelo base
El modelo base utilizado es BERTIN (bertin-project/bertin-base-gaussian-exp-512seqlen), un modelo de tipo BERT pre-entrenado específicamente para el idioma español mediante muestreo por perplejidad (perplexity sampling).
de la Rosa, J., Ponferrada, E. G., Romero, M., Villegas, P., González de Prado Salas, P., & Grandury, M. (2022). BERTIN: Efficient Pre-Training of a Spanish Language Model Using Perplexity Sampling. Procesamiento del Lenguaje Natural, 68, 13–23. arXiv:2207.06814
Pipeline de entrenamiento
El entrenamiento se compone de dos fases secuenciales: un entrenamiento no supervisado (MLM) para adaptar el modelo al dominio farmacéutico, seguido de un entrenamiento supervisado (multi-tarea + NER) para la clasificación de entidades.
┌─────────────────────┐ ┌──────────────────────────┐ ┌─────────────────────┐
│ BERTIN (base) │────▶│ Fase 1: MLM (4.8) │────▶│ CIMA-BERTIN-4.8 │
│ Modelo español │ │ Entrenamiento no │ │ Modelo adaptado │
│ generalista │ │ supervisado │ │ al dominio │
└─────────────────────┘ └──────────────────────────┘ └────────┬────────────┘
│
▼
┌──────────────────────────┐
│ Fase 2: NER │
│ Entrenamiento │
│ supervisado │
└────────┬─────────────────┘
│
▼
┌─────────────────────┐
│ CIMA-BERTIN-4.8-NER│
│ Modelo final │
└─────────────────────┘
Fase 1: Entrenamiento no supervisado — Masked Language Modeling (MLM)
El objetivo de esta fase es adaptar el modelo base BERTIN al dominio farmacéutico español, exponiéndolo a la terminología y estructura lingüística de las fichas técnicas de medicamentos.
Fuente de datos
Los datos de entrenamiento provienen del servicio CIMA (Centro de Información de Medicamentos Autorizados) del Ministerio de Sanidad de España, que contiene las fichas técnicas de todos los medicamentos autorizados para la venta en territorio español.
El proceso de limpieza y preparación de los datos consistió en:
Descarga: Obtención de las fichas técnicas completas en formato JSON mediante la API REST de CIMA.
Extracción: Aislamiento de la sección 4.8 (reacciones adversas) de cada ficha técnica.
Conversión: Transformación del contenido HTML a texto plano, eliminando todas las etiquetas de marcado y estilos.
Filtrado: Eliminación de texto irrelevante, como las instrucciones estándar de notificación de sospechas de reacciones adversas que aparecen al final de muchas fichas.
Para la carga y procesamiento eficiente de los ficheros de texto, se utilizó la función load_dataset de la librería datasets de Hugging Face.
Hiperparámetros del entrenamiento MLM
Parámetro
Valor
Épocas
3
Batch size (por dispositivo)
16
Longitud máxima de secuencia
128 tokens
Probabilidad de enmascaramiento (MLM)
18%
Estrategia de guardado
Sin checkpoints intermedios
Infraestructura
Recurso
Detalle
GPU
NVIDIA RTX 5090
Sistema operativo
Windows 11 + WSL
Tiempo de entrenamiento
~10 horas
Fase 2: Entrenamiento supervisado — Multi-tarea + NER
Una vez que el modelo ha adquirido conocimiento del dominio farmacéutico mediante MLM, se procede al entrenamiento supervisado que se compone de dos sub-fases: un clasificador multi-tarea y un modelo NER de clasificación de tokens.
Conjunto de datos supervisado
El conjunto de datos de verdad de referencia (ground truth) fue proporcionado y verificado por profesionales sanitarios. Contiene reacciones adversas anotadas por medicamento con información sobre el principio activo, la frecuencia, el sistema orgánico afectado y la reacción adversa.
Métrica
Valor
Total de filas anotadas
3.195
Medicamentos únicos
51
Filas de entrenamiento (70%)
2.187
Filas de prueba (30%)
969
Muestras de entrenamiento (tras augmentación de datos)
15.309
Muestras de prueba (tras augmentación de datos)
6.783
La partición se realizó de forma estratificada por código de medicamento, garantizando que todos los medicamentos estén representados proporcionalmente en ambos conjuntos (entrenamiento y prueba).
Augmentación de datos
Para ampliar el conjunto de entrenamiento y mejorar la robustez del modelo, por cada fila del dataset original se generan 7 variaciones textuales que combinan las entidades de diferentes formas:
"El principio activo {principio_activo} del medicamento {medicamento} causa {reaccion_adversa}"
"{reaccion_adversa} es una reacción adversa de {principio_activo}"
"Reacción adversa: {reaccion_adversa} con frecuencia {frecuencia} en el {sistema}"
"Efecto secundario de {principio_activo}: {reaccion_adversa}"
"Síntoma reportado: {reaccion_adversa}"
"El tratamiento con {principio_activo} puede producir {reaccion_adversa} en el {sistema} con una frecuencia de {frecuencia}."
"El medicamento {medicamento} con principio activo {principio_activo} puede causar {reaccion_adversa} de {frecuencia} en el {sistema}."
Arquitectura del clasificador multi-tarea
El modelo multi-tarea comparte el encoder BERT adaptado en la Fase 1 y emplea tres cabezas de clasificación independientes sobre la representación pooled (token [CLS]):
Clasificador de sistema orgánico: Linear(hidden_size → 26 clases)
Clasificador de frecuencia: Linear(hidden_size → 6 clases)
Clasificador de reacción adversa: Linear(hidden_size → 1.242 clases)
Dropout: config.hidden_dropout_prob
Función de pérdida: suma ponderada de CrossEntropyLoss de las tres tareas
Ponderación de clases: frecuencia inversa para manejar el desbalanceo entre clases
Hiperparámetros del entrenamiento multi-tarea
Parámetro
Valor
Épocas
4
Batch size (por dispositivo)
16
Warmup steps
100
Weight decay
0.01
Estrategia de evaluación
Por época
Selección del mejor modelo
eval_loss (menor es mejor)
Longitud máxima de secuencia
128 tokens
Hiperparámetros del entrenamiento NER
Parámetro
Valor
Épocas
3
Batch size (por dispositivo)
16
Warmup steps
100
Weight decay
0.01
Estrategia de evaluación
Cada 100 pasos
Selección del mejor modelo
eval_loss (menor es mejor)
Longitud máxima de secuencia
128 tokens
Resultados de evaluación
La evaluación se realizó con la librería nervaluate sobre el conjunto de prueba (30% del dataset, 969 filas), utilizando cuatro criterios de evaluación estándar para NER:
ent_type: Tipo de entidad correcto, independientemente de los límites exactos del span.
exact: Coincidencia exacta del span de la entidad.
partial: Coincidencia parcial del span de la entidad.
strict: Tipo de entidad correcto y coincidencia exacta del span.
Precisión por tarea de clasificación (multi-tarea)
Tarea
Accuracy
Frecuencia (FREQ)
91,79%
Sistema orgánico (SYS)
95,34%
Reacción adversa (REACT)
60,30%
Métricas globales NER
Criterio
Precisión
Recall
F1-Score
ent_type
0.4562
0.9087
0.6074
exact
0.1702
0.3391
0.2267
partial
0.1702
0.3391
0.2267
strict
0.1683
0.3352
0.2241
Métricas por tipo de entidad (criterio ent_type)
Entidad
Precisión
Recall
F1-Score
FREQ (frecuencia)
0.6117
0.9758
0.7520
REACT (reacción adversa)
0.6087
0.8765
0.7184
ACTIVE (principio activo)
0.4079
0.9746
0.5751
SYS (sistema orgánico)
0.3590
0.9950
0.5277
Análisis de los resultados
Fortalezas:
Alto recall global (90,87% en ent_type): el modelo identifica la gran mayoría de las entidades presentes en el texto.
Excelente recall por tipo de entidad: FREQ (97,58%), ACTIVE (97,46%), SYS (99,50%), REACT (87,65%).
La clasificación multi-tarea alcanza un 91,79% de precisión en frecuencia y un 95,34% en sistema orgánico.
Limitaciones:
La coincidencia exacta de los límites de los spans es significativamente menor (F1 strict: 0,2241), lo que indica que el modelo detecta correctamente la presencia de entidades pero no siempre delimita con precisión su extensión.
Se observa un número elevado de predicciones espurias (falsos positivos), generando una precisión moderada.
La frecuencia exacta de los spans para la entidad FREQ es prácticamente nula (F1 exact: 0,0004).
Limitaciones y consideraciones
Dominio específico: El modelo está entrenado exclusivamente con fichas técnicas de medicamentos españoles provenientes de CIMA. Su rendimiento en otros dominios biomédicos, textos clínicos generales o variantes del español de otros países no ha sido evaluado.
Delimitación de spans: Aunque el modelo tiene un alto recall para la detección del tipo de entidad, la coincidencia exacta de los límites de las entidades es significativamente menor.
Idioma: El modelo está diseñado y entrenado exclusivamente para textos en español.
Uso
python
1from transformers import AutoTokenizer, AutoModelForTokenClassification, pipeline
23model_name ="guerrerotook/CIMA-BERTIN-4.8-NER"45tokenizer = AutoTokenizer.from_pretrained(model_name)6model = AutoModelForTokenClassification.from_pretrained(model_name)78nlp = pipeline("ner", model=model, tokenizer=tokenizer, aggregation_strategy="simple")910texto =(11"El principio activo SOTALOL HIDROCLORURO puede causar cefaleas "12"con frecuencia muy frecuente en el sistema nervioso."13)1415resultados = nlp(texto)16for entidad in resultados:17print(f"{entidad['word']}: {entidad['entity_group']} (score: {entidad['score']:.4f})")
Estructura del modelo
CIMA-BERTIN-4.8-NER/
├── multitask_model/ # Clasificador multi-tarea (sistema, frecuencia, reacción)
├── ner_model/ # Modelo NER (token classification, formato BIO)
├── system_label_encoder.pkl # Codificador de etiquetas de sistemas orgánicos (26 clases)
├── frequency_label_encoder.pkl # Codificador de etiquetas de frecuencia (6 clases)
├── adverse_reaction_label_encoder.pkl # Codificador de etiquetas de reacciones adversas (1.242 clases)
├── ner_label_mapping.json # Mapeo de IDs a etiquetas NER (BIO)
└── model_info.json # Metadatos del modelo y configuración de entrenamiento
Fuente de datos
Los datos de entrenamiento provienen de CIMA (Centro de Información de Medicamentos Autorizados), servicio del Ministerio de Sanidad de España que contiene las fichas técnicas de todos los medicamentos autorizados.
Si utilizas este modelo en tu investigación, por favor cita:
bibtex
1@thesis{guerrero2026cima,
2 author = {Guerrero Guirado, Luis Miguel},
3 title = {Aplicación de modelos de Inteligencia Artificial para la identificación
4 y catalogación de reacciones adversas de medicamentos},
5 school = {Universidad Nacional de Educación a Distancia (UNED)},
6 year = {2026},
7 type = {Proyecto Fin de Grado},
8 note = {Dirigido por Salvador Ros Muñoz}
9}
Y al modelo base BERTIN:
bibtex
1@article{delarosa2022bertin,
2 author = {de la Rosa, Javier and Ponferrada, Eduardo G. and Romero, Manu
3 and Villegas, Paulo and González de Prado Salas, Pablo and Grandury, María},
4 title = {BERTIN: Efficient Pre-Training of a Spanish Language Model
5 Using Perplexity Sampling},
6 journal = {Procesamiento del Lenguaje Natural},
7 volume = {68},
8 pages = {13--23},
9 year = {2022}
10}
Licencia
Este modelo se distribuye bajo la licencia Apache 2.0.