XenocodeRCE/anonymiseur-lyceen-dataset
Viewer • Updated • 282 • 23
How to use XenocodeRCE/anonymiseur-lyceen with Transformers:
# Use a pipeline as a high-level helper
from transformers import pipeline
pipe = pipeline("token-classification", model="XenocodeRCE/anonymiseur-lyceen") # Load model directly
from transformers import AutoTokenizer, AutoModelForTokenClassification
tokenizer = AutoTokenizer.from_pretrained("XenocodeRCE/anonymiseur-lyceen")
model = AutoModelForTokenClassification.from_pretrained("XenocodeRCE/anonymiseur-lyceen")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 |
Base model
almanach/camembert-base