Downloads · 30 days
16
7% of all-time downloads
XenocodeRCE/anonymiseur-lyceen
anonymiseur-lyceen is a token classification model from XenocodeRCE. Use it when you need labels on individual words, such as names. It is set up for transformers. The card lists the license as mit.
Modèle CamemBERT fine-tuné pour l'anonymisation automatique de copies d'élèves.
Downloads · 30 days
16
7% of all-time downloads
All-time downloads
237
Public
Parameters
110M
1.3 GB on disk
Likes
0
Public
Click a slice to open those files.
.safetensors440 MB · 99%
From the Hugging Face model README
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.
| 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) |
| É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é | 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 |
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%)
pip install transformers torch
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%)
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}")
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())
| 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% |
,, ', au, en)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
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)O partout (stratégie paresseuse)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
MIT — Utilisation libre, y compris commerciale.
More information needed
More information needed
More information needed
The following hyperparameters were used during training:
| 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 |