MrBERT-es LD1–PE2 — Clasificador multi-etiqueta de posiciones políticas (Costa Rica)

Modelo de clasificación multi-etiqueta de textos de política pública costarricense en 39 categorías de posición (LD1–PE2) del esquema Manifesto Project adaptado por el Programa Estado de la Nación (PEN), organizadas en 7 dominios. Un mismo texto puede pertenecer a varias categorías a la vez.

  • Encoder base: BSC-LT/MrBERT-es (ModernBERT, contexto de 8192 tokens).
  • Método: destilación de conocimiento a partir de un teacher LLM (Qwen3-30B-A3B-Instruct-2507), con soft labels por categoría (método logit A/B, pregunta del manual PEN) y pérdida BCE Bernoulli independiente por etiqueta.
  • Corpus de destilación: 38 812 textos de tres dominios — propuestas de programa de gobierno, actas legislativas de control político y noticias de medios.
  • Formato: ModernBertForSequenceClassification estándar — se carga con from_pretrained, sin trust_remote_code.

Los 7 dominios y 39 categorías

Dominio # categorías
Libertad y Democracia (LD) 3
Sistema Político (SP) 4
Economía (ECO) 10
Bienestar y Calidad de Vida (BCD) 7
Tejido Social (TS) 8
Clases Sociales (CS) 5
Política Exterior (PE) 2

Uso rápido

El modelo emite una probabilidad por cada una de las 39 categorías. La probabilidad de cada dominio se deriva por el módulo de máxima restricción (MCM): el máximo de las probabilidades de sus categorías hijas. La función clasificar devuelve ambos niveles estructurados.

import torch, numpy as np
from transformers import AutoModelForSequenceClassification, AutoTokenizer

repo = "PENCR/mrbert-es-ld1-pe2-multilabel"
tok = AutoTokenizer.from_pretrained(repo)
model = AutoModelForSequenceClassification.from_pretrained(repo).eval()

def clasificar(texto, max_length=512):
    enc = tok(texto, truncation=True, max_length=max_length, return_tensors="pt")
    with torch.no_grad():
        p = torch.sigmoid(model(**enc).logits)[0].numpy()      # (39,) prob por categoría
    cfg = model.config
    parent = {int(k): int(v) for k, v in cfg.spml_parent_of.items()}
    umbral = np.array(cfg.spml_umbrales_por_categoria)
    dom_nom = {int(k): v for k, v in cfg.spml_dominio_idx_names.items()}
    salida = []
    for d in range(len(dom_nom)):
        hijos = [s for s in range(39) if parent[s] == d]
        cats = sorted([{"categoria": cfg.id2label[s], "prob": round(float(p[s]), 3),
                         "activo": bool(p[s] >= umbral[s])} for s in hijos], key=lambda x: -x["prob"])
        salida.append({"dominio": dom_nom[d], "prob_dominio": round(float(p[hijos].max()), 3),
                        "categorias": cats})
    return sorted(salida, key=lambda x: -x["prob_dominio"])

texto = ("Reformar el Codigo Penal para aumentar las penas y fortalecer la seguridad ciudadana.")
for d in clasificar(texto):
    print(f"{d['prob_dominio']:.3f}  {d['dominio']}")
    for c in d["categorias"]:
        if c["activo"]: print(f"         · {c['prob']:.3f}  {c['categoria']}")

Umbral por categoría

Cada categoría tiene un umbral propio calibrado (rango 0.1–0.9), en model.config.spml_umbrales_por_categoria (39 valores). Usar el umbral por categoría en lugar de un 0.5 uniforme reduce la sobre-predicción y mejora el F1.

Rendimiento

Evaluado sobre un conjunto held-out de propuestas de gobierno 2026 (PLN + PPSO, n=1340, con etiqueta humana nativa de las 39 categorías, cardinalidad humana 2.01):

Métrica Valor
F1-micro (umbral por categoría) 0.515
F1-macro 0.423
mAP 0.408
recall@3 / recall@5 0.678 / 0.818
cardinalidad predicha 3.75

Por soporte: el modelo es fiable en las categorías frecuentes (AP medio 0.61 en las 11 categorías con ≥80 ejemplos; p.ej. Protección del medio ambiente AP 0.82, Tecnología e infraestructura 0.79, Ley y orden 0.76) y ruidoso en las raras — sobre todo las categorías de posición negativa del esquema Manifesto, escasas en el discurso programático. Es un límite del tamaño del dato, no de la arquitectura. Fidelidad al teacher (held-out de destilación): correlación de probabilidades 0.869, MAE 0.071.

Detalles del modelo

  • Arquitectura: MrBERT-es (ModernBERT) + cabeza de clasificación de secuencia estándar, 39 salidas, activación sigmoidal por etiqueta, pooling sobre el token CLS.
  • Esquema: 39 categorías de posición Manifesto Project adaptadas por el PEN (LD1–PE2), 7 dominios.
  • Idioma: español.

Citación

Encoder: Tamayo, D. et al. (2026). MrBERT: Modern Multilingual Encoders via Vocabulary, Domain, and Dimensional Adaptation. arXiv:2602.21379. Barcelona Supercomputing Center — Language Technologies Lab. · Arquitectura base ModernBERT: Warner, B. et al. (2024). arXiv:2412.13663. · Teacher: Yang, A. et al. (2025). Qwen3 Technical Report. arXiv:2505.09388.

Infraestructura: entrenado en la supercomputadora Kabré del Centro Nacional de Alta Tecnología de Costa Rica (CeNAT/CNCA).


Modelo desarrollado para el Programa Estado de la Nación (PEN) — clasificación de las variables de posición política LD1–PE2.

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

Model tree for PENCR/mrbert-es-ld1-pe2-multilabel

Base model

BSC-LT/MrBERT
Finetuned
BSC-LT/MrBERT-es
Finetuned
(14)
this model

Papers for PENCR/mrbert-es-ld1-pe2-multilabel