11 KiB
Analyse des Causes Racines - Régression de Qualité
Date: 2 mars 2026
Statut: 🔴 RÉGRESSION CRITIQUE IDENTIFIÉE
🎯 Résumé Exécutif
Constat: Le système montre une régression de qualité de 140% par rapport au test dataset, avec:
- +83 détections NOM supplémentaires par document (+126%)
- Artefacts OCR massifs rendant le texte illisible
- Sur-masquage de termes médicaux légitimes
- Médicaments masqués (perte d'information thérapeutique)
Cause Racine: Les documents de production sont scannés (raster) alors que le test dataset contenait des PDFs natifs (vector). Le pipeline OCR introduit des erreurs massives.
📊 Données Comparatives
Test Dataset (Bonne Qualité)
- PII/doc: 22.8
- NOM/doc: 13.2
- Global tokens: 0 (désactivés ✅)
- Extracted tokens: 0 (désactivés ✅)
- Type de PDF: Natif (vector)
Production (Régression)
- PII/doc: 54.8 (+140%)
- NOM/doc: 29.8 (+126%)
- Global tokens: 0 (désactivés ✅)
- Extracted tokens: 0 (désactivés ✅)
- Type de PDF: Scanné (raster)
🔍 Problèmes Identifiés
1. Artefacts OCR Massifs (CRITIQUE)
Symptôme:
Original: "N° RPPS 10100817005"
Extrait: "P Nr °a t Ric Pi Pen S h 1o 0s 1p 0i 0ta 8l 1ie 7r 005"
Cause Racine:
- Les PDFs de production sont des scans (images)
- L'extraction de texte utilise docTR OCR
- Les paramètres OCR ne sont pas optimisés pour les documents médicaux
- Pas de post-traitement pour nettoyer les artefacts
Impact:
- ❌ Texte illisible (perte de 30-50% de lisibilité)
- ❌ Identifiants fragmentés (RPPS, IPP, NIR)
- ❌ Noms de médecins fragmentés
- ❌ Informations médicales perdues
Preuve:
- 4 artefacts OCR détectés dans un seul document CRH
- Pattern récurrent:
P Nr °a t Ric Pi Pen S - Chiffres espacés:
1o 0s 1p 0i 0ta 8l 1ie 7r
2. Sur-Masquage des Termes Médicaux (HAUTE PRIORITÉ)
Symptôme:
"Chef de service" → "Chef de [MASK]"
"Chef de Clinique" → "Chef de [ETABLISSEMENT]" (12x dans un document)
Cause Racine:
- Regex
RE_SERVICEtrop agressive - Regex
RE_ETABLISSEMENTcapture "Chef de Clinique" - Pas de whitelist pour les termes médicaux structurels
Impact:
- ❌ Perte de contexte médical (fonction des médecins)
- ❌ Lisibilité réduite
- ❌ Information structurelle perdue
Preuve:
- "Chef de Clinique" masqué 12 fois dans CRH 23056364
- "Chef de service" masqué 1 fois
3. Médicaments Masqués (HAUTE PRIORITÉ)
Symptôme:
"IDACIO 40mg" → "[NOM] 40mg"
"Salazopyrine 500" → "Salazopyrine 500" (préservé)
Cause Racine:
- NER (EDS-Pseudo ou CamemBERT) détecte certains noms de médicaments comme des noms de personnes
- Pas de whitelist de médicaments
- Le filtre
_MEDICAL_STOP_WORDS_SETest incomplet
Impact:
- ❌ Perte d'information thérapeutique critique
- ❌ Impossible de reconstituer le traitement du patient
- ❌ Risque médical (perte de traçabilité)
Preuve:
- "IDACIO" masqué dans CRH 23056364
- Autres médicaments probablement masqués (à vérifier sur plus de documents)
4. Sur-Masquage des Dates (MOYENNE PRIORITÉ)
Symptôme:
16 [DATE] dans le document
3 [DATE_NAISSANCE]
Ratio: 5.3x plus de dates que de dates de naissance
Cause Racine:
- Regex
RE_DATEactive et masque TOUTES les dates - Pas de distinction entre dates de consultation et dates de naissance
- Propagation globale des dates de naissance fonctionne, mais les dates de consultation sont aussi masquées
Impact:
- ⚠️ Perte du contexte temporel médical
- ⚠️ Impossible de reconstituer la chronologie des soins
- ⚠️ Dates de consultation, d'examens, de traitement perdues
Note: Ce n'est PAS une fuite de sécurité (les dates de naissance sont bien masquées), mais une perte d'information médicale.
5. Sur-Masquage des Villes (BASSE PRIORITÉ)
Symptôme:
"originaire du [VILLE]" → Perte du contexte géographique
Cause Racine:
- Regex
RE_VILLEou NER détecte les villes - Pas de distinction entre ville de résidence (PII) et ville d'origine (contexte)
Impact:
- ⚠️ Perte de contexte géographique (origine du patient)
- ⚠️ Information potentiellement utile pour le diagnostic (maladies endémiques)
6. Détections NOM Excessives (+126%)
Symptôme:
- Test dataset: 13.2 NOM/doc
- Production: 29.8 NOM/doc (+126%)
Cause Racine:
- Hypothèse 1: Les artefacts OCR créent des "mots" qui ressemblent à des noms
- Exemple: "Ric Pi Pen S" pourrait être détecté comme un nom
- Hypothèse 2: Les documents scannés ont plus de noms de médecins répétés (en-têtes/pieds de page)
- Hypothèse 3: Le NER détecte des termes médicaux comme des noms (malgré le filtre)
Impact:
- ⚠️ Statistiques gonflées
- ⚠️ Possible sur-masquage de termes médicaux
À Vérifier:
- Analyser les détections NOM dans les audits de production
- Identifier les patterns récurrents
- Vérifier si ce sont de vrais noms ou des faux positifs
🎯 Causes Racines Hiérarchisées
Cause Racine #1: Type de PDF (Scanné vs Natif)
- Impact: CRITIQUE
- Preuve: Test dataset = natif, Production = scanné
- Conséquence: Artefacts OCR massifs, texte illisible
Cause Racine #2: Paramètres OCR Non Optimisés
- Impact: CRITIQUE
- Preuve: Artefacts OCR récurrents
- Conséquence: Perte de 30-50% de lisibilité
Cause Racine #3: Regex Trop Agressives
- Impact: HAUTE
- Preuve: "Chef de Clinique" masqué 12x
- Conséquence: Sur-masquage termes médicaux
Cause Racine #4: Whitelist Médicaments Manquante
- Impact: HAUTE
- Preuve: "IDACIO" masqué
- Conséquence: Perte information thérapeutique
Cause Racine #5: Masquage de Toutes les Dates
- Impact: MOYENNE
- Preuve: 16 [DATE] vs 3 [DATE_NAISSANCE]
- Conséquence: Perte contexte temporel
🚀 Plan de Correction Priorisé
Phase 1: Corrections Critiques (1-2 jours)
1.1 Optimiser l'OCR docTR
Objectif: Réduire les artefacts OCR de 80%
Actions:
- Augmenter la résolution d'entrée docTR (300 DPI → 400 DPI)
- Activer le post-traitement docTR
- Implémenter un nettoyage des artefacts OCR:
- Fusionner les lettres espacées (
P Nr °a t→Praticien) - Fusionner les chiffres espacés (
1o 0s 1p→10100) - Utiliser un dictionnaire médical pour corriger les mots fragmentés
- Fusionner les lettres espacées (
- Tester sur 10 documents scannés
Fichiers à modifier:
anonymizer_core_refactored_onnx.py(fonction_extract_with_doctr)
Critère de succès: <5% d'artefacts OCR résiduels
1.2 Créer Whitelist Médicaments
Objectif: Préserver 100% des noms de médicaments
Actions:
- Charger la liste edsnlp des médicaments (déjà implémenté:
_load_edsnlp_drug_names()) - Ajouter les médicaments courants manquants (IDACIO, etc.)
- Filtrer les détections NER si le mot est dans la whitelist
- Tester sur 10 documents avec médicaments
Fichiers à modifier:
anonymizer_core_refactored_onnx.py(fonction_mask_with_eds_pseudo)- Ajouter le filtre dans la boucle de masquage NER
Critère de succès: 0 médicament masqué
1.3 Raffiner Regex Termes Médicaux
Objectif: Préserver les termes médicaux structurels
Actions:
- Modifier
RE_SERVICEpour exclure "Chef de service" - Modifier
RE_ETABLISSEMENTpour exclure "Chef de Clinique" - Ajouter une whitelist de termes médicaux structurels:
- "Chef de service", "Chef de Clinique", "Praticien hospitalier"
- "Ancien Chef de Clinique", "Ancien Assistant"
- Tester sur 10 documents
Fichiers à modifier:
anonymizer_core_refactored_onnx.py(regexRE_SERVICE,RE_ETABLISSEMENT)
Critère de succès: 0 terme médical structurel masqué
Phase 2: Corrections Importantes (2-3 jours)
2.1 Masquer UNIQUEMENT les Dates de Naissance
Objectif: Préserver les dates de consultation/examen
Actions:
- Désactiver
RE_DATE(déjà fait dans le code actuel ✅) - Vérifier que seules les dates avec contexte "Né(e) le" sont masquées
- Tester sur 50 documents
Fichiers à modifier:
- Aucun (déjà implémenté)
Critère de succès: Ratio [DATE]/[DATE_NAISSANCE] < 1.5
2.2 Masquage Contextuel des Villes
Objectif: Masquer les villes de résidence, préserver les villes d'origine
Actions:
- Modifier
RE_VILLEpour détecter uniquement les villes dans un contexte d'adresse - Exclure les contextes "originaire de", "né à", etc.
- Tester sur 20 documents
Fichiers à modifier:
anonymizer_core_refactored_onnx.py(regexRE_VILLE)
Critère de succès: Villes de résidence masquées, villes d'origine préservées
Phase 3: Validation (1 jour)
3.1 Validation sur Corpus Complet
- Ré-anonymiser les 1,354 PDFs avec les corrections
- Comparer avec la baseline
- Mesurer les métriques:
- Artefacts OCR: <5%
- Médicaments masqués: 0
- Termes médicaux masqués: 0
- Ratio dates: <1.5
- Lisibilité: >80%
3.2 Validation Manuelle
- Sélectionner 20 documents aléatoires
- Vérifier manuellement la qualité
- Documenter les observations
📊 Métriques de Succès
| Métrique | Baseline | Actuel | Cible |
|---|---|---|---|
| Artefacts OCR | N/A | ~30% | <5% |
| Médicaments masqués | 0 | >0 | 0 |
| Termes médicaux masqués | 0 | >10 | 0 |
| Ratio dates | N/A | 5.3x | <1.5x |
| Lisibilité | 100% | ~60% | >80% |
| PII/doc | 22.8 | 54.8 | <30 |
| NOM/doc | 13.2 | 29.8 | <20 |
🔧 Fichiers à Modifier
Priorité 1 (Critique)
anonymizer_core_refactored_onnx.py:- Fonction
_extract_with_doctr()(optimiser OCR) - Fonction
_mask_with_eds_pseudo()(whitelist médicaments) - Regex
RE_SERVICE,RE_ETABLISSEMENT(termes médicaux)
- Fonction
Priorité 2 (Important)
anonymizer_core_refactored_onnx.py:- Regex
RE_VILLE(masquage contextuel)
- Regex
Priorité 3 (Validation)
tools/validate_full_corpus.py(ré-exécuter validation)evaluation/quality_evaluator.py(nouvelles métriques)
📝 Conclusion
La régression de qualité est entièrement expliquée par:
- Type de PDF: Production = scanné, Test = natif
- OCR non optimisé: Artefacts massifs
- Regex trop agressives: Sur-masquage
- Whitelist manquante: Médicaments masqués
Bonne nouvelle: Les mécanismes NOM_EXTRACTED et *_GLOBAL sont bien désactivés (0 détections).
Mauvaise nouvelle: Les artefacts OCR et le sur-masquage créent une régression de 140% des détections.
Solution: Optimiser l'OCR, ajouter les whitelists, raffiner les regex.
Temps estimé: 3-4 jours pour corriger tous les problèmes critiques.
Dernière mise à jour: 2 mars 2026
Auteur: Kiro AI Assistant
Statut: 🔴 ANALYSE COMPLÈTE - CORRECTIONS À IMPLÉMENTER