Retour aux projets
NLP - Recherche

NER & modélisation du langage

Des Transformers à la reconnaissance d'entités nommées : comment adapter un modèle pré-entraîné généraliste à un vocabulaire de domaine, et pourquoi l'évaluation est la partie la plus délicate.

TransformersBERTNERFine-tuning
iamhmh/train_order_resolverLe pipeline complet : génération du jeu de données, modèles CamemBERT, recherche d'itinéraire, API et interface.

Reconnaître une entité, c'est étiqueter une séquence

La reconnaissance d'entités nommées consiste à repérer, dans un texte, les fragments qui désignent quelque chose de précis - une personne, une organisation, un lieu, une date - et à leur attribuer un type. Formellement, ce n'est pas une classification de phrases : c'est un étiquetage de séquence, une décision par token, avec une contrainte de cohérence entre tokens voisins.

D'où le schéma d'annotation BIO, qui distingue le début d'une entité de sa suite et du reste du texte. La distinction paraît anodine ; elle est pourtant ce qui permet au modèle de reconnaître deux entités adjacentes comme deux entités, et non comme une seule.

Le terrain : des requêtes de trajet en français

Le projet sur lequel j'ai poussé ce travail transforme une phrase libre en français - « je voudrais aller d'Épinal à Paris » - en itinéraire ferroviaire sur le réseau SNCF. Il faut donc extraire deux entités, la gare de départ et celle d'arrivée, puis chercher le trajet.

Dit comme ça, une expression régulière semble suffire. Elle ne tient pas trois phrases. L'ordre des mots change (« de X à Y », « à Y depuis X ») ; l'élision colle la préposition au nom (« d'Épinal ») ; des villes portent des noms de personnes (Albert, Florence) ou sont composées de mots courants (Port-Boulet) ; et les utilisateurs écrivent sans accents, avec des fautes et une casse quelconque. Chaque règle ajoutée pour rattraper un cas en casse un autre.

C'est précisément la situation où un modèle de langue vaut mieux qu'un jeu de règles : il n'a pas besoin qu'on lui énumère les gares, il apprend la forme d'une phrase de trajet.

Ce que l'attention change

Avant les Transformers, l'étiquetage de séquence s'appuyait sur des architectures récurrentes, qui traitent le texte de gauche à droite et transmettent un état d'un mot au suivant. Le contexte lointain s'y dilue à mesure qu'il remonte la chaîne.

Le mécanisme d'attention remplace cette transmission en cascade par une mise en relation directe : chaque token calcule un poids vis-à-vis de tous les autres tokens de la séquence, et construit sa représentation comme une somme pondérée de ce qu'il juge pertinent. Un pronom peut ainsi aller chercher son antécédent quinze mots en arrière en une seule étape, et un mot ambigu se désambiguïser par le contexte qui l'entoure des deux côtés.

Pour la NER, c'est déterminant : le même token peut être un nom de personne, une marque ou un lieu selon ce qui l'entoure, et c'est exactement ce que l'attention sait exploiter.

Du modèle pré-entraîné au modèle de domaine

Le modèle de base est CamemBERT, 110 millions de paramètres, pré-entraîné sur du français : il arrive avec une connaissance solide de la langue et aucune connaissance du domaine visé. Le fine-tuning consiste à poursuivre l'entraînement sur un corpus spécialisé, une tête de classification par token posée sur le modèle.

Le corpus, je l'ai généré : 546 patrons de phrases croisés avec 8 973 communes françaises, soit 105 474 phrases, dont j'ai tiré 12 000 exemples pour l'intention et 6 000 pour les entités, annotés en BIO. Sept stratégies d'augmentation - minuscules, suppression des accents, fautes de frappe, ponctuation, casse aléatoire et combinaisons - reproduisent la façon dont les gens écrivent réellement une requête.

Les décisions qui comptent ensuite sont peu nombreuses mais structurantes : le taux d'apprentissage - 5×10⁻⁵ ici ; trop élevé, il efface ce que le pré-entraînement avait acquis ; le nombre d'époques, qu'un corpus de domaine sature vite, trois ont suffi, le F1 de validation passant de 94,75 % à 96,20 % puis 96,81 % ; et le traitement de la segmentation en sous-mots, puisque le tokenizer découpe les noms de gares en morceaux et qu'il faut décider comment réaligner les étiquettes sur les mots d'origine.

Évaluer sérieusement

Une NER s'évalue en précision, rappel et F1 - mais au niveau de l'entité, pas du token. La nuance n'est pas cosmétique : un modèle qui trouve trois des quatre tokens d'une entité n'a pas trouvé l'entité, il a produit une réponse fausse. Compter au token gonfle artificiellement les scores.

Le rappel des classes rares mérite un suivi séparé, pour la même raison que sur des images déséquilibrées : une moyenne globale masque exactement les cas pour lesquels le système a été construit.

Les chiffres, face au système à base de règles

J'avais d'abord construit une référence honnête : TF-IDF pour l'intention, expressions régulières pour les entités. C'est ce qui rend la comparaison lisible - l'écart mesure ce que le modèle de langue apporte vraiment, pas ce qu'il apporte face à rien.

L'extraction exacte des deux gares passe de 33,3 % à 80,7 %. La similarité sur la gare d'arrivée, le point le plus faible du système à base de règles, double presque : 43,6 % à 92,1 %. L'écart y est plus grand que sur le départ, et pour une raison simple : la gare de départ suit le plus souvent une préposition régulière, l'arrivée non.

Le prix est une latence par phrase qui passe de 0,045 ms à 18,3 ms, soit un facteur 400. Sur une requête interactive dont le pipeline complet tient en 100 millisecondes, recherche d'itinéraire comprise, c'est un prix qu'on paie sans réfléchir - mais il fallait le mesurer plutôt que le supposer.

Système à base de règles contre CamemBERT, sur le même jeu de test
Référence (TF-IDF + regex)CamemBERT affiné
Exactitude de l'intention
60,3 %
99,8 %
Extraction exacte des entités
33,3 %
80,7 %
Similarité - gare de départ
70,4 %
92,9 %
Similarité - gare d'arrivée
43,6 %
92,1 %

Chiffres mesurés sur le jeu de test du projet et publiés dans le dépôt. La latence, 0,045 ms contre 18,3 ms par phrase, n'est pas représentée ici : elle ne partage ni l'unité ni l'échelle.

96,81 %
F1 macro du modèle d'entités, après trois époques
~100 ms
Latence du pipeline complet, recherche d'itinéraire comprise
105 474
Phrases générées à partir de 546 patrons et 8 973 communes
3 497
Gares du graphe SNCF, reliées par 10 770 liaisons

Ce que j'en retiens

Le fine-tuning d'un modèle pré-entraîné est rapide à mettre en œuvre et trompeusement facile à mal faire. L'essentiel du travail ne porte pas sur le modèle mais sur ce qui l'entoure : la qualité et la cohérence des annotations, l'alignement des étiquettes après tokenisation, et un protocole d'évaluation qui ne s'auto-félicite pas.

L'autre enseignement est qu'une référence construite sérieusement vaut mieux qu'un bon score isolé. Sans les 33,3 % du système à base de règles, les 80,7 % du modèle ne veulent rien dire.