# Module d'Évaluation de la Qualité d'Anonymisation Ce module fournit des outils pour évaluer et valider la qualité de l'anonymisation des documents PDF médicaux. ## Composants ### 1. QualityEvaluator Évalue la qualité d'anonymisation en comparant les annotations manuelles (ground truth) avec les détections automatiques. **Métriques calculées** : - Précision (Precision) : TP / (TP + FP) - Rappel (Recall) : TP / (TP + FN) - F1-Score : 2 × (Precision × Recall) / (Precision + Recall) **Usage** : ```python from evaluation import QualityEvaluator from pathlib import Path evaluator = QualityEvaluator(Path("tests/ground_truth/pdfs")) # Évaluer un document result = evaluator.evaluate( pdf_path=Path("tests/ground_truth/pdfs/001_simple_unknown_BACTERIO_23018396.pdf"), audit_path=Path("tests/ground_truth/pdfs/001_simple_unknown_BACTERIO_23018396.audit.jsonl") ) print(f"Précision: {result.precision:.4f}") print(f"Rappel: {result.recall:.4f}") print(f"F1-Score: {result.f1_score:.4f}") # Générer un rapport report = evaluator.generate_report([result]) print(report) # Exporter en JSON evaluator.export_json([result], Path("evaluation_results.json")) ``` ### 2. LeakScanner Scanne les documents anonymisés pour détecter les fuites de PII (données personnelles résiduelles). **Vérifications** : - PII originaux encore présents (CRITIQUE) - Nouveaux PII détectés (HAUTE) - Métadonnées PDF suspectes (MOYENNE) **Usage** : ```python from evaluation import LeakScanner from pathlib import Path scanner = LeakScanner() # Scanner un document anonymisé report = scanner.scan( anonymized_pdf=Path("output/document.redacted.pdf"), original_audit=Path("output/document.audit.jsonl") ) if report.is_safe: print("✓ Document sûr - Aucune fuite détectée") else: print(f"✗ {report.leak_count} fuite(s) détectée(s)") for leak in report.leaks: print(f" - {leak['severity']}: {leak['message']}") # Générer un rapport report_text = scanner.generate_report(report, Path("document.pdf")) print(report_text) # Exporter en JSON scanner.export_json(report, Path("leak_report.json")) ``` ### 3. Benchmark Mesure les performances du système d'anonymisation (temps, CPU, RAM). **Métriques collectées** : - Temps de traitement (total, par page) - Utilisation CPU (%) - Utilisation RAM (MB) - Nombre de PII détectés **Usage** : ```python from evaluation import Benchmark from pathlib import Path benchmark = Benchmark(Path("tests/ground_truth/pdfs")) # Définir la fonction d'anonymisation à benchmarker def anonymize_func(pdf_path): # Votre code d'anonymisation ici # Retourner le chemin vers le fichier .audit.jsonl return pdf_path.parent / f"{pdf_path.stem}.audit.jsonl" # Benchmarker des documents pdf_list = list(Path("tests/ground_truth/pdfs").glob("*.pdf")) results = benchmark.run(pdf_list, anonymize_func) # Générer un rapport report = benchmark.generate_report(results) print(report) # Exporter en JSON benchmark.export_json(results, Path("benchmark_results.json")) # Exporter en CSV benchmark.export_csv(results, Path("benchmark_results.csv")) ``` ## Installation Dépendances requises : ```bash pip install pymupdf psutil ``` ## Tests Exécuter les tests unitaires : ```bash pytest tests/unit/test_quality_evaluator.py -v pytest tests/unit/test_leak_scanner.py -v pytest tests/unit/test_benchmark.py -v ``` ## Format des Données ### Annotations (ground truth) Format JSON : ```json { "pdf_path": "document.pdf", "metadata": { "annotator": "annotator_1", "annotation_date": "2024-01-15T10:30:00", "document_type": "compte_rendu", "page_count": 3, "difficulty": "medium" }, "annotations": [ { "id": "ann_001", "page": 0, "type": "NOM", "text": "DUPONT", "bbox": null, "context": "Dr. DUPONT a examiné le patient", "mandatory": true, "difficulty": "easy", "detection_method_expected": ["regex", "ner", "contextual"] } ], "medical_terms_to_preserve": [ "Médecin DIM", "Service de cardiologie" ], "statistics": { "total_pii": 1, "by_type": { "NOM": 1 } } } ``` ### Audit (détections) Format JSONL (une ligne par PII détecté) : ```json {"page": 0, "kind": "NOM", "original": "DUPONT", "placeholder": "[NOM]"} {"page": 0, "kind": "TEL", "original": "01 23 45 67 89", "placeholder": "[TEL]"} ``` ## Métriques Cibles Pour garantir la conformité RGPD et la qualité d'anonymisation : - **Rappel (Recall)** : ≥ 99.5% (maximum 0.5% de PII manqués) - **Précision (Precision)** : ≥ 97% (maximum 3% de faux positifs) - **F1-Score** : ≥ 0.98 - **Taux de documents sûrs** : ≥ 98% (documents avec 0 faux négatif) ## Workflow Complet 1. **Annoter les documents** : Utiliser `tools/annotation_tool.py` 2. **Anonymiser les documents** : Utiliser le système d'anonymisation 3. **Évaluer la qualité** : Utiliser `QualityEvaluator` 4. **Scanner les fuites** : Utiliser `LeakScanner` 5. **Benchmarker les performances** : Utiliser `Benchmark` 6. **Analyser les résultats** : Identifier les améliorations nécessaires ## Exemples de Rapports ### Rapport d'Évaluation ``` ================================================================================ RAPPORT D'ÉVALUATION DE LA QUALITÉ D'ANONYMISATION ================================================================================ Documents évalués: 27 MÉTRIQUES GLOBALES: True Positives: 245 False Positives: 8 False Negatives: 2 Précision moyenne: 0.9684 (96.84%) Rappel moyen: 0.9919 (99.19%) F1-Score moyen: 0.9800 RÉSULTATS PAR DOCUMENT: 001_simple_unknown_BACTERIO_23018396.pdf Précision: 1.0000 Rappel: 1.0000 F1: 1.0000 TP: 10 FP: 0 FN: 0 ``` ### Rapport de Fuite ``` ================================================================================ RAPPORT DE FUITE - document.redacted.pdf ================================================================================ ✓ DOCUMENT SÛR - Aucune fuite détectée ================================================================================ ``` ### Rapport de Benchmark ``` ================================================================================ RAPPORT DE BENCHMARK - PERFORMANCE D'ANONYMISATION ================================================================================ SYSTÈME: OS: Linux 6.8.0 CPU: AMD Ryzen 9 9950X Cœurs: 16 physiques / 32 logiques RAM: 128.0 GB Python: 3.12.0 RÉSUMÉ: Documents: 27 Temps moyen: 8.5s Temps min/max: 2.1s / 25.3s CPU moyen: 45.2% RAM moyenne: 1024.5 MB PII détectés: 245 (moy: 9.1) ``` ## Licence Ce module fait partie du système d'anonymisation de documents PDF médicaux.