--- language: - es license: cc-by-4.0 tags: - ner - named-entity-recognition - biomedical - adverse-drug-reactions - spanish - transformers - roberta - token-classification datasets: - custom base_model: PlanTL-GOB-ES/roberta-base-biomedical-es pipeline_tag: token-classification --- # CIMA-RoBERTa-NER-baseline 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 es el modelo **baseline** que parte directamente del modelo RoBERTa biomédico **sin** entrenamiento previo no supervisado (MLM) sobre las fichas técnicas de medicamentos. 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-NER-baseline es un modelo de clasificación de tokens (NER) que sirve como **línea base** en el diseño experimental del proyecto. A diferencia de los otros dos modelos del proyecto (CIMA-BERTIN-4.8-NER y CIMA-RoBERTa-4.8-NER), este modelo **omite la fase de entrenamiento no supervisado (MLM)** sobre la sección 4.8 de las fichas técnicas de medicamentos, pasando directamente del modelo base al entrenamiento supervisado NER. Su propósito es evaluar si el entrenamiento MLM adicional con datos de dominio aporta una mejora significativa en la tarea de NER, comparándolo con un modelo que ya posee conocimiento biomédico de origen. El modelo reconoce cuatro tipos de entidades: | 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`](https://huggingface.co/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*. ## Rol como modelo baseline en el diseño experimental Este proyecto entrena tres modelos de embeddings para comparar diferentes estrategias de *transfer learning*: | 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í** | La comparación entre **CIMA-RoBERTa-4.8-NER** y **CIMA-RoBERTa-NER-baseline** permite aislar el efecto del entrenamiento MLM adicional: ambos modelos parten de la misma base (RoBERTa biomédico) y reciben el mismo entrenamiento supervisado, pero solo el primero ha sido previamente adaptado a las fichas técnicas de medicamentos mediante MLM. Esto permite determinar si el *transfer learning* adicional con datos de dominio específico (sección 4.8) beneficia a un modelo que ya posee conocimiento biomédico. ## Pipeline de entrenamiento A diferencia de los otros modelos del proyecto, **este modelo tiene una única fase de entrenamiento**: el entrenamiento supervisado (multi-tarea + NER) directamente sobre el modelo base RoBERTa biomédico. ``` ┌──────────────────────────┐ ┌──────────────────────────┐ ┌───────────────────────────┐ │ RoBERTa Biomedical (ES) │────▶│ Entrenamiento │────▶│ CIMA-RoBERTa-NER-baseline│ │ Modelo biomédico │ │ supervisado │ │ Modelo final │ │ español │ │ (Multi-tarea + NER) │ │ │ └──────────────────────────┘ └──────────────────────────┘ └───────────────────────────┘ ``` > **Nota**: No se realiza la Fase 1 (MLM) que sí se aplica en CIMA-BERTIN-4.8-NER y CIMA-RoBERTa-4.8-NER. ### Entrenamiento supervisado — Multi-tarea + NER #### 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: 1. *"El principio activo {principio_activo} del medicamento {medicamento} causa {reaccion_adversa}"* 2. *"{reaccion_adversa} es una reacción adversa de {principio_activo}"* 3. *"Reacción adversa: {reaccion_adversa} con frecuencia {frecuencia} en el {sistema}"* 4. *"Efecto secundario de {principio_activo}: {reaccion_adversa}"* 5. *"Síntoma reportado: {reaccion_adversa}"* 6. *"El tratamiento con {principio_activo} puede producir {reaccion_adversa} en el {sistema} con una frecuencia de {frecuencia}."* 7. *"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 biomédico y emplea tres cabezas de clasificación independientes sobre la representación *pooled* (token `[CLS]`): ``` ┌──────────────────────────┐ │ Encoder RoBERTa │ │ Biomédico (base) │ └──────────┬───────────────┘ │ [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 `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 | #### Infraestructura | Recurso | Detalle | |---|---| | GPU | NVIDIA RTX 5090 | | Sistema operativo | Windows 11 + WSL | 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**](https://github.com/MantisAI/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) | **95,98%** | | Sistema orgánico (SYS) | **96,04%** | | Reacción adversa (REACT) | **36,19%** | ### Métricas globales NER | Criterio | Precisión | Recall | F1-Score | |---|---|---|---| | **ent_type** | **0.6890** | **0.6980** | **0.6935** | | exact | 0.0683 | 0.0692 | 0.0687 | | partial | 0.0683 | 0.0692 | 0.0687 | | strict | 0.0683 | 0.0692 | 0.0687 | ### Métricas por tipo de entidad (criterio ent_type) | Entidad | Precisión | Recall | F1-Score | |---|---|---|---| | **ACTIVE** (principio activo) | **0.7816** | **0.9168** | **0.8438** | | **REACT** (reacción adversa) | 0.6048 | **0.9323** | **0.7337** | | **SYS** (sistema orgánico) | **0.8047** | 0.5443 | 0.6494 | | **FREQ** (frecuencia) | 0.6250 | 0.0011 | 0.0021 | ### Análisis de los resultados **Fortalezas:** - **Mejor F1 global en ent_type (0.6935)** de los tres modelos de embeddings del proyecto, con un buen equilibrio entre precisión (68,90%) y recall (69,80%). - Excelente rendimiento en la detección de principios activos (F1: 0.8438) con alta precisión (78,16%) y alto recall (91,68%). - Buena detección de reacciones adversas (F1: 0.7337) con recall del 93,23%. - Alta precisión en la clasificación multi-tarea de frecuencia (95,98%) y sistema orgánico (96,04%) — las más altas de los tres modelos. - Alta precisión en la detección de sistemas orgánicos a nivel NER (80,47%). **Limitaciones:** - La coincidencia exacta de spans es muy baja (F1 exact/strict: 0.0687), indicando dificultades para delimitar correctamente los límites exactos de las entidades. - El recall de FREQ a nivel NER es prácticamente nulo (0,11%), aunque la clasificación multi-tarea funciona correctamente. - El recall de SYS es moderado (54,43%), lo que indica que el modelo no detecta cerca de la mitad de los sistemas orgánicos presentes en el texto. - Se observan 2.266 predicciones alucinadas (no presentes en la verdad de referencia). ### Comparación con los otros modelos del proyecto | Métrica | CIMA-BERTIN-4.8-NER | CIMA-RoBERTa-4.8-NER | **CIMA-RoBERTa-NER-baseline** | |---|---|---|---| | F1 ent_type (global) | 0.6074 | 0.5159 | **0.6935** | | Precisión ent_type (global) | 0.4562 | 0.4271 | **0.6890** | | Recall ent_type (global) | **0.9087** | 0.6512 | 0.6980 | | Accuracy FREQ (multi-tarea) | 91,79% | 91,89% | **95,98%** | | Accuracy SYS (multi-tarea) | 95,34% | 95,82% | **96,04%** | | Accuracy REACT (multi-tarea) | **60,30%** | 36,28% | 36,19% | | F1 ACTIVE ent_type | 0.5751 | 0.6646 | **0.8438** | | F1 REACT ent_type | 0.7184 | 0.5260 | **0.7337** | | F1 SYS ent_type | 0.5277 | 0.3547 | **0.6494** | **Observaciones clave:** - El modelo baseline (sin MLM) obtiene el **mejor F1 global** y la **mejor precisión** de los tres modelos, lo que sugiere que el entrenamiento MLM adicional sobre la sección 4.8 no mejora el rendimiento NER en este caso concreto y puede incluso introducir ruido. - El modelo BERTIN mantiene el **recall más alto** (90,87%), detectando más entidades pero con menor precisión. - El baseline destaca en la detección de principios activos (F1: 0.8438), superando ampliamente a los otros dos modelos. ## 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**: La coincidencia exacta de los límites de las entidades es muy baja (F1 strict: 0.0687), lo que indica dificultades significativas para determinar dónde empieza y termina cada entidad. - **Frecuencias a nivel NER**: La detección de frecuencias como tokens individuales es deficiente a pesar de que la clasificación multi-tarea funciona correctamente (95,98%). - **Idioma**: El modelo está diseñado y entrenado exclusivamente para textos en español. ## Uso ```python from transformers import AutoTokenizer, AutoModelForTokenClassification, pipeline model_name = "guerrerotook/CIMA-RoBERTa-NER-baseline" 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-NER-baseline/ ├── 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 supervisado provienen de un dataset anotado y verificado por profesionales sanitarios, con reacciones adversas de medicamentos registrados en **CIMA** (Centro de Información de Medicamentos Autorizados) del Ministerio de Sanidad de España. - **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: ```bibtex @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: ```bibtex @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](https://creativecommons.org/licenses/by/4.0/).