jmdanto commited on
Commit
9ae5f4f
·
verified ·
1 Parent(s): e564114

Update README.md

Browse files
Files changed (1) hide show
  1. README.md +347 -347
README.md CHANGED
@@ -1,347 +1,347 @@
1
- ---
2
- language: fr
3
- license: mit
4
- tags:
5
- - token-classification
6
- - named-entity-recognition
7
- - french
8
- - camembert
9
- - distillation
10
- - pruning
11
- - fp16
12
- - medical
13
- - social-work
14
- base_model: Jean-Baptiste/camembert-ner
15
- datasets:
16
- - custom-medical-social-corpus
17
- metrics:
18
- - f1
19
- - precision
20
- - recall
21
- model-index:
22
- - name: CamemBERT-NER-Distilled-Pruned-FP16
23
- results:
24
- - task:
25
- type: token-classification
26
- name: Named Entity Recognition
27
- metrics:
28
- - name: F1
29
- type: f1
30
- value: 0.859
31
- - name: Precision
32
- type: precision
33
- value: 0.861
34
- - name: Recall
35
- type: recall
36
- value: 0.858
37
- ---
38
-
39
- # CamemBERT-NER Distilled + Pruned + FP16
40
-
41
- **Modèle optimisé pour la reconnaissance d'entités nommées (NER) dans les rapports sociaux français**
42
-
43
- [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
44
- [![Model](https://img.shields.io/badge/Model-CamemBERT-green.svg)](https://huggingface.co/camembert-base)
45
-
46
- ## 📋 Description
47
-
48
- 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 :
49
-
50
- 1. **Distillation** : 11 couches (vs 12 du teacher) = -8.3% paramètres
51
- 2. **Pruning non-structurel** : 20% magnitude-based = 15.14% sparsity effective
52
- 3. **Quantization FP16** : Half-precision = -50% taille mémoire
53
-
54
- ### 🎯 Objectifs
55
-
56
- - **Taille réduite** : 196 MB (vs 210 MB baseline, vs 420 MB FP32 original)
57
- - **Vitesse accrue** : ~15-20% plus rapide (distillation + FP16)
58
- - **Performance maintenue** : F1 85.9% (seuil acceptable >85%)
59
- - **Mémoire optimisée** : -50% RAM avec FP16
60
-
61
- ### 📊 Résultats d'évaluation
62
-
63
- **Test set** : 447 entités gold standard
64
-
65
- | Métrique | Score | vs Baseline (FP16 Teacher 12L) |
66
- |----------|-------|--------------------------------|
67
- | **F1 Score** | **85.9%** | -1.3% (87.3% → 85.9%) |
68
- | **Precision** | **86.1%** | -2.2% (88.2% → 86.1%) |
69
- | **Recall** | **85.8%** | -0.5% (86.3% → 85.8%) |
70
- | **Weighted Score** | **96.4%** | -0.2% (96.6% → 96.4%) |
71
- | **False Positives** | 64 | +11 (53 → 64) |
72
- | **Missed Entities** | 52 | +2 (50 → 52) |
73
-
74
- **✅ Trade-off accepté** : -1.3% F1 pour -6.7% taille + ~15-20% vitesse
75
-
76
- ### 🏷️ Catégories d'entités détectées
77
-
78
- Le modèle de base détecte **4 catégories principales** :
79
-
80
- - **PER** (Person) : Personnes, noms, prénoms
81
- - **LOC** (Location) : Lieux, villes, pays, régions
82
- - **ORG** (Organization) : Organisations, entreprises, institutions
83
- - **MISC** (Miscellaneous) : Entités diverses (dates, événements, etc.)
84
-
85
- > **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).
86
-
87
- ### 🎯 Cas d'usage
88
-
89
- Ce modèle est optimisé pour :
90
- - **Rapports sociaux** : évaluations, suivis, comptes-rendus
91
- - **Documents médico-sociaux** : dossiers patients, orientations
92
- - **Anonymisation** : détection d'entités pour pseudonymisation
93
- - **Environnements contraints** : serveurs avec RAM limitée, déploiement edge
94
- - `ETAB_MAS`, `ETAB_FAM`, `ETAB_ESAT`, `ETAB_SAVS`, `ETAB_SAMSAH` : Handicap adulte
95
- - `ETAB_CHRS` : Hébergement d'urgence
96
- - `ETAB_CMS` : Centres médico-sociaux
97
- - `ETAB_SCOLAIRE` : Établissements scolaires
98
- - etc. (voir documentation complète)
99
-
100
- ## 🔧 Architecture technique
101
-
102
- ### Modèle de base
103
-
104
- - **Base** : CamemBERT (RoBERTa français)
105
- - **Vocabulary** : 32,000 tokens (SentencePiece BPE)
106
- - **Hidden size** : 768
107
- - **Attention heads** : 12
108
- - **Layers** : **11** (distilled from 12-layer teacher)
109
-
110
- ### Optimisations appliquées
111
-
112
- #### 1. Knowledge Distillation (11 layers)
113
-
114
- ```python
115
- Teacher: camembert-ner (12 layers, F1 87.3%)
116
- Student: 11 layers, distilled with temperature=2.0
117
- Loss: α * CE_loss + (1-α) * KD_loss
118
- Result: F1 81.25% on training → 85.9% final
119
- ```
120
-
121
- #### 2. Magnitude-based Pruning (20%)
122
-
123
- ```python
124
- Target: 20% sparsity (magnitude-based)
125
- Effective: 15.14% (15.6M params zeroed / 102.9M total)
126
- Method: Iterative pruning during distillation
127
- ```
128
-
129
- #### 3. FP16 Quantization
130
-
131
- ```python
132
- Conversion: torch.float32 → torch.float16
133
- Size reduction: 392.71 MB → 196.36 MB (-50.0%)
134
- Quality impact: Minimal (<0.1% F1 degradation)
135
- ```
136
-
137
- ### 📦 Spécifications
138
-
139
- - **Paramètres totaux** : 102,947,333
140
- - **Paramètres non-zéro** : 87,350,000 (~85%)
141
- - **Taille mémoire** : 196.36 MB (FP16)
142
- - **Temps d'inférence** : ~15-20% plus rapide que baseline
143
- - **Compatibilité** : Transformers ≥ 4.30.0, PyTorch ≥ 2.0.0
144
-
145
- ## 🚀 Usage
146
-
147
- ### Dataset d'entraînement
148
-
149
- Le modèle student distillé a été entraîné sur **50 000 phrases** provenant de trois sources complémentaires :
150
-
151
- 1. **Contexte m��dico-social français** :
152
- - Rapports sociaux fictifs mais réalistes (générés pour l'entraînement)
153
- - Rapports publics sur l'organisation médico-sociale et bonnes pratiques
154
- 2. **Narratif littéraire** : Grands romans français du XXe siècle (dialogues, descriptions de personnages)
155
- 3. **Articles Wikipedia français** : Contenu encyclopédique général
156
-
157
- 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**.
158
-
159
- ### Installation
160
-
161
- ```bash
162
- pip install transformers torch
163
- ```
164
-
165
- ### Chargement du modèle
166
-
167
- ```python
168
- from transformers import AutoTokenizer, AutoModelForTokenClassification
169
- import torch
170
-
171
- # Charger le modèle et le tokenizer
172
- model_name = "jmdanto/titibongbong_camemBERT_NER"
173
- tokenizer = AutoTokenizer.from_pretrained(model_name)
174
- model = AutoModelForTokenClassification.from_pretrained(
175
- model_name,
176
- torch_dtype=torch.float16 # Force FP16 pour bénéficier des optimisations
177
- )
178
-
179
- # Exemple d'inférence
180
- text = "Marie Dupont habite à Paris et travaille à l'Hôpital Sainte-Anne."
181
- inputs = tokenizer(text, return_tensors="pt")
182
-
183
- with torch.no_grad():
184
- outputs = model(**inputs)
185
- predictions = torch.argmax(outputs.logits, dim=-1)
186
-
187
- # Décoder les prédictions
188
- tokens = tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
189
- labels = [model.config.id2label[p.item()] for p in predictions[0]]
190
-
191
- for token, label in zip(tokens, labels):
192
- if label != "O":
193
- print(f"{token}: {label}")
194
-
195
- # Résultat attendu :
196
- # Marie: B-PER
197
- # Dupont: I-PER
198
- # Paris: B-LOC
199
- # Hôpital: B-ORG
200
- # Sainte: I-ORG
201
- # -: I-ORG
202
- # Anne: I-ORG
203
- ```
204
-
205
- ### Pipeline complet avec post-traitement
206
-
207
- ```python
208
- from transformers import pipeline
209
-
210
- # Créer le pipeline NER
211
- ner_pipeline = pipeline(
212
- "ner",
213
- model=model_name,
214
- tokenizer=model_name,
215
- aggregation_strategy="simple", # Fusionne les sous-tokens
216
- device=0 if torch.cuda.is_available() else -1
217
- )
218
-
219
- # Analyser un texte
220
- text = """
221
- Rapport social concernant M. Bernard Martin,
222
- domicilié au 23 rue de la Paix, 69000 Lyon.
223
- Suivi par le Centre Médico-Social de Lyon-Confluence.
224
- """
225
-
226
- entities = ner_pipeline(text)
227
-
228
- for entity in entities:
229
- print(f"{entity['entity_group']}: {entity['word']} (score: {entity['score']:.2f})")
230
-
231
- # Résultat attendu :
232
- # PER: Bernard Martin (score: 0.99)
233
- # LOC: rue de la Paix (score: 0.95)
234
- # LOC: Lyon (score: 0.98)
235
- # ORG: Centre Médico-Social de Lyon-Confluence (score: 0.92)
236
- ```
237
-
238
- ## 📈 Benchmarks
239
-
240
- ### Comparaison des modèles
241
-
242
- | Modèle | Taille | F1 | Précision | Rappel | FP | Manqués |
243
- |--------|--------|----|----------- |--------|-------|---------|
244
- | **Baseline FP16** (Teacher 12L) | 210 MB | 87.3% | 88.2% | 86.3% | 53 | 50 |
245
- | **Distilled FP32** (Student 11L) | 393 MB | 85.8% | 85.9% | 85.8% | 65 | 52 |
246
- | **Distilled FP16** (Ce modèle) | **196 MB** | **85.9%** | **86.1%** | **85.8%** | **64** | **52** |
247
-
248
- **Trade-offs** :
249
- - ✅ **Taille** : -6.7% vs baseline, meilleure efficacité
250
- - ✅ **Vitesse** : ~15-20% plus rapide (distillation + FP16)
251
- - ⚠️ **Qualité** : -1.3% F1 (acceptable, >85% seuil requis)
252
-
253
- ### Performance par criticité
254
-
255
- | Criticité | Rappel | Précision | F1 | Entités |
256
- |-----------|--------|-----------|----|----|
257
- | **CRIT** (NIR, etc.) | 96.8% | 100% | 98.4% | 19 |
258
- | **HIGH** (PER, ID) | 93.0% | 95.7% | 94.4% | 176 |
259
- | **MED** (ORG, ETAB) | 81.4% | 77.4% | 79.3% | 199 |
260
- | **LOW** (LOC, DATE) | 69.4% | 74.5% | 71.9% | 49 |
261
-
262
- **✅ Points forts** :
263
- - Excellente détection des données critiques (NIR, identifiants)
264
- - Précision élevée sur les personnes
265
- - Bon équilibre précision/rappel global
266
-
267
- ## 🎓 Entraînement
268
-
269
- ### Dataset
270
-
271
- - **Domaine** : Rapports sociaux français (ASE, RSA, handicap, hébergement)
272
- - **Taille** : 10 fichiers d'entraînement annotés manuellement
273
- - **Annotations** : Format IOB2 avec 39 catégories d'entités
274
- - **Augmentation** : Gazetteers spécialisés (FINESS, prénoms, associations)
275
-
276
- ### Hyperparamètres
277
-
278
- ```yaml
279
- # Distillation
280
- teacher: camembert-ner-12layers-fp16
281
- student_layers: 11
282
- temperature: 2.0
283
- alpha: 0.5
284
-
285
- # Pruning
286
- method: magnitude_based
287
- target_sparsity: 0.20
288
- effective_sparsity: 0.1514
289
-
290
- # Training
291
- learning_rate: 2e-5
292
- batch_size: 16
293
- epochs: 10
294
- optimizer: AdamW
295
- warmup_ratio: 0.1
296
-
297
- # Quantization
298
- dtype: float16
299
- method: torch.half()
300
- ```
301
-
302
- ## ⚠️ Limitations
303
-
304
- 1. **Domaine spécialisé** : Optimisé pour les rapports sociaux français, performances moindres sur d'autres domaines
305
- 2. **Trade-off qualité** : -1.3% F1 vs baseline pour gain taille/vitesse
306
- 3. **Faux positifs** : +11 FP vs baseline (64 vs 53), vérification recommandée
307
- 4. **Entités rares** : Performance réduite sur catégories peu fréquentes (LOC, DATE)
308
- 5. **Hardware** : FP16 nécessite GPU compatible (Pascal+) ou CPU moderne
309
-
310
- ## 📄 Licence
311
-
312
- Apache 2.0
313
-
314
- ## 🤝 Citation
315
-
316
- ```bibtex
317
- @model{camembert-ner-distilled-pruned-fp16,
318
- title={CamemBERT-NER Distilled + Pruned + FP16},
319
- author={Danto, Patrick},
320
- year={2024},
321
- publisher={HuggingFace},
322
- url={https://huggingface.co/jmdanto/titibongbong_camemBERT_NER}
323
- }
324
-
325
- @model{camembert-ner-teacher,
326
- title={CamemBERT-NER: Fine-tuned CamemBERT for NER task},
327
- author={Pollé, Jean-Baptiste},
328
- year={2020},
329
- publisher={HuggingFace},
330
- url={https://huggingface.co/Jean-Baptiste/camembert-ner}
331
- }
332
- ```
333
-
334
- ## 📞 Contact
335
-
336
- - **Email** : patrick.danto@outlook.fr
337
-
338
- ## 🔄 Versions
339
-
340
- - **v1.0** (Nov 2024) : Version initiale distillée + prunée + FP16
341
- - 11 layers, 20% pruning, FP16 quantization
342
- - F1: 85.9%, Size: 196 MB
343
- - Évalué sur 447 entités gold standard
344
-
345
- ---
346
-
347
- **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.
 
1
+ ---
2
+ language: fr
3
+ license: mit
4
+ tags:
5
+ - token-classification
6
+ - named-entity-recognition
7
+ - french
8
+ - camembert
9
+ - distillation
10
+ - pruning
11
+ - fp16
12
+ - medical
13
+ - social-work
14
+ base_model: Jean-Baptiste/camembert-ner
15
+ datasets:
16
+ - custom-medical-social-corpus
17
+ metrics:
18
+ - f1
19
+ - precision
20
+ - recall
21
+ model-index:
22
+ - name: CamemBERT-NER-Distilled-Pruned-FP16
23
+ results:
24
+ - task:
25
+ type: token-classification
26
+ name: Named Entity Recognition
27
+ metrics:
28
+ - name: F1
29
+ type: f1
30
+ value: 0.859
31
+ - name: Precision
32
+ type: precision
33
+ value: 0.861
34
+ - name: Recall
35
+ type: recall
36
+ value: 0.858
37
+ ---
38
+
39
+ # CamemBERT-NER Distilled + Pruned + FP16
40
+
41
+ **Modèle optimisé pour la reconnaissance d'entités nommées (NER) dans les rapports sociaux français**
42
+
43
+ [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
44
+ [![Model](https://img.shields.io/badge/Model-CamemBERT-green.svg)](https://huggingface.co/camembert-base)
45
+
46
+ ## 📋 Description
47
+
48
+ 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 :
49
+
50
+ 1. **Distillation** : 11 couches (vs 12 du teacher) = -8.3% paramètres
51
+ 2. **Pruning non-structurel** : 20% magnitude-based = 15.14% sparsity effective
52
+ 3. **Quantization FP16** : Half-precision = -50% taille mémoire
53
+
54
+ ### 🎯 Objectifs
55
+
56
+ - **Taille réduite** : 196 MB (vs 210 MB baseline, vs 420 MB FP32 original)
57
+ - **Vitesse accrue** : ~15-20% plus rapide (distillation + FP16)
58
+ - **Performance maintenue** : F1 85.9% (seuil acceptable >85%)
59
+ - **Mémoire optimisée** : -50% RAM avec FP16
60
+
61
+ ### 📊 Résultats d'évaluation
62
+
63
+ **Test set** : 447 entités gold standard
64
+
65
+ | Métrique | Score | vs Baseline (FP16 Teacher 12L) |
66
+ |----------|-------|--------------------------------|
67
+ | **F1 Score** | **85.9%** | -1.3% (87.3% → 85.9%) |
68
+ | **Precision** | **86.1%** | -2.2% (88.2% → 86.1%) |
69
+ | **Recall** | **85.8%** | -0.5% (86.3% → 85.8%) |
70
+ | **Weighted Score** | **96.4%** | -0.2% (96.6% → 96.4%) |
71
+ | **False Positives** | 64 | +11 (53 → 64) |
72
+ | **Missed Entities** | 52 | +2 (50 → 52) |
73
+
74
+ **✅ Trade-off accepté** : -1.3% F1 pour -6.7% taille + ~15-20% vitesse
75
+
76
+ ### 🏷️ Catégories d'entités détectées
77
+
78
+ Le modèle de base détecte **4 catégories principales** :
79
+
80
+ - **PER** (Person) : Personnes, noms, prénoms
81
+ - **LOC** (Location) : Lieux, villes, pays, régions
82
+ - **ORG** (Organization) : Organisations, entreprises, institutions
83
+ - **MISC** (Miscellaneous) : Entités diverses (dates, événements, etc.)
84
+
85
+ > **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).
86
+
87
+ ### 🎯 Cas d'usage
88
+
89
+ Ce modèle est optimisé pour :
90
+ - **Rapports sociaux** : évaluations, suivis, comptes-rendus
91
+ - **Documents médico-sociaux** : dossiers patients, orientations
92
+ - **Anonymisation** : détection d'entités pour pseudonymisation
93
+ - **Environnements contraints** : serveurs avec RAM limitée, déploiement edge
94
+ - `ETAB_MAS`, `ETAB_FAM`, `ETAB_ESAT`, `ETAB_SAVS`, `ETAB_SAMSAH` : Handicap adulte
95
+ - `ETAB_CHRS` : Hébergement d'urgence
96
+ - `ETAB_CMS` : Centres médico-sociaux
97
+ - `ETAB_SCOLAIRE` : Établissements scolaires
98
+ - etc. (voir documentation complète)
99
+
100
+ ## 🔧 Architecture technique
101
+
102
+ ### Modèle de base
103
+
104
+ - **Base** : CamemBERT (RoBERTa français)
105
+ - **Vocabulary** : 32,000 tokens (SentencePiece BPE)
106
+ - **Hidden size** : 768
107
+ - **Attention heads** : 12
108
+ - **Layers** : **11** (distilled from 12-layer teacher)
109
+
110
+ ### Optimisations appliquées
111
+
112
+ #### 1. Knowledge Distillation (11 layers)
113
+
114
+ ```python
115
+ Teacher: camembert-ner (12 layers, F1 87.3%)
116
+ Student: 11 layers, distilled with temperature=2.0
117
+ Loss: α * CE_loss + (1-α) * KD_loss
118
+ Result: F1 81.25% on training → 85.9% final
119
+ ```
120
+
121
+ #### 2. Magnitude-based Pruning (20%)
122
+
123
+ ```python
124
+ Target: 20% sparsity (magnitude-based)
125
+ Effective: 15.14% (15.6M params zeroed / 102.9M total)
126
+ Method: Iterative pruning during distillation
127
+ ```
128
+
129
+ #### 3. FP16 Quantization
130
+
131
+ ```python
132
+ Conversion: torch.float32 → torch.float16
133
+ Size reduction: 392.71 MB → 196.36 MB (-50.0%)
134
+ Quality impact: Minimal (<0.1% F1 degradation)
135
+ ```
136
+
137
+ ### 📦 Spécifications
138
+
139
+ - **Paramètres totaux** : 102,947,333
140
+ - **Paramètres non-zéro** : 87,350,000 (~85%)
141
+ - **Taille mémoire** : 196.36 MB (FP16)
142
+ - **Temps d'inférence** : ~15-20% plus rapide que baseline
143
+ - **Compatibilité** : Transformers ≥ 4.30.0, PyTorch ≥ 2.0.0
144
+
145
+ ## 🚀 Usage
146
+
147
+ ### Dataset d'entraînement
148
+
149
+ Le modèle student distillé a été entraîné sur **50 000 phrases** provenant de trois sources complémentaires :
150
+
151
+ 1. **Contexte médico-social français** :
152
+ - Rapports sociaux fictifs mais réalistes (générés pour l'entraînement)
153
+ - Rapports publics sur l'organisation médico-sociale et bonnes pratiques
154
+ 2. **Narratif littéraire** : Grands romans français du XXe siècle (dialogues, descriptions de personnages)
155
+ 3. **Articles Wikipedia français** : Contenu encyclopédique général
156
+
157
+ 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**.
158
+
159
+ ### Installation
160
+
161
+ ```bash
162
+ pip install transformers torch
163
+ ```
164
+
165
+ ### Chargement du modèle
166
+
167
+ ```python
168
+ from transformers import AutoTokenizer, AutoModelForTokenClassification
169
+ import torch
170
+
171
+ # Charger le modèle et le tokenizer
172
+ model_name = "jmdanto/titibongbong_camemBERT_NER"
173
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
174
+ model = AutoModelForTokenClassification.from_pretrained(
175
+ model_name,
176
+ torch_dtype=torch.float16 # Force FP16 pour bénéficier des optimisations
177
+ )
178
+
179
+ # Exemple d'inférence
180
+ text = "Marie Dupont habite à Paris et travaille à l'Hôpital Sainte-Anne."
181
+ inputs = tokenizer(text, return_tensors="pt")
182
+
183
+ with torch.no_grad():
184
+ outputs = model(**inputs)
185
+ predictions = torch.argmax(outputs.logits, dim=-1)
186
+
187
+ # Décoder les prédictions
188
+ tokens = tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
189
+ labels = [model.config.id2label[p.item()] for p in predictions[0]]
190
+
191
+ for token, label in zip(tokens, labels):
192
+ if label != "O":
193
+ print(f"{token}: {label}")
194
+
195
+ # Résultat attendu :
196
+ # Marie: B-PER
197
+ # Dupont: I-PER
198
+ # Paris: B-LOC
199
+ # Hôpital: B-ORG
200
+ # Sainte: I-ORG
201
+ # -: I-ORG
202
+ # Anne: I-ORG
203
+ ```
204
+
205
+ ### Pipeline complet avec post-traitement
206
+
207
+ ```python
208
+ from transformers import pipeline
209
+
210
+ # Créer le pipeline NER
211
+ ner_pipeline = pipeline(
212
+ "ner",
213
+ model=model_name,
214
+ tokenizer=model_name,
215
+ aggregation_strategy="simple", # Fusionne les sous-tokens
216
+ device=0 if torch.cuda.is_available() else -1
217
+ )
218
+
219
+ # Analyser un texte
220
+ text = """
221
+ Rapport social concernant M. Bernard Martin,
222
+ domicilié au 23 rue de la Paix, 69000 Lyon.
223
+ Suivi par le Centre Médico-Social de Lyon-Confluence.
224
+ """
225
+
226
+ entities = ner_pipeline(text)
227
+
228
+ for entity in entities:
229
+ print(f"{entity['entity_group']}: {entity['word']} (score: {entity['score']:.2f})")
230
+
231
+ # Résultat attendu :
232
+ # PER: Bernard Martin (score: 0.99)
233
+ # LOC: rue de la Paix (score: 0.95)
234
+ # LOC: Lyon (score: 0.98)
235
+ # ORG: Centre Médico-Social de Lyon-Confluence (score: 0.92)
236
+ ```
237
+
238
+ ## 📈 Benchmarks
239
+
240
+ ### Comparaison des modèles
241
+
242
+ | Modèle | Taille | F1 | Précision | Rappel | FP | Manqués |
243
+ |--------|--------|----|----------- |--------|-------|---------|
244
+ | **Baseline FP16** (Teacher 12L) | 210 MB | 87.3% | 88.2% | 86.3% | 53 | 50 |
245
+ | **Distilled FP32** (Student 11L) | 393 MB | 85.8% | 85.9% | 85.8% | 65 | 52 |
246
+ | **Distilled FP16** (Ce modèle) | **196 MB** | **85.9%** | **86.1%** | **85.8%** | **64** | **52** |
247
+
248
+ **Trade-offs** :
249
+ - ✅ **Taille** : -6.7% vs baseline, meilleure efficacité
250
+ - ✅ **Vitesse** : ~15-20% plus rapide (distillation + FP16)
251
+ - ⚠️ **Qualité** : -1.3% F1 (acceptable, >85% seuil requis)
252
+
253
+ ### Performance par criticité
254
+
255
+ | Criticité | Rappel | Précision | F1 | Entités |
256
+ |-----------|--------|-----------|----|----|
257
+ | **CRIT** (NIR, etc.) | 96.8% | 100% | 98.4% | 19 |
258
+ | **HIGH** (PER, ID) | 93.0% | 95.7% | 94.4% | 176 |
259
+ | **MED** (ORG, ETAB) | 81.4% | 77.4% | 79.3% | 199 |
260
+ | **LOW** (LOC, DATE) | 69.4% | 74.5% | 71.9% | 49 |
261
+
262
+ **✅ Points forts** :
263
+ - Excellente détection des données critiques
264
+ - Précision élevée sur les personnes
265
+ - Bon équilibre précision/rappel global
266
+
267
+ ## 🎓 Entraînement
268
+
269
+ ### Dataset
270
+
271
+ - **Domaine** : Rapports sociaux français (ASE, RSA, handicap, hébergement)
272
+ - **Taille** : 10 fichiers d'entraînement annotés manuellement
273
+ - **Annotations** : Format IOB2 avec 39 catégories d'entités
274
+ - **Augmentation** : Gazetteers spécialisés (FINESS, prénoms, associations)
275
+
276
+ ### Hyperparamètres
277
+
278
+ ```yaml
279
+ # Distillation
280
+ teacher: camembert-ner-12layers-fp16
281
+ student_layers: 11
282
+ temperature: 2.0
283
+ alpha: 0.5
284
+
285
+ # Pruning
286
+ method: magnitude_based
287
+ target_sparsity: 0.20
288
+ effective_sparsity: 0.1514
289
+
290
+ # Training
291
+ learning_rate: 2e-5
292
+ batch_size: 16
293
+ epochs: 10
294
+ optimizer: AdamW
295
+ warmup_ratio: 0.1
296
+
297
+ # Quantization
298
+ dtype: float16
299
+ method: torch.half()
300
+ ```
301
+
302
+ ## ⚠️ Limitations
303
+
304
+ 1. **Domaine spécialisé** : Optimisé pour les rapports sociaux français, performances moindres sur d'autres domaines
305
+ 2. **Trade-off qualité** : -1.3% F1 vs baseline pour gain taille/vitesse
306
+ 3. **Faux positifs** : +11 FP vs baseline (64 vs 53), vérification recommandée
307
+ 4. **Entités rares** : Performance réduite sur catégories peu fréquentes (LOC, DATE)
308
+ 5. **Hardware** : FP16 nécessite GPU compatible (Pascal+) ou CPU moderne
309
+
310
+ ## 📄 Licence
311
+
312
+ Apache 2.0
313
+
314
+ ## 🤝 Citation
315
+
316
+ ```bibtex
317
+ @model{camembert-ner-distilled-pruned-fp16,
318
+ title={CamemBERT-NER Distilled + Pruned + FP16},
319
+ author={Danto, Patrick},
320
+ year={2024},
321
+ publisher={HuggingFace},
322
+ url={https://huggingface.co/jmdanto/titibongbong_camemBERT_NER}
323
+ }
324
+
325
+ @model{camembert-ner-teacher,
326
+ title={CamemBERT-NER: Fine-tuned CamemBERT for NER task},
327
+ author={Pollé, Jean-Baptiste},
328
+ year={2020},
329
+ publisher={HuggingFace},
330
+ url={https://huggingface.co/Jean-Baptiste/camembert-ner}
331
+ }
332
+ ```
333
+
334
+ ## 📞 Contact
335
+
336
+ - **Email** : patrick.danto@outlook.fr
337
+
338
+ ## 🔄 Versions
339
+
340
+ - **v1.0** (Nov 2024) : Version initiale distillée + prunée + FP16
341
+ - 11 layers, 20% pruning, FP16 quantization
342
+ - F1: 85.9%, Size: 196 MB
343
+ - Évalué sur 447 entités gold standard
344
+
345
+ ---
346
+
347
+ **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.