jmdanto commited on
Commit
34978e4
·
verified ·
1 Parent(s): 96090dc

v2.0.0: initial release — 9L distilled from titibongbong v1 (11L)

Browse files
README.md ADDED
@@ -0,0 +1,193 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: mit
3
+ language:
4
+ - fr
5
+ pipeline_tag: token-classification
6
+ tags:
7
+ - safetensors
8
+ - camembert
9
+ - token-classification
10
+ - named-entity-recognition
11
+ - french
12
+ - distillation
13
+ - fp16
14
+ - medical
15
+ - social-work
16
+ - ner
17
+ library_name: transformers
18
+ base_model: jmdanto/titibongbong_camemBERT_NER
19
+ model-index:
20
+ - name: titibongbong v2 — 9L distilled NER for French medical-social documents
21
+ results:
22
+ - task:
23
+ type: token-classification
24
+ name: Named Entity Recognition
25
+ dataset:
26
+ name: LaPlume Gold Standard (medical-social)
27
+ type: custom
28
+ metrics:
29
+ - name: F1 (pipeline global)
30
+ type: f1
31
+ value: 0.868
32
+ verified: true
33
+ - name: F1 weighted (CRIT+ELEV+MOY)
34
+ type: f1
35
+ value: 0.898
36
+ verified: true
37
+ - name: Precision
38
+ type: precision
39
+ value: 0.832
40
+ verified: true
41
+ - name: Recall
42
+ type: recall
43
+ value: 0.908
44
+ verified: true
45
+ - name: F1 CRIT (direct identifiers)
46
+ type: f1
47
+ value: 0.955
48
+ verified: true
49
+ - name: F1 ELEV (high risk)
50
+ type: f1
51
+ value: 0.964
52
+ verified: true
53
+ - name: F1 MOY (moderate risk)
54
+ type: f1
55
+ value: 0.955
56
+ verified: true
57
+ datasets:
58
+ - custom-medical-social-corpus
59
+ ---
60
+
61
+ # titibongbong v2 — CamemBERT-NER 9L distillé
62
+
63
+ **Distilled from [titibongbong v1](https://huggingface.co/jmdanto/titibongbong_camemBERT_NER) (11L) → 9 layers.**
64
+
65
+ Modèle de reconnaissance d'entités nommées (NER) optimisé pour les documents médico-sociaux français, avec un accent sur la pseudonymisation (RGPD). Version 9 couches obtenue par distillation avec KL divergence + cross-entropy, sans perte de qualité.
66
+
67
+ ## 📊 Métriques (gold standard LaPlume)
68
+
69
+ | Métrique | titibongbong v1 (11L) | **titibongbong v2 (9L)** | Δ |
70
+ | ---------- | --------------------- | ------------------------ | ---------- |
71
+ | F1 Global | 86.4% | **86.8%** | +0.4 pt ✅ |
72
+ | F1 Pondéré | 89.6% | **89.8%** | +0.2 pt ✅ |
73
+ | Précision | 83.2% | **83.2%** | — |
74
+ | Rappel | 90.0% | **90.8%** | +0.8 pt ✅ |
75
+ | F1 CRIT | 95.5% | **95.5%** | — |
76
+ | F1 ELEV | 96.1% | **96.4%** | +0.3 pt ✅ |
77
+ | F1 MOY | 94.8% | **95.5%** | +0.7 pt ✅ |
78
+
79
+ Évalué sur 975 entités annotées manuellement (9 rapports médico-sociaux complets), via le pipeline hybride LaPlume (NER + règles regex + gazetteers Aho-Corasick). Les métriques excluent la catégorie FAIB (entités à faible risque de réidentification).
80
+
81
+ ## 🏗️ Architecture
82
+
83
+ | Propriété | Valeur |
84
+ | ----------------- | ---------------------------------------------------- |
85
+ | **Base** | CamemBERT (RoBERTa français) |
86
+ | **Couches** | **9** (vs 12 pour le teacher originel, 11 pour v1) |
87
+ | **Paramètres** | **88.8M** |
88
+ | **Taille (FP16)** | **169 MB** (vs 393 MB FP32 v1, 420 MB teacher) |
89
+ | **Labels** | 5 classes : `O`, `I-LOC`, `I-PER`, `I-MISC`, `I-ORG` |
90
+ | **Précision** | FP16 (half precision) |
91
+ | **Tokenization** | SentencePiece 32K vocab |
92
+ | **Max sequence** | 512 tokens |
93
+
94
+ ## 🔬 Méthode de distillation
95
+
96
+ - **Teacher** : `jmdanto/titibongbong_camemBERT_NER` (11 couches)
97
+ - **Student** : copie du teacher avec retrait des couches 5 et 6
98
+ - **Loss** : 0.5·CrossEntropy + 0.5·KL divergence (T=4), sans CRF
99
+ - **Corpus** : 1.28M tokens (670 chunks de rapports médico-sociaux + romans français)
100
+ - **Hardware** : RunPod A100 80GB, bf16, 8 epochs, batch size 32
101
+ - **Framework** : PyTorch 2.x + HuggingFace Transformers 4.57
102
+
103
+ ## 🚀 Utilisation
104
+
105
+ ```python
106
+ from transformers import AutoTokenizer, AutoModelForTokenClassification, pipeline
107
+
108
+ model = AutoModelForTokenClassification.from_pretrained("jmdanto/titibongbong_9L_v2")
109
+ tokenizer = AutoTokenizer.from_pretrained("jmdanto/titibongbong_9L_v2")
110
+
111
+ ner = pipeline("token-classification", model=model, tokenizer=tokenizer,
112
+ aggregation_strategy="simple")
113
+
114
+ text = "Jean Dupont, né le 15/03/1985, réside au 12 rue des Lilas à Paris."
115
+ results = ner(text)
116
+ # [{'entity_group': 'PER', 'word': 'Jean Dupont', ...},
117
+ # {'entity_group': 'LOC', 'word': 'Paris', ...}]
118
+ ```
119
+
120
+ ## ⚡ Performance
121
+
122
+ Mesuré sur le pipeline LaPlume complet (NER + règles + gazetteers Aho-Corasick), texte ~1200 caractères.
123
+
124
+ | Plateforme | Temps NER seul (9L FP16) |
125
+ | --------------------------------- | ------------------------ |
126
+ | Apple M3 Max (16 cœurs) | 0.044s |
127
+ | PC standard (i5, 8 Go, 4 threads) | ~0.09s (estimé) |
128
+
129
+ Le gain principal de v2 par rapport à v1 est la **taille mémoire** (169 MB FP16 vs 393 MB FP32) et le nombre de couches (9 vs 11), critique pour le déploiement local sur des machines à RAM limitée (8-16 Go). La vitesse d'inférence CPU est comparable car le goulot d'étranglement du pipeline n'est pas le NER mais les gazetteers.
130
+ </replace_in_file>
131
+
132
+ ## 🏥 Domaine d'application
133
+
134
+ Entraîné et évalué sur un corpus varié de documents du secteur social et médico-social français :
135
+
136
+ - Rapports éducatifs et notes sociales
137
+ - Courriers institutionnels (MDPH, CAF, ASE)
138
+ - Signalisements et informations préoccupantes
139
+ - Projets personnalisés et contrats de séjour
140
+ - Rapports de gestion budgétaire
141
+ - Extraits de romans (Zola, Maupassant) pour robustesse hors-domaine
142
+
143
+ ## 📁 Versions
144
+
145
+ | Version | Couches | Taille | F1 | HuggingFace |
146
+ | ------- | ------------------ | --------------- | --------- | --------------------------------------------------------------------------------------- |
147
+ | v1 | 11L (1 pruned) | 393 MB FP32 | 86.4% | [titibongbong_camemBERT_NER](https://huggingface.co/jmdanto/titibongbong_camemBERT_NER) |
148
+ | **v2** | **9L (distilled)** | **169 MB FP16** | **86.8%** | Ce modèle |
149
+
150
+ ## ⚠️ Limitations
151
+
152
+ - Entraîné exclusivement sur du français → performances non garanties sur d'autres langues
153
+ - Domaine médico-social → peut ne pas généraliser à d'autres domaines (juridique, littéraire général)
154
+ - Labels I-\* uniquement (pas de distinction B-/I-) comme le teacher Jean-Baptiste
155
+ - Classe MISC conservée pour compatibilité mais peu utilisée dans le pipeline cible
156
+ - **Granularité des labels** : ce modèle expose 5 labels NER agrégés (O, PER, LOC, ORG, MISC) pour compatibilité avec l'écosystème CamemBERT. Le pipeline LaPlume complet utilise une taxonomie de **101 catégories** (identifiants directs, indirects, contextuels) — la granularité fine est obtenue par règles regex, gazetteers et post-traitement, pas par le NER seul.
157
+
158
+ ## ⚖️ Cadre réglementaire et positionnement
159
+
160
+ Le secteur médico-social produit des documents à haute densité de données personnelles : identités, dates, adresses, numéros de dossier, organisations impliquées, parcours de soins. Leur traitement par des LLM externes expose à des risques de réidentification que le cadre juridique actuel appréhende avec une exigence croissante.
161
+
162
+ La jurisprudence récente est sans ambiguïté : la qualification juridique des données ne dépend pas de la technique utilisée, mais repose uniquement sur l'appréciation objective du risque effectif de réidentification (Conseil d'État, n°498628, 13 février 2026, confirmant CJUE, OC c/ Commission, 7 mars 2024). La pseudonymisation ne saurait être assimilée à une anonymisation, sauf à démontrer concrètement que la réidentification est, en pratique, irréalisable — et la charge de cette démonstration pèse sur le responsable de traitement.
163
+
164
+ LaPlume adopte une logique de pseudonymisation dense, conçue précisément pour atteindre ce seuil d'irréalisabilité pratique. La taxonomie 101 catégories ne se limite pas aux identifiants directs (NIR, nom, date de naissance) : elle couvre systématiquement les vecteurs de réidentification indirecte — organisations nommées, établissements, services, dates et heures, codes et références institutionnelles. Même sans identification directe, la possibilité de réidentification indirecte suffit à qualifier les informations de données personnelles de santé : c'est exactement ce risque que la profondeur de la taxonomie vise à neutraliser.
165
+
166
+ **Deux usages cibles, une même exigence :**
167
+
168
+ - **Sas LLM** : les documents sont pseudonymisés localement avant tout appel à un modèle externe (Anthropic, Gemini…), traités avec des tokens typés, puis dépseudonymisés localement. Aucune donnée nominative ne transite vers l'infrastructure tierce.
169
+ - **Sas RAG** : avant indexation dans une base vectorielle, les documents sont pseudonymisés pour constituer une mémoire vivante des pratiques professionnelles et des organisations — comptes rendus, notes sociales, rapports éducatifs. Cette mémoire peut être interrogée, enrichie et maintenue dans le temps sans exposer les personnes concernées, tout en conservant la richesse sémantique et organisationnelle des documents (noms d'établissements remplacés par leurs types, dates décalées mais conservées comme marqueurs temporels relatifs, etc.).
170
+
171
+ **Ce que LaPlume ne prétend pas** : la pseudonymisation dense reste une mesure de sécurisation, pas une anonymisation au sens juridique. La responsabilité du traitement demeure entière — LaPlume réduit le risque d'exposition, elle ne le supprime pas.
172
+
173
+ Une évaluation avec deux annotateurs indépendants sur 20 rapports (~3 000 entités) est en cours et fera l'objet d'une publication dédiée.
174
+
175
+ ## 📜 Citation
176
+
177
+ ```bibtex
178
+ @misc{titibongbong_v2_2026,
179
+ author = {Danto, Patrick},
180
+ title = {titibongbong v2: CamemBERT-NER 9L distillé pour la pseudonymisation de documents médico-sociaux},
181
+ year = {2026},
182
+ publisher = {HuggingFace},
183
+ url = {https://huggingface.co/jmdanto/titibongbong_9L_v2}
184
+ }
185
+ ```
186
+
187
+ ## 🔗 Projet LaPlume
188
+
189
+ Ce modèle est un composant du pipeline LaPlume de pseudonymisation RGPD pour le secteur social et médico-social.
190
+
191
+ - **Code source** : [github.com/confidensia-lab](https://github.com/confidensia-lab)
192
+ - **Teacher v1** : [titibongbong_camemBERT_NER](https://huggingface.co/jmdanto/titibongbong_camemBERT_NER)
193
+ - **Teacher originel** : [Jean-Baptiste/camembert-ner](https://huggingface.co/Jean-Baptiste/camembert-ner)
added_tokens.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ {
2
+ "<unk>NOTUSED": 32005
3
+ }
config.json ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "CamembertForTokenClassification"
4
+ ],
5
+ "attention_probs_dropout_prob": 0.1,
6
+ "bos_token_id": 5,
7
+ "classifier_dropout": null,
8
+ "dtype": "float16",
9
+ "eos_token_id": 6,
10
+ "gradient_checkpointing": false,
11
+ "hidden_act": "gelu",
12
+ "hidden_dropout_prob": 0.1,
13
+ "hidden_size": 768,
14
+ "id2label": {
15
+ "0": "O",
16
+ "1": "I-LOC",
17
+ "2": "I-PER",
18
+ "3": "I-MISC",
19
+ "4": "I-ORG"
20
+ },
21
+ "initializer_range": 0.02,
22
+ "intermediate_size": 3072,
23
+ "label2id": {
24
+ "I-LOC": 1,
25
+ "I-MISC": 3,
26
+ "I-ORG": 4,
27
+ "I-PER": 2,
28
+ "O": 0
29
+ },
30
+ "layer_norm_eps": 1e-05,
31
+ "max_position_embeddings": 514,
32
+ "model_type": "camembert",
33
+ "num_attention_heads": 12,
34
+ "num_hidden_layers": 9,
35
+ "output_past": true,
36
+ "pad_token_id": 1,
37
+ "position_embedding_type": "absolute",
38
+ "transformers_version": "4.57.6",
39
+ "type_vocab_size": 1,
40
+ "use_cache": true,
41
+ "vocab_size": 32005
42
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6e7200be53a2bfec2ce8a86825b9bae13457193d16ce0252945376339a804abd
3
+ size 177561154
sentencepiece.bpe.model ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:988bc5a00281c6d210a5d34bd143d0363741a432fefe741bf71e61b1869d4314
3
+ size 810912
special_tokens_map.json ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "additional_special_tokens": [
3
+ "<s>NOTUSED",
4
+ "</s>NOTUSED",
5
+ "<unk>NOTUSED"
6
+ ],
7
+ "bos_token": {
8
+ "content": "<s>",
9
+ "lstrip": false,
10
+ "normalized": false,
11
+ "rstrip": false,
12
+ "single_word": false
13
+ },
14
+ "cls_token": {
15
+ "content": "<s>",
16
+ "lstrip": false,
17
+ "normalized": false,
18
+ "rstrip": false,
19
+ "single_word": false
20
+ },
21
+ "eos_token": {
22
+ "content": "</s>",
23
+ "lstrip": false,
24
+ "normalized": false,
25
+ "rstrip": false,
26
+ "single_word": false
27
+ },
28
+ "mask_token": {
29
+ "content": "<mask>",
30
+ "lstrip": true,
31
+ "normalized": false,
32
+ "rstrip": false,
33
+ "single_word": false
34
+ },
35
+ "pad_token": {
36
+ "content": "<pad>",
37
+ "lstrip": false,
38
+ "normalized": false,
39
+ "rstrip": false,
40
+ "single_word": false
41
+ },
42
+ "sep_token": {
43
+ "content": "</s>",
44
+ "lstrip": false,
45
+ "normalized": false,
46
+ "rstrip": false,
47
+ "single_word": false
48
+ },
49
+ "unk_token": {
50
+ "content": "<unk>",
51
+ "lstrip": false,
52
+ "normalized": false,
53
+ "rstrip": false,
54
+ "single_word": false
55
+ }
56
+ }
tokenizer.json ADDED
The diff for this file is too large to render. See raw diff
 
tokenizer_config.json ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "added_tokens_decoder": {
3
+ "0": {
4
+ "content": "<s>NOTUSED",
5
+ "lstrip": false,
6
+ "normalized": false,
7
+ "rstrip": false,
8
+ "single_word": false,
9
+ "special": true
10
+ },
11
+ "1": {
12
+ "content": "<pad>",
13
+ "lstrip": false,
14
+ "normalized": false,
15
+ "rstrip": false,
16
+ "single_word": false,
17
+ "special": true
18
+ },
19
+ "2": {
20
+ "content": "</s>NOTUSED",
21
+ "lstrip": false,
22
+ "normalized": false,
23
+ "rstrip": false,
24
+ "single_word": false,
25
+ "special": true
26
+ },
27
+ "4": {
28
+ "content": "<unk>",
29
+ "lstrip": false,
30
+ "normalized": false,
31
+ "rstrip": false,
32
+ "single_word": false,
33
+ "special": true
34
+ },
35
+ "5": {
36
+ "content": "<s>",
37
+ "lstrip": false,
38
+ "normalized": false,
39
+ "rstrip": false,
40
+ "single_word": false,
41
+ "special": true
42
+ },
43
+ "6": {
44
+ "content": "</s>",
45
+ "lstrip": false,
46
+ "normalized": false,
47
+ "rstrip": false,
48
+ "single_word": false,
49
+ "special": true
50
+ },
51
+ "32004": {
52
+ "content": "<mask>",
53
+ "lstrip": true,
54
+ "normalized": false,
55
+ "rstrip": false,
56
+ "single_word": false,
57
+ "special": true
58
+ },
59
+ "32005": {
60
+ "content": "<unk>NOTUSED",
61
+ "lstrip": false,
62
+ "normalized": false,
63
+ "rstrip": false,
64
+ "single_word": false,
65
+ "special": true
66
+ }
67
+ },
68
+ "additional_special_tokens": [
69
+ "<s>NOTUSED",
70
+ "</s>NOTUSED",
71
+ "<unk>NOTUSED"
72
+ ],
73
+ "bos_token": "<s>",
74
+ "clean_up_tokenization_spaces": false,
75
+ "cls_token": "<s>",
76
+ "eos_token": "</s>",
77
+ "extra_special_tokens": {},
78
+ "mask_token": "<mask>",
79
+ "model_max_length": 512,
80
+ "pad_token": "<pad>",
81
+ "sep_token": "</s>",
82
+ "tokenizer_class": "CamembertTokenizer",
83
+ "unk_token": "<unk>"
84
+ }