--- license: mit language: fr library_name: gliner2 tags: [token-classification, ner, biomedical, french, gliner, gliner2, clinical, multi-task] pipeline_tag: token-classification --- # gliner2-fr-biomed-v3e-large — GLiNER2 FR biomédical (backbone large) GLiNER2 français biomédical **multi-task open-vocab** (NER zero-shot + classification + extraction structurée + relations), backbone **MedEmbed-v9** (ModernBERT 149M contrastif biomed FR). Lignée GLiNER / NuNER / GLiNER-biomed. Entraîné sur données **synthétiques** (distillation Qwen3-235B depuis PMC-patients-fr, HAL, istex, wikipédia, textbooks) — **aucun gold de benchmark** (préserve la généralisation zero-shot aux types nouveaux). Variante large (ModernCamemBERT-bio-large) de v3e. ## Utilisation ```python import sys; sys.path.insert(0, "GLiNER2") # fork GLiNER2 from gliner2 import GLiNER2 model = GLiNER2.from_pretrained("rntc/gliner2-fr-biomed-v3e-large") ents = model.extract_entities( "Patient de 65 ans, infarctus du myocarde, sous aspirine 75mg.", {"maladie": "pathologie ou diagnostic", "médicament": "substance thérapeutique"}) print(ents) ``` ## ⚠️ Deux réglages CRUCIAUX pour le recall (lire avant d'évaluer) **1. `max_width` (défaut 8) plafonne le recall.** GLiNER2 ne score que les spans **≤ max_width tokens**. Sur des entités/valeurs longues (ex. registres cliniques, ~58% des spans > 8 tokens) c'est un plafond dur. Le monter recouvre les spans longs (mesuré : det-recall 0.50 → 0.76). Il faut le poser sur **TOUS** les sous-modules (le `SpanMarkerV0` est imbriqué dans `span_rep.span_rep_layer` ; ne mettre que `model.max_width` provoque un mismatch de shape → 0 prédiction) : ```python W = 24 model.max_width = W for _, m in model.named_modules(): if hasattr(m, "max_width"): m.max_width = W ``` **2. Ne pas passer trop de types par appel.** Le modèle a été entraîné avec un nombre **borné** de types par exemple (~≤20). Lui donner des dizaines de types d'un coup est hors-distribution et dégrade précision ET recall. **Batcher les types par groupes de ≤ 20** (ex. par section d'un formulaire) et fusionner les sorties. **Autres conseils** : travailler **document par document** (ne PAS concaténer plusieurs docs → troncature + effondrement du recall) ; `threshold≈0.3` ; tronquer le texte vers ~20000 caractères max. Pour l'extraction de valeurs de formulaire, le **NER plat** (`extract_entities`) est plus fiable que le mode structuré `json_structures` (tête structurée encore sous-entraînée). ## Licence MIT. Modèle de recherche. Pas un dispositif médical.