Files
anonymisation/.kiro/specs/anonymization-quality-optimization/ROOT_CAUSE_ANALYSIS.md

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_SERVICE trop agressive
  • Regex RE_ETABLISSEMENT capture "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_SET est 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_DATE active 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_VILLE ou 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:

  1. Augmenter la résolution d'entrée docTR (300 DPI → 400 DPI)
  2. Activer le post-traitement docTR
  3. Implémenter un nettoyage des artefacts OCR:
    • Fusionner les lettres espacées (P Nr °a tPraticien)
    • Fusionner les chiffres espacés (1o 0s 1p10100)
    • Utiliser un dictionnaire médical pour corriger les mots fragmentés
  4. 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:

  1. Charger la liste edsnlp des médicaments (déjà implémenté: _load_edsnlp_drug_names())
  2. Ajouter les médicaments courants manquants (IDACIO, etc.)
  3. Filtrer les détections NER si le mot est dans la whitelist
  4. 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:

  1. Modifier RE_SERVICE pour exclure "Chef de service"
  2. Modifier RE_ETABLISSEMENT pour exclure "Chef de Clinique"
  3. Ajouter une whitelist de termes médicaux structurels:
    • "Chef de service", "Chef de Clinique", "Praticien hospitalier"
    • "Ancien Chef de Clinique", "Ancien Assistant"
  4. Tester sur 10 documents

Fichiers à modifier:

  • anonymizer_core_refactored_onnx.py (regex RE_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:

  1. Désactiver RE_DATE (déjà fait dans le code actuel )
  2. Vérifier que seules les dates avec contexte "Né(e) le" sont masquées
  3. 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:

  1. Modifier RE_VILLE pour détecter uniquement les villes dans un contexte d'adresse
  2. Exclure les contextes "originaire de", "né à", etc.
  3. Tester sur 20 documents

Fichiers à modifier:

  • anonymizer_core_refactored_onnx.py (regex RE_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

  1. Ré-anonymiser les 1,354 PDFs avec les corrections
  2. Comparer avec la baseline
  3. 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

  1. Sélectionner 20 documents aléatoires
  2. Vérifier manuellement la qualité
  3. 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)

  1. 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)

Priorité 2 (Important)

  1. anonymizer_core_refactored_onnx.py:
    • Regex RE_VILLE (masquage contextuel)

Priorité 3 (Validation)

  1. tools/validate_full_corpus.py (ré-exécuter validation)
  2. evaluation/quality_evaluator.py (nouvelles métriques)

📝 Conclusion

La régression de qualité est entièrement expliquée par:

  1. Type de PDF: Production = scanné, Test = natif
  2. OCR non optimisé: Artefacts massifs
  3. Regex trop agressives: Sur-masquage
  4. 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