124 lines
4.1 KiB
Python
Executable File
124 lines
4.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
Affiche un exemple d'anonymisation avec statistiques détaillées.
|
|
"""
|
|
import json
|
|
import sys
|
|
from pathlib import Path
|
|
from collections import Counter
|
|
|
|
def show_example(pdf_name: str = None):
|
|
"""Affiche les détails d'un document anonymisé."""
|
|
|
|
baseline_dir = Path("tests/ground_truth/pdfs/baseline_anonymized")
|
|
|
|
# Charger les résultats du batch
|
|
results_file = baseline_dir / "batch_results.json"
|
|
if not results_file.exists():
|
|
print(f"✗ Fichier de résultats non trouvé: {results_file}")
|
|
return 1
|
|
|
|
with open(results_file, 'r', encoding='utf-8') as f:
|
|
batch_data = json.load(f)
|
|
|
|
# Si pas de PDF spécifié, prendre le premier avec le plus de PII
|
|
if not pdf_name:
|
|
successful = [r for r in batch_data['results'] if r.get('success')]
|
|
if not successful:
|
|
print("✗ Aucun document traité avec succès")
|
|
return 1
|
|
|
|
# Trier par nombre de PII (décroissant)
|
|
successful.sort(key=lambda x: x.get('pii_count', 0), reverse=True)
|
|
pdf_name = successful[0]['pdf']
|
|
|
|
# Trouver le résultat
|
|
result = next((r for r in batch_data['results'] if r['pdf'] == pdf_name), None)
|
|
if not result:
|
|
print(f"✗ Document non trouvé: {pdf_name}")
|
|
return 1
|
|
|
|
if not result.get('success'):
|
|
print(f"✗ Document en échec: {pdf_name}")
|
|
print(f" Erreur: {result.get('error', 'Unknown')}")
|
|
return 1
|
|
|
|
# Charger l'audit
|
|
audit_file = baseline_dir / f"{Path(pdf_name).stem}.audit.jsonl"
|
|
if not audit_file.exists():
|
|
print(f"✗ Fichier d'audit non trouvé: {audit_file}")
|
|
return 1
|
|
|
|
detections = []
|
|
with open(audit_file, 'r', encoding='utf-8') as f:
|
|
for line in f:
|
|
if line.strip():
|
|
detections.append(json.loads(line))
|
|
|
|
# Analyser les détections
|
|
types_counter = Counter(d.get('kind', d.get('type', 'unknown')) for d in detections)
|
|
methods_counter = Counter(d.get('method', 'unknown') for d in detections)
|
|
pages_counter = Counter(d['page'] for d in detections)
|
|
|
|
# Afficher
|
|
print("="*80)
|
|
print(f"EXEMPLE D'ANONYMISATION: {pdf_name}")
|
|
print("="*80)
|
|
|
|
print(f"\n📄 Document: {pdf_name}")
|
|
print(f"⏱️ Temps de traitement: {result['time_s']:.2f}s")
|
|
print(f"🔍 PII détectés: {result['pii_count']}")
|
|
|
|
print(f"\n📊 Répartition par type:")
|
|
for pii_type, count in types_counter.most_common():
|
|
print(f" - {pii_type}: {count}")
|
|
|
|
print(f"\n🔬 Répartition par méthode de détection:")
|
|
for method, count in methods_counter.most_common():
|
|
print(f" - {method}: {count}")
|
|
|
|
print(f"\n📖 Répartition par page:")
|
|
for page, count in sorted(pages_counter.items()):
|
|
print(f" - Page {page}: {count} PII")
|
|
|
|
# Exemples de détections
|
|
print(f"\n🔍 Exemples de détections (5 premiers):")
|
|
for i, det in enumerate(detections[:5], 1):
|
|
text = det.get('original', det.get('text', ''))
|
|
if len(text) > 40:
|
|
text = text[:37] + "..."
|
|
pii_type = det.get('kind', det.get('type', 'unknown'))
|
|
print(f" {i}. [{pii_type}] \"{text}\" (page {det['page']}, méthode: {det.get('method', 'unknown')})")
|
|
|
|
# Fichiers générés
|
|
print(f"\n📂 Fichiers générés:")
|
|
stem = Path(pdf_name).stem
|
|
files = [
|
|
baseline_dir / f"{stem}.pseudonymise.txt",
|
|
baseline_dir / f"{stem}.redacted_vector.pdf",
|
|
baseline_dir / f"{stem}.redacted_raster.pdf",
|
|
baseline_dir / f"{stem}.audit.jsonl"
|
|
]
|
|
for f in files:
|
|
status = "✓" if f.exists() else "✗"
|
|
print(f" {status} {f.name}")
|
|
|
|
print("\n" + "="*80)
|
|
|
|
return 0
|
|
|
|
|
|
def main():
|
|
import argparse
|
|
|
|
parser = argparse.ArgumentParser(description="Afficher un exemple d'anonymisation")
|
|
parser.add_argument("pdf", nargs="?", help="Nom du PDF (optionnel, par défaut le plus complexe)")
|
|
|
|
args = parser.parse_args()
|
|
|
|
return show_example(args.pdf)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|