bert-base-uncased-finetuned-ner-prostata

Modelo de reconocimiento de entidades nombradas (NER) para textos clínicos en español sobre cáncer de próstata. Es un fine-tuning de bert-base-uncased para clasificación de tokens con esquema de etiquetado BIO.

Uso educativo y de investigación. No está validado para uso clínico ni para tomar decisiones sobre pacientes.

Entidades

El modelo predice 10 tipos de entidad (esquema BIO, 21 etiquetas contando O):

Entidad Descripción Ejemplo
CANCER Diagnóstico / tipo de tumor adenocarcinoma de próstata
GLEASON Puntuación de Gleason Gleason 7 (3+4)
TNM Estadificación TNM cT2c N0 M0
BIOMARCADOR Biomarcadores PSA 12 ng/ml
TRATAMIENTO Tratamientos y terapias radioterapia externa
MEDICAMENTO Fármacos bicalutamida
DOSIS Dosis y pautas 50 mg/día
CIRUGIA Procedimientos quirúrgicos prostatectomía radical
FECHA Fechas 15/03/2023
EDAD Edad del paciente 68 años

Cómo usarlo

Con pipeline (recomendado)

from transformers import pipeline

ner = pipeline(
    "token-classification",
    model="Test-FineTuning/bert-base-uncased-finetuned-ner-prostata",
    aggregation_strategy="simple",   # une los sub-tokens en entidades completas
)

texto = ("Varón de 68 años con adenocarcinoma de próstata Gleason 7 (3+4), estadio cT2c N0 M0. "
         "Se realiza prostatectomía radical el 15/03/2023 y posteriormente recibe bicalutamida 50 mg/día.")

for ent in ner(texto):
    print(f"{ent['word']:<30} {ent['entity_group']:<12} score={ent['score']:.3f}")

Cada elemento devuelto tiene word, entity_group, score, start y end (posiciones en el texto original). Sin aggregation_strategy se obtiene una predicción por sub-token, con prefijos B- / I-.

Con AutoModel (control manual)

import torch
from transformers import AutoTokenizer, AutoModelForTokenClassification

repo = "Test-FineTuning/bert-base-uncased-finetuned-ner-prostata"
tokenizer = AutoTokenizer.from_pretrained(repo)
model = AutoModelForTokenClassification.from_pretrained(repo)

texto = "Paciente de 72 años, biopsia con adenocarcinoma acinar Gleason 4+3=7, PSA 12 ng/ml."
inputs = tokenizer(texto, return_tensors="pt", truncation=True, max_length=512)
with torch.no_grad():
    logits = model(**inputs).logits

pred_ids = logits.argmax(dim=-1)[0].tolist()
tokens = tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
for tok, pid in zip(tokens, pred_ids):
    if tok not in tokenizer.all_special_tokens:
        print(f"{tok:<15} {model.config.id2label[pid]}")

En Google Colab

Hay un notebook de inferencia con visualización de entidades resaltadas (mama y próstata) en el material del curso: NER_inferencia_mama_prostata_Colab.ipynb.

Datos de entrenamiento

Corpus anotado en formato .bio (token + etiqueta), proporcionado por el docente responsable del proyecto. No se publica con este modelo.

Partición Oraciones Tokens
train 3 106 67 934
valid 929 16 803
test 991 20 862

Limpieza aplicada: se detectaron y corrigieron a O dos etiquetas corruptas en el corpus (, en validation_cleaned.bio línea 1401 y 0 —cero— en lugar de O en testing_cleaned.bio línea 17566).

Entrenamiento

Hiperparámetro Valor
Modelo base bert-base-uncased
Épocas 10
Learning rate 2e-5
Batch size 8 (train y eval)
Weight decay 0.01
Longitud máxima 512 tokens
Precisión mixta fp16
Semilla 42
Selección del modelo mejor F1 en validación (load_best_model_at_end) → época 8
Hardware 1 × NVIDIA T4 (Google Colab), ~13 min

Solo el primer sub-token de cada palabra recibe etiqueta; el resto y los tokens especiales se ignoran en la pérdida (-100).

Evolución en validación:

Época Train loss Val loss Precision Recall F1
1 0.1638 0.0881 0.868 0.910 0.888
2 0.0797 0.0537 0.899 0.941 0.920
3 0.0474 0.0311 0.963 0.966 0.965
4 0.0342 0.0294 0.957 0.968 0.963
5 0.0152 0.0246 0.972 0.973 0.973
6 0.0183 0.0209 0.977 0.975 0.976
7 0.0190 0.0214 0.982 0.977 0.980
8 0.0124 0.0225 0.981 0.981 0.981
9 0.0082 0.0229 0.983 0.979 0.981
10 0.0099 0.0212 0.982 0.979 0.981

Evaluación

Resultados en la partición test (evaluada una sola vez con el mejor modelo), métricas seqeval a nivel de entidad:

Precision Recall F1 Accuracy (token)
0.9628 0.9691 0.9659 0.9935

Por tipo de entidad:

Entidad Precision Recall F1 Soporte
BIOMARCADOR 0.981 0.986 0.983 208
CANCER 0.957 0.967 0.962 364
CIRUGIA 0.892 0.892 0.892 65
DOSIS 0.912 0.931 0.921 189
EDAD 0.963 0.975 0.969 80
FECHA 0.995 0.993 0.994 401
GLEASON 0.912 0.912 0.912 160
MEDICAMENTO 0.994 0.994 0.994 164
TNM 0.989 1.000 0.995 93
TRATAMIENTO 0.964 0.976 0.970 250
micro avg 0.963 0.969 0.966 1974

Limitaciones y sesgos

  • Modelo base en inglés. bert-base-uncased fue preentrenado en inglés y no distingue mayúsculas ni tildes; el vocabulario no está optimizado para español clínico, por lo que palabras médicas poco frecuentes se fragmentan en muchos sub-tokens. Un modelo base en español o biomédico podría mejorar los resultados.
  • Dominio estrecho. Solo cubre cáncer de próstata y las 10 entidades listadas. En otros tipos de cáncer, o con otro estilo de redacción, el rendimiento puede caer de forma notable.
  • Corpus pequeño (~3 100 oraciones de entrenamiento) y, probablemente, con vocabulario y plantillas repetitivas; las métricas altas en test pueden no reflejar el rendimiento en notas clínicas de otras instituciones.
  • Las entidades más difíciles fueron CIRUGIA, GLEASON y DOSIS (F1 ≈ 0.89–0.92).
  • Textos largos se truncan a 512 tokens.
  • No usar para diagnóstico, tratamiento ni decisiones clínicas.

Modelos relacionados

Cita

Si usas este modelo en tu trabajo, indica el nombre del repositorio, a su autor (Carlos Andres Borja, fine-tuning) y el modelo base (bert-base-uncased, Devlin et al., 2019).

Downloads last month
3
Safetensors
Model size
0.1B params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for Test-FineTuning/bert-base-uncased-finetuned-ner-prostata

Finetuned
(7046)
this model