🛡️ Anonymiseur-Lycéen

Modèle CamemBERT fine-tuné pour l'anonymisation automatique de copies d'élèves.

Détecte et annote les données personnelles dans les textes scolaires français : noms, prénoms, établissements, classes, numéros étudiants, adresses, professions des parents, etc.

📊 Dataset d'entraînement : XenocodeRCE/anonymiseur-lyceen-dataset — 282 copies d'élèves synthétiques générées avec Mistral 7B.


📊 Statistiques d'entraînement

Métrique Valeur
Modèle de base camembert-base (110M params)
Exemples d'entraînement 226
Exemples de validation 56
Époques 30
Batch size 8
Learning rate 5e-5
Optimizer AdamW (weight_decay=0.01)
Stratégie Class weights (anti-déséquilibre)
Eval loss finale 0.95
Train loss finale 0.76
Taille du modèle 420 MB
GPU NVIDIA RTX A4500 (20 Go)
Temps d'entraînement ~8 min (GPU)

Évolution de la perte

Époque Eval Loss
1 2.44
5 1.44
10 1.18
15 1.06
20 0.99
25 0.96
30 0.95

🏷️ Entités détectées (8 types)

Entité Description Exemple
PRENOM Prénom de l'élève ou d'un proche Marie, Kévin, Jean-Marc
NOM Nom de famille Dupont, Lefebvre, Cohen
ETABLISSEMENT Nom du lycée/collège Lycée Baudelaire, Lycée Jean Moulin
CLASSE Niveau et filière Terminale G, Première S, Terminale STMG
NUMERO_ETUDIANT INE ou numéro d'inscription 2024-7831, FR-992831, 2025-4492-X
ADRESSE Adresse postale 42 rue des Glycines, 54000 Nancy
PROFESSION Métier d'un parent médecin, infirmière, comptable
VILLE Ville de résidence ou naissance Lyon, Arles, Strasbourg

Distribution des entités dans le dataset d'entraînement

O                : 17513 tokens (90.0%)
I-ETABLISSEMENT  :   364 tokens ( 1.9%)
I-ADRESSE        :   318 tokens ( 1.6%)
I-CLASSE         :   224 tokens ( 1.2%)
I-NUMERO_ETUDIANT:   186 tokens ( 1.0%)
B-PRENOM         :   139 tokens ( 0.7%)
B-NOM            :   134 tokens ( 0.7%)
B-ETABLISSEMENT  :    74 tokens ( 0.4%)
B-CLASSE         :    72 tokens ( 0.4%)
B-PROFESSION     :    72 tokens ( 0.4%)
B-ADRESSE        :    42 tokens ( 0.2%)
B-NUMERO_ETUDIANT:    40 tokens ( 0.2%)

🚀 Utilisation

Installation

pip install transformers torch

Avec le pipeline Hugging Face

from transformers import pipeline

ner = pipeline("ner", model="XenocodeRCE/anonymiseur-lyceen", aggregation_strategy="simple")

texte = "Je m'appelle Pierre Dupont, je suis au Lycée Baudelaire à Lyon."
resultats = ner(texte)

for ent in resultats:
    print(f"[{ent['entity_group']}] {ent['word']} ({round(ent['score']*100)}%)")

Sortie :

[PRENOM] Pierre (48%)
[NOM] Dupont (51%)
[ETABLISSEMENT] Lycée Baudelaire à Lyon (47%)

Avec PyTorch (niveau avancé)

from transformers import AutoTokenizer, AutoModelForTokenClassification
import torch

model_path = "XenocodeRCE/anonymiseur-lyceen"
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForTokenClassification.from_pretrained(model_path)

texte = "Sarah Cohen, Terminale G au Lycée International de Strasbourg."
inputs = tokenizer(texte, return_tensors="pt")

with torch.no_grad():
    outputs = model(**inputs)
    predictions = torch.argmax(outputs.logits, dim=-1)

tokens = tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
labels = [model.config.id2label[p.item()] for p in predictions[0]]

for token, label in zip(tokens, labels):
    if label != "O":
        print(f"{token:15s} -> {label}")

Via l'API Hugging Face

import requests

API_URL = "https://api-inference.huggingface.co/models/XenocodeRCE/anonymiseur-lyceen"
headers = {"Authorization": "Bearer VOTRE_TOKEN_HF"}

response = requests.post(API_URL, headers=headers, json={
    "inputs": "Je m'appelle Pierre Dupont, élève au Lycée Baudelaire à Lyon."
})
print(response.json())

📈 Performances

Exemples réels

Texte Entités détectées Scores
"Pierre Dupont, Lycée Baudelaire à Lyon" PRENOM: Pierre, NOM: Dupont, ETABLISSEMENT: Lycée Baudelaire, VILLE: Lyon 64-70%
"Jean-Marc Martin, médecin, 15 av. des Champs-Élysées" PRENOM: Jean-Marc, NOM: Martin, PROFESSION: médecin, ADRESSE: 15 av... 63-67%
"Kévin Dubois, 2025-4492-X, Terminale STMG" PRENOM: Kevin, NOM: Dubois, NUMERO_ETUDIANT: 2025-4492-X, CLASSE: Terminale STMG 64-68%
"Marie Lefebvre, 42 rue des Glycines à Arles" PRENOM: Marie, NOM: Lefebvre, ADRESSE: 42 rue des Glycines, VILLE: Arles 63-67%

Limites connues

  • ⚠️ Faux positifs possibles sur les noms de personnes célèbres (ex: Victor Hugo) — des exemples négatifs sont présents dans le dataset mais le modèle n'est pas parfait
  • ⚠️ Bruit résiduel sur la ponctuation et les mots courts (,, ', au, en)
  • 📈 Scores en nette progression (63-70% vs 47-53% précédemment) grâce au dataset 3.5× plus grand
  • 🆕 VILLE maintenant détecté correctement (Lyon, Arles, Strasbourg...)
  • 🚫 Pas encore de détection des dates de naissance, emails, téléphones (classes rares)

🔄 Ré-entraînement

Le script train.py contient tout le nécessaire pour reproduire l'entraînement :

python generate_dataset.py   # Génère les données via LM Studio (LLM local)
python train.py              # Lance l'entraînement avec class weights
python test_model.py         # Teste le modèle localement

Points clés de l'entraînement

  • Class weights : les classes rares (ex: B-NUMERO_ETUDIANT) sont pondérées jusqu'à 437× plus que la classe O pour compenser le déséquilibre (90% des tokens sont O)
  • 30 époques nécessaires pour que le modèle apprenne les classes minoritaires
  • Sans class weights : le modèle prédit O partout (stratégie paresseuse)

📁 Structure du projet

anonymiseur-lyceen/
├── config.json              # Configuration du modèle
├── model.safetensors        # Poids du modèle (420 MB)
├── tokenizer.json           # Tokenizer SentencePiece
├── tokenizer_config.json    # Configuration du tokenizer
├── sentencepiece.bpe.model  # Vocabulaire BPE
└── README.md                # Ce fichier

⚖️ Licence

MIT — Utilisation libre, y compris commerciale.


🙏 Remerciements

  • CamemBERT — Modèle de langue français pré-entraîné par l'Inria
  • Hugging Face — Infrastructure d'entraînement et de déploiement
  • Données générées synthétiquement via LM Studio (Gemma 4 12B)

Model description

More information needed

Intended uses & limitations

More information needed

Training and evaluation data

More information needed

Training procedure

Training hyperparameters

The following hyperparameters were used during training:

  • learning_rate: 5e-05
  • train_batch_size: 8
  • eval_batch_size: 8
  • seed: 42
  • optimizer: Use adamw_torch with betas=(0.9,0.999) and epsilon=1e-08 and optimizer_args=No additional optimizer arguments
  • lr_scheduler_type: linear
  • num_epochs: 10

Training results

Training Loss Epoch Step Validation Loss
No log 1.0 10 1.6000
No log 2.0 20 1.2571
No log 3.0 30 1.1538
No log 4.0 40 1.1063
No log 5.0 50 1.0734
No log 6.0 60 1.0496
No log 7.0 70 1.0320
No log 8.0 80 1.0187
No log 9.0 90 1.0096
No log 10.0 100 1.0065

Framework versions

  • Transformers 4.48.0
  • Pytorch 2.12.1+cpu
  • Datasets 3.2.0
  • Tokenizers 0.21.4
Downloads last month
182
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 XenocodeRCE/anonymiseur-lyceen

Finetuned
(167)
this model

Dataset used to train XenocodeRCE/anonymiseur-lyceen

Evaluation results

  • Perte d'évaluation on XenocodeRCE/anonymiseur-lyceen-dataset
    self-reported
    0.950
  • Perte d'entraînement on XenocodeRCE/anonymiseur-lyceen-dataset
    self-reported
    0.760