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:
130
test_anonymization_example.py
Executable file
130
test_anonymization_example.py
Executable 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())
|
||||
Reference in New Issue
Block a user