Instructions to use guerrerotook/CIMA-RoBERTa-4.8-NER with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use guerrerotook/CIMA-RoBERTa-4.8-NER with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("token-classification", model="guerrerotook/CIMA-RoBERTa-4.8-NER")# Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("guerrerotook/CIMA-RoBERTa-4.8-NER", device_map="auto") - Notebooks
- Google Colab
- Kaggle
CIMA-RoBERTa-4.8-NER
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, basado en un modelo RoBERTa biomédico.
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-RoBERTa-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 RoBERTa Biomedical Spanish (PlanTL-GOB-ES/roberta-base-biomedical-es), un modelo RoBERTa pre-entrenado en textos biomédicos y clínicos en español, desarrollado dentro del proyecto PlanTL-GOB-ES (Plan de Tecnologías del Lenguaje del Gobierno de España). Este modelo está específicamente diseñado para el dominio biomédico en español, lo que lo hace especialmente relevante para trabajar con fichas técnicas de medicamentos.
Carrino, C. P., Armengol-Estapé, J., Gutiérrez-Fandiño, A., Llop-Palao, J., Pàmies, M., Gonzalez-Agirre, A., & Villegas, M. (2021). Biomedical and Clinical Language Models for Spanish: On the Benefits of Domain-Specific Pretraining in a Mid-Resource Scenario.
Diferencia con CIMA-BERTIN-4.8-NER
Este proyecto entrena tres modelos de embeddings para comparar diferentes estrategias:
| Modelo | Base | Entrenamiento MLM (4.8) | NER supervisado |
|---|---|---|---|
| CIMA-BERTIN-4.8-NER | BERTIN (español generalista) | Sí | Sí |
| CIMA-RoBERTa-4.8-NER | RoBERTa biomédico | Sí | Sí |
| CIMA-RoBERTa-NER-baseline | RoBERTa biomédico | No | Sí |
CIMA-RoBERTa-4.8-NER parte de un modelo que ya posee conocimiento biomédico (RoBERTa biomédico) y además se refuerza con el entrenamiento MLM sobre las fichas técnicas de medicamentos de CIMA. Esto permite evaluar si el transfer learning adicional con datos de dominio (sección 4.8) beneficia a un modelo que ya es biomédico de origen.
Pipeline de entrenamiento
El entrenamiento se compone de dos fases secuenciales: un entrenamiento no supervisado (MLM) para adaptar el modelo al dominio específico de fichas técnicas de medicamentos, seguido de un entrenamiento supervisado (multi-tarea + NER) para la clasificación de entidades.
┌──────────────────────────┐ ┌──────────────────────────┐ ┌─────────────────────┐
│ RoBERTa Biomedical (ES) │────▶│ Fase 1: MLM (4.8) │────▶│ CIMA-RoBERTa-4.8 │
│ Modelo biomédico │ │ Entrenamiento no │ │ Modelo adaptado │
│ español │ │ supervisado │ │ a fichas técnicas │
└──────────────────────────┘ └──────────────────────────┘ └────────┬────────────┘
│
▼
┌──────────────────────────┐
│ Fase 2: NER │
│ Entrenamiento │
│ supervisado │
└────────┬─────────────────┘
│
▼
┌──────────────────────────┐
│ CIMA-RoBERTa-4.8-NER │
│ Modelo final │
└──────────────────────────┘
Fase 1: Entrenamiento no supervisado — Masked Language Modeling (MLM)
El objetivo de esta fase es adaptar el modelo base RoBERTa biomédico al dominio específico de las fichas técnicas de medicamentos de CIMA, exponiendo al modelo a la terminología y estructura lingüística de la sección 4.8 (reacciones adversas).
A diferencia de CIMA-BERTIN-4.8-NER (donde el modelo base es generalista), aquí el modelo base ya posee conocimiento biomédico. El entrenamiento MLM adicional permite que el modelo se especialice aún más en el subdominio de las reacciones adversas 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.
| Métrica | Valor |
|---|---|
| Ficheros JSON descargados (fichas técnicas completas) | 27.299 |
| Ficheros de texto plano generados (sección 4.8) | 23.280 |
| Tamaño total del texto plano | ~259,4 MB |
| Líneas de texto cargadas | 2.579.304 |
| Total de tokens | 38.386.258 |
Procesamiento de datos
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 |
El modelo MLM resultante ocupa aproximadamente 1,52 GB de espacio en disco.
Fase 2: Entrenamiento supervisado — Multi-tarea + NER
Una vez que el modelo ha sido adaptado al dominio de fichas técnicas mediante MLM, se procede al entrenamiento supervisado compuesto por 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 RoBERTa adaptado en la Fase 1 y emplea tres cabezas de clasificación independientes sobre la representación pooled (token [CLS]):
┌──────────────────────────┐
│ Encoder RoBERTa │
│ (CIMA-RoBERTa-4.8) │
└──────────┬───────────────┘
│
[CLS] pooled
│
Dropout
│
┌─────────────┼─────────────┐
▼ ▼ ▼
┌────────────┐┌────────────┐┌────────────┐
│ Sistema ││ Frecuencia ││ Reacción │
│ (26 cls) ││ (6 cls) ││ (1.242 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
CrossEntropyLossde 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 |
El modelo NER final ocupa aproximadamente 1,02 GB de espacio en disco.
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,89% |
| Sistema orgánico (SYS) | 95,82% |
| Reacción adversa (REACT) | 36,28% |
Métricas globales NER
| Criterio | Precisión | Recall | F1-Score |
|---|---|---|---|
| ent_type | 0.4271 | 0.6512 | 0.5159 |
| exact | 0.2043 | 0.3115 | 0.2468 |
| partial | 0.2043 | 0.3115 | 0.2468 |
| strict | 0.1780 | 0.2713 | 0.2150 |
Métricas por tipo de entidad (criterio ent_type)
| Entidad | Precisión | Recall | F1-Score |
|---|---|---|---|
| ACTIVE (principio activo) | 0.4992 | 0.9939 | 0.6646 |
| REACT (reacción adversa) | 0.3819 | 0.8447 | 0.5260 |
| FREQ (frecuencia) | 0.9474 | 0.0019 | 0.0038 |
| SYS (sistema orgánico) | 0.3927 | 0.3234 | 0.3547 |
Métricas por tipo de entidad (criterio strict)
| Entidad | Precisión | Recall | F1-Score |
|---|---|---|---|
| ACTIVE (principio activo) | 0.2066 | 0.4114 | 0.2751 |
| REACT (reacción adversa) | 0.1877 | 0.4152 | 0.2586 |
| FREQ (frecuencia) | 0.0 | 0.0 | 0.0 |
| SYS (sistema orgánico) | 0.0 | 0.0 | 0.0 |
Análisis de los resultados
Fortalezas:
- Alta precisión en la clasificación multi-tarea de frecuencia (91,89%) y sistema orgánico (95,82%).
- Alto recall en la detección de principios activos (99,39% en ent_type) y reacciones adversas (84,47%).
- Cuando el modelo detecta una frecuencia como entidad NER, lo hace con muy alta precisión (94,74% en ent_type).
Limitaciones:
- El recall de la entidad FREQ es muy bajo (0,19%), lo que indica que el modelo rara vez etiqueta frecuencias a nivel de token aunque las clasifica bien a nivel multi-tarea.
- El recall de SYS es moderado (32,34% en ent_type), significativamente menor que en el modelo BERTIN.
- La coincidencia exacta de spans es baja para todas las entidades, especialmente para FREQ y SYS donde es nula en modo strict.
- Se observan 2.399 predicciones alucinadas (no presentes en la verdad de referencia).
Comparación con CIMA-BERTIN-4.8-NER
| Métrica | CIMA-BERTIN-4.8-NER | CIMA-RoBERTa-4.8-NER |
|---|---|---|
| F1 ent_type (global) | 0.6074 | 0.5159 |
| Recall ent_type (global) | 0.9087 | 0.6512 |
| Accuracy FREQ (multi-tarea) | 91,79% | 91,89% |
| Accuracy SYS (multi-tarea) | 95,34% | 95,82% |
| Accuracy REACT (multi-tarea) | 60,30% | 36,28% |
| F1 REACT ent_type | 0.7184 | 0.5260 |
| F1 ACTIVE ent_type | 0.5751 | 0.6646 |
El modelo BERTIN muestra un recall significativamente superior en la detección global de entidades (90,87% vs 65,12%), mientras que el modelo RoBERTa biomédico presenta ventajas en la precisión de clasificación multi-tarea para frecuencia y sistema.
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 identifica entidades con buen recall, la coincidencia exacta de los límites de las entidades es baja, especialmente para frecuencias y sistemas orgánicos.
- Frecuencias a nivel NER: La detección de frecuencias como tokens individuales es deficiente a pesar de que la clasificación multi-tarea funciona bien.
- Idioma: El modelo está diseñado y entrenado exclusivamente para textos en español.
Uso
from transformers import AutoTokenizer, AutoModelForTokenClassification, pipeline
model_name = "guerrerotook/CIMA-RoBERTa-4.8-NER"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForTokenClassification.from_pretrained(model_name)
nlp = pipeline("ner", model=model, tokenizer=tokenizer, aggregation_strategy="simple")
texto = (
"El principio activo SOTALOL HIDROCLORURO puede causar cefaleas "
"con frecuencia muy frecuente en el sistema nervioso."
)
resultados = nlp(texto)
for entidad in resultados:
print(f"{entidad['word']}: {entidad['entity_group']} (score: {entidad['score']:.4f})")
Estructura del modelo
CIMA-RoBERTa-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.
- API REST de CIMA: https://cima.aemps.es/cima/rest/
- Sección utilizada: 4.8 — Reacciones adversas
- Listado de medicamentos: https://listadomedicamentos.aemps.gob.es/Medicamentos.xls
Framework y dependencias
| Componente | Tecnología |
|---|---|
| Lenguaje | Python |
| Entrenamiento | Hugging Face Transformers |
| Carga de datos | Hugging Face Datasets |
| Evaluación NER | nervaluate |
| Métricas | scikit-learn |
| GPU | NVIDIA RTX 5090 |
Cita
Si utilizas este modelo en tu investigación, por favor cita:
@thesis{guerrero2026cima,
author = {Guerrero Guirado, Luis Miguel},
title = {Aplicación de modelos de Inteligencia Artificial para la identificación
y catalogación de reacciones adversas de medicamentos},
school = {Universidad Nacional de Educación a Distancia (UNED)},
year = {2026},
type = {Proyecto Fin de Grado},
note = {Dirigido por Salvador Ros Muñoz}
}
Y al modelo base RoBERTa biomédico:
@article{carrino2021biomedical,
author = {Carrino, Casimiro Pio and Armengol-Estapé, Jordi and Gutiérrez-Fandiño, Asier
and Llop-Palao, Joan and Pàmies, Marc and Gonzalez-Agirre, Aitor and Villegas, Marta},
title = {Biomedical and Clinical Language Models for Spanish: On the Benefits of
Domain-Specific Pretraining in a Mid-Resource Scenario},
year = {2021}
}
Licencia
Este modelo se distribuye bajo la licencia cc-by-4.0.
Model tree for guerrerotook/CIMA-RoBERTa-4.8-NER
Base model
PlanTL-GOB-ES/roberta-base-biomedical-es