File size: 10,667 Bytes
9ae5f4f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
---
language: fr
license: mit
tags:
- token-classification
- named-entity-recognition
- french
- camembert
- distillation
- pruning
- fp16
- medical
- social-work
base_model: Jean-Baptiste/camembert-ner
datasets:
- custom-medical-social-corpus
metrics:
- f1
- precision
- recall
model-index:
- name: CamemBERT-NER-Distilled-Pruned-FP16
  results:
  - task:
      type: token-classification
      name: Named Entity Recognition
    metrics:
    - name: F1
      type: f1
      value: 0.859
    - name: Precision
      type: precision
      value: 0.861
    - name: Recall
      type: recall
      value: 0.858
---

# CamemBERT-NER Distilled + Pruned + FP16

**Modèle optimisé pour la reconnaissance d'entités nommées (NER) dans les rapports sociaux français**

[![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
[![Model](https://img.shields.io/badge/Model-CamemBERT-green.svg)](https://huggingface.co/camembert-base)

## 📋 Description

Ce modèle est une version optimisée triple de CamemBERT pour la reconnaissance d'entités nommées (NER) dans le domaine du travail social français. Il combine :

1. **Distillation** : 11 couches (vs 12 du teacher) = -8.3% paramètres
2. **Pruning non-structurel** : 20% magnitude-based = 15.14% sparsity effective
3. **Quantization FP16** : Half-precision = -50% taille mémoire

### 🎯 Objectifs

- **Taille réduite** : 196 MB (vs 210 MB baseline, vs 420 MB FP32 original)
- **Vitesse accrue** : ~15-20% plus rapide (distillation + FP16)
- **Performance maintenue** : F1 85.9% (seuil acceptable >85%)
- **Mémoire optimisée** : -50% RAM avec FP16

### 📊 Résultats d'évaluation

**Test set** : 447 entités gold standard

| Métrique | Score | vs Baseline (FP16 Teacher 12L) |
|----------|-------|--------------------------------|
| **F1 Score** | **85.9%** | -1.3% (87.3% → 85.9%) |
| **Precision** | **86.1%** | -2.2% (88.2% → 86.1%) |
| **Recall** | **85.8%** | -0.5% (86.3% → 85.8%) |
| **Weighted Score** | **96.4%** | -0.2% (96.6% → 96.4%) |
| **False Positives** | 64 | +11 (53 → 64) |
| **Missed Entities** | 52 | +2 (50 → 52) |

**✅ Trade-off accepté** : -1.3% F1 pour -6.7% taille + ~15-20% vitesse

### 🏷️ Catégories d'entités détectées

Le modèle de base détecte **4 catégories principales** :

- **PER** (Person) : Personnes, noms, prénoms
- **LOC** (Location) : Lieux, villes, pays, régions  
- **ORG** (Organization) : Organisations, entreprises, institutions
- **MISC** (Miscellaneous) : Entités diverses (dates, événements, etc.)

> **Note** : Ce modèle est le composant NER de base du pipeline LaPlume. Les catégories fines (39 types spécialisés comme `ETAB_MECS`, `ID_RSA`, `LOC_CITY`, etc.) sont ajoutées par les post-traitements du pipeline complet (règles regex, gazetteers, reclassification).

### 🎯 Cas d'usage

Ce modèle est optimisé pour :
- **Rapports sociaux** : évaluations, suivis, comptes-rendus
- **Documents médico-sociaux** : dossiers patients, orientations
- **Anonymisation** : détection d'entités pour pseudonymisation
- **Environnements contraints** : serveurs avec RAM limitée, déploiement edge
- `ETAB_MAS`, `ETAB_FAM`, `ETAB_ESAT`, `ETAB_SAVS`, `ETAB_SAMSAH` : Handicap adulte
- `ETAB_CHRS` : Hébergement d'urgence
- `ETAB_CMS` : Centres médico-sociaux
- `ETAB_SCOLAIRE` : Établissements scolaires
- etc. (voir documentation complète)

## 🔧 Architecture technique

### Modèle de base

- **Base** : CamemBERT (RoBERTa français)
- **Vocabulary** : 32,000 tokens (SentencePiece BPE)
- **Hidden size** : 768
- **Attention heads** : 12
- **Layers** : **11** (distilled from 12-layer teacher)

### Optimisations appliquées

#### 1. Knowledge Distillation (11 layers)

```python
Teacher: camembert-ner (12 layers, F1 87.3%)
Student: 11 layers, distilled with temperature=2.0
Loss: α * CE_loss + (1-α) * KD_loss
Result: F1 81.25% on training → 85.9% final
```

#### 2. Magnitude-based Pruning (20%)

```python
Target: 20% sparsity (magnitude-based)
Effective: 15.14% (15.6M params zeroed / 102.9M total)
Method: Iterative pruning during distillation
```

#### 3. FP16 Quantization

```python
Conversion: torch.float32 → torch.float16
Size reduction: 392.71 MB → 196.36 MB (-50.0%)
Quality impact: Minimal (<0.1% F1 degradation)
```

### 📦 Spécifications

- **Paramètres totaux** : 102,947,333
- **Paramètres non-zéro** : 87,350,000 (~85%)
- **Taille mémoire** : 196.36 MB (FP16)
- **Temps d'inférence** : ~15-20% plus rapide que baseline
- **Compatibilité** : Transformers ≥ 4.30.0, PyTorch ≥ 2.0.0

## 🚀 Usage

### Dataset d'entraînement

Le modèle student distillé a été entraîné sur **50 000 phrases** provenant de trois sources complémentaires :

1. **Contexte médico-social français** :
   - Rapports sociaux fictifs mais réalistes (générés pour l'entraînement)
   - Rapports publics sur l'organisation médico-sociale et bonnes pratiques
2. **Narratif littéraire** : Grands romans français du XXe siècle (dialogues, descriptions de personnages)
3. **Articles Wikipedia français** : Contenu encyclopédique général

Cette diversité de sources permet une bonne généralisation tout en conservant une spécialisation pour le domaine médico-social, **sans utiliser de données confidentielles réelles**.

### Installation

```bash
pip install transformers torch
```

### Chargement du modèle

```python
from transformers import AutoTokenizer, AutoModelForTokenClassification
import torch

# Charger le modèle et le tokenizer
model_name = "jmdanto/titibongbong_camemBERT_NER"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForTokenClassification.from_pretrained(
    model_name,
    torch_dtype=torch.float16  # Force FP16 pour bénéficier des optimisations
)

# Exemple d'inférence
text = "Marie Dupont habite à Paris et travaille à l'Hôpital Sainte-Anne."
inputs = tokenizer(text, return_tensors="pt")

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

# Décoder les prédictions
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}: {label}")

# Résultat attendu :
# Marie: B-PER
# Dupont: I-PER
# Paris: B-LOC
# Hôpital: B-ORG
# Sainte: I-ORG
# -: I-ORG
# Anne: I-ORG
```

### Pipeline complet avec post-traitement

```python
from transformers import pipeline

# Créer le pipeline NER
ner_pipeline = pipeline(
    "ner",
    model=model_name,
    tokenizer=model_name,
    aggregation_strategy="simple",  # Fusionne les sous-tokens
    device=0 if torch.cuda.is_available() else -1
)

# Analyser un texte
text = """
Rapport social concernant M. Bernard Martin, 
domicilié au 23 rue de la Paix, 69000 Lyon.
Suivi par le Centre Médico-Social de Lyon-Confluence.
"""

entities = ner_pipeline(text)

for entity in entities:
    print(f"{entity['entity_group']}: {entity['word']} (score: {entity['score']:.2f})")

# Résultat attendu :
# PER: Bernard Martin (score: 0.99)
# LOC: rue de la Paix (score: 0.95)
# LOC: Lyon (score: 0.98)
# ORG: Centre Médico-Social de Lyon-Confluence (score: 0.92)
```

## 📈 Benchmarks

### Comparaison des modèles

| Modèle | Taille | F1 | Précision | Rappel | FP | Manqués |
|--------|--------|----|-----------  |--------|-------|---------|
| **Baseline FP16** (Teacher 12L) | 210 MB | 87.3% | 88.2% | 86.3% | 53 | 50 |
| **Distilled FP32** (Student 11L) | 393 MB | 85.8% | 85.9% | 85.8% | 65 | 52 |
| **Distilled FP16** (Ce modèle) | **196 MB** | **85.9%** | **86.1%** | **85.8%** | **64** | **52** |

**Trade-offs** :
-**Taille** : -6.7% vs baseline, meilleure efficacité
-**Vitesse** : ~15-20% plus rapide (distillation + FP16)
- ⚠️ **Qualité** : -1.3% F1 (acceptable, >85% seuil requis)

### Performance par criticité

| Criticité | Rappel | Précision | F1 | Entités |
|-----------|--------|-----------|----|----|
| **CRIT** (NIR, etc.) | 96.8% | 100% | 98.4% | 19 |
| **HIGH** (PER, ID) | 93.0% | 95.7% | 94.4% | 176 |
| **MED** (ORG, ETAB) | 81.4% | 77.4% | 79.3% | 199 |
| **LOW** (LOC, DATE) | 69.4% | 74.5% | 71.9% | 49 |

**✅ Points forts** :
- Excellente détection des données critiques 
- Précision élevée sur les personnes
- Bon équilibre précision/rappel global

## 🎓 Entraînement

### Dataset

- **Domaine** : Rapports sociaux français (ASE, RSA, handicap, hébergement)
- **Taille** : 10 fichiers d'entraînement annotés manuellement
- **Annotations** : Format IOB2 avec 39 catégories d'entités
- **Augmentation** : Gazetteers spécialisés (FINESS, prénoms, associations)

### Hyperparamètres

```yaml
# Distillation
teacher: camembert-ner-12layers-fp16
student_layers: 11
temperature: 2.0
alpha: 0.5

# Pruning
method: magnitude_based
target_sparsity: 0.20
effective_sparsity: 0.1514

# Training
learning_rate: 2e-5
batch_size: 16
epochs: 10
optimizer: AdamW
warmup_ratio: 0.1

# Quantization
dtype: float16
method: torch.half()
```

## ⚠️ Limitations

1. **Domaine spécialisé** : Optimisé pour les rapports sociaux français, performances moindres sur d'autres domaines
2. **Trade-off qualité** : -1.3% F1 vs baseline pour gain taille/vitesse
3. **Faux positifs** : +11 FP vs baseline (64 vs 53), vérification recommandée
4. **Entités rares** : Performance réduite sur catégories peu fréquentes (LOC, DATE)
5. **Hardware** : FP16 nécessite GPU compatible (Pascal+) ou CPU moderne

## 📄 Licence

Apache 2.0

## 🤝 Citation

```bibtex
@model{camembert-ner-distilled-pruned-fp16,
  title={CamemBERT-NER Distilled + Pruned + FP16},
  author={Danto, Patrick},
  year={2024},
  publisher={HuggingFace},
  url={https://huggingface.co/jmdanto/titibongbong_camemBERT_NER}
}

@model{camembert-ner-teacher,
  title={CamemBERT-NER: Fine-tuned CamemBERT for NER task},
  author={Pollé, Jean-Baptiste},
  year={2020},
  publisher={HuggingFace},
  url={https://huggingface.co/Jean-Baptiste/camembert-ner}
}
```

## 📞 Contact

- **Email** : patrick.danto@outlook.fr

## 🔄 Versions

- **v1.0** (Nov 2024) : Version initiale distillée + prunée + FP16
  - 11 layers, 20% pruning, FP16 quantization
  - F1: 85.9%, Size: 196 MB
  - Évalué sur 447 entités gold standard

---

**Note** : Ce modèle fait partie du projet **La Plume**, un pipeline de pseudonymisation pour documents médico-sociaux français. Le pipeline complet est un projet privé protégé au titre de la propriété intellectuelle, mais ce modèle est publié sous licence MIT.