demo: Test d'anonymisation sur document réel

- Test sur 003_simple_compte_rendu_CRO_23155084.pdf
- 25 PII détectés (4 sur page principale + propagation globale)
- Types: NOM, ADRESSE, CODE_POSTAL, DATE_NAISSANCE
- Validation: AUCUNE FUITE détectée ✓
- Scripts d'analyse: analyze_anonymization_result.py, demo_complete_anonymization.py
- Résultats dans tests/ground_truth/pdfs/anonymized_test/
This commit is contained in:
2026-03-02 10:19:55 +01:00
parent c78f9f415d
commit f61e767ee6
7 changed files with 419 additions and 0 deletions

130
test_anonymization_example.py Executable file
View File

@@ -0,0 +1,130 @@
#!/usr/bin/env python3
"""
Test d'anonymisation sur un document réel avec analyse des résultats.
"""
import sys
from pathlib import Path
# Importer le système d'anonymisation
from anonymizer_core_refactored_onnx import anonymize_pdf_file
# Importer les outils d'évaluation
from evaluation import LeakScanner
def main():
# Sélectionner un document simple
pdf_path = Path("tests/ground_truth/pdfs/003_simple_compte_rendu_CRO_23155084.pdf")
if not pdf_path.exists():
print(f"✗ Document introuvable: {pdf_path}")
return 1
print("="*80)
print("TEST D'ANONYMISATION SUR UN DOCUMENT RÉEL")
print("="*80)
print(f"\n📄 Document: {pdf_path.name}")
print(f" Type: Compte-rendu opératoire (CRO)")
print(f" Complexité: Simple (1 page)")
# Créer le répertoire de sortie
output_dir = Path("tests/ground_truth/pdfs/anonymized_test")
output_dir.mkdir(exist_ok=True)
print(f"\n📁 Répertoire de sortie: {output_dir}")
# Anonymiser le document
print("\n🔄 Anonymisation en cours...")
print(" (Cela peut prendre quelques secondes)")
try:
result = anonymize_pdf_file(
pdf_path=str(pdf_path),
output_dir=str(output_dir),
use_ner=True, # Activer le NER
use_vlm=False, # Désactiver le VLM pour ce test (plus rapide)
raster_dpi=150,
force_raster=False
)
print("\n✓ Anonymisation terminée !")
# Afficher les résultats
if result:
audit_path = output_dir / f"{pdf_path.stem}.audit.jsonl"
redacted_pdf = output_dir / f"{pdf_path.stem}.redacted_raster.pdf"
if not redacted_pdf.exists():
redacted_pdf = output_dir / f"{pdf_path.stem}.redacted_vector.pdf"
print(f"\n📊 Fichiers générés:")
print(f" - PDF anonymisé: {redacted_pdf.name}")
print(f" - Audit: {audit_path.name}")
# Compter les PII détectés
if audit_path.exists():
with open(audit_path, 'r', encoding='utf-8') as f:
pii_count = sum(1 for line in f if line.strip())
print(f"\n🔍 PII détectés: {pii_count}")
# Afficher les premiers PII
print("\n📋 Premiers PII détectés:")
with open(audit_path, 'r', encoding='utf-8') as f:
for i, line in enumerate(f):
if i >= 10: # Limiter à 10
break
if line.strip():
import json
pii = json.loads(line)
print(f" {i+1}. {pii.get('kind', 'UNKNOWN'):15s} : {pii.get('original', '')[:50]}")
if pii_count > 10:
print(f" ... et {pii_count - 10} autres")
# Scanner les fuites
print("\n🔒 Scan de fuite en cours...")
scanner = LeakScanner()
if redacted_pdf.exists():
leak_report = scanner.scan(redacted_pdf, audit_path)
if leak_report.is_safe:
print(" ✓ DOCUMENT SÛR - Aucune fuite détectée")
else:
print(f" ✗ ATTENTION - {leak_report.leak_count} fuite(s) détectée(s)")
# Afficher les fuites par sévérité
for severity, count in sorted(leak_report.severity_counts.items()):
print(f" - {severity}: {count}")
# Afficher les premières fuites
print("\n Détails des fuites:")
for i, leak in enumerate(leak_report.leaks[:5], 1):
print(f" {i}. [{leak['severity']}] {leak['message']}")
if leak_report.leak_count > 5:
print(f" ... et {leak_report.leak_count - 5} autres")
else:
print(" ⚠ PDF anonymisé introuvable, impossible de scanner")
print("\n" + "="*80)
print("✨ Test terminé avec succès !")
print("="*80)
print(f"\n📂 Fichiers disponibles dans: {output_dir}")
print("\n💡 Pour voir le PDF anonymisé:")
print(f" xdg-open {redacted_pdf}")
return 0
else:
print("\n✗ Erreur lors de l'anonymisation")
return 1
except Exception as e:
print(f"\n✗ Erreur: {e}")
import traceback
traceback.print_exc()
return 1
if __name__ == "__main__":
sys.exit(main())