# Guide d'Annotation - Dataset de Test ## Vue d'Ensemble Ce guide explique comment utiliser l'outil d'annotation CLI pour créer le dataset de test annoté nécessaire à l'évaluation de la qualité d'anonymisation. ## Objectif Créer un corpus de 27 documents PDF annotés manuellement avec : - Tous les PII (Personally Identifiable Information) présents - Le type de chaque PII (NOM, TEL, EMAIL, etc.) - Le contexte de détection - Les termes médicaux à préserver ## Installation L'outil d'annotation nécessite PyMuPDF (fitz) : ```bash pip install pymupdf ``` ## Utilisation ### Lister les documents disponibles ```bash python tools/annotation_tool.py --list ``` Affiche la liste des 27 documents avec leur statut d'annotation. ### Annoter un document spécifique ```bash python tools/annotation_tool.py tests/ground_truth/pdfs/001_simple_unknown_BACTERIO_23018396.pdf ``` ### Reprendre l'annotation (mode automatique) ```bash python tools/annotation_tool.py --resume ``` Trouve automatiquement le prochain document non annoté et lance l'annotation. ## Workflow d'Annotation ### 1. Métadonnées du document Au démarrage, l'outil demande : - **Nom de l'annotateur** : Votre identifiant (ex: `annotator_1`) - **Type de document** : - `compte_rendu` : Compte-rendu hospitalier - `trackare` : Document Trackare - `anapath` : Compte-rendu d'anatomopathologie - `bacterio` : Résultat de bactériologie - `consultation` : Consultation médicale - `autre` : Autre type - **Difficulté globale** : - `simple` : 1-2 pages, peu de PII - `moyen` : 3-5 pages, PII variés - `complexe` : >5 pages, nombreux PII ### 2. Annotation page par page Pour chaque page : 1. **Affichage du texte** : Le texte de la page est affiché 2. **Confirmation** : "Annoter cette page? [O/n]" 3. **Annotation des PII** : Pour chaque PII détecté #### Annotation d'un PII Pour chaque PII, l'outil demande : **a) Texte du PII** ``` Texte du PII (ou 'q' pour terminer, 's' pour sauter): DUPONT ``` - Entrez le texte exact du PII tel qu'il apparaît dans le document - `q` : Terminer l'annotation de cette page - `s` : Sauter cette annotation **b) Type de PII** ``` Type de PII: 1. NOM 2. PRENOM 3. DATE_NAISSANCE 4. AGE 5. TEL 6. EMAIL 7. ADRESSE 8. CODE_POSTAL 9. VILLE 10. NIR 11. IPP 12. NDA 13. RPPS 14. FINESS 15. OGC 16. NUMERO_PATIENT 17. NUMERO_LOT 18. NUMERO_ORDONNANCE 19. NUMERO_SEJOUR 20. ETABLISSEMENT 21. SERVICE 22. DATE 23. AUTRE Choix [1-23]: ``` **c) Contexte** ``` Contexte détecté: Dr. DUPONT a examiné le patient... Utiliser ce contexte? [O/n]: ``` - L'outil détecte automatiquement le contexte (50 caractères avant/après) - Vous pouvez l'accepter ou saisir un contexte manuel **d) PII obligatoire (RGPD)?** ``` PII obligatoire (RGPD)? [O/n]: ``` - `O` (défaut) : PII obligatoire selon le RGPD (doit être masqué) - `n` : PII optionnel (peut être masqué ou non) **e) Difficulté de détection** ``` Difficulté de détection: 1. easy (défaut) 2. medium 3. hard Choix [1-3]: ``` - `easy` : Facilement détectable (format structuré, contexte clair) - `medium` : Détection moyenne (contexte faible, format variable) - `hard` : Difficile à détecter (manuscrit, mal orienté, format inhabituel) **f) Méthodes de détection attendues** ``` Méthodes de détection attendues (séparées par des virgules): Options: regex, vlm, ner, contextual, trackare Méthodes [regex,ner]: ``` - `regex` : Détectable par expressions régulières - `vlm` : Détectable par Vision Language Model (manuscrit, scanné) - `ner` : Détectable par Named Entity Recognition - `contextual` : Détectable par analyse contextuelle - `trackare` : Détectable par extraction Trackare Exemples : - Téléphone : `regex` - Nom manuscrit : `vlm,ner` - Nom après "Dr." : `regex,ner,contextual` ### 3. Termes médicaux à préserver Après l'annotation des PII, l'outil demande les termes médicaux qui ne doivent PAS être masqués : ``` === Termes médicaux à préserver === Entrez les termes médicaux qui ne doivent PAS être masqués (un par ligne, ligne vide pour terminer) Terme médical: Médecin DIM ✓ Ajouté: Médecin DIM Terme médical: Service de cardiologie ✓ Ajouté: Service de cardiologie Terme médical: ``` Exemples de termes à préserver : - Noms de services : "Service de cardiologie", "Urgences" - Fonctions : "Médecin DIM", "Praticien conseil" - Établissements génériques : "Centre Hospitalier" - Termes médicaux : "Diabète", "Hypertension" ### 4. Sauvegarde Les annotations sont sauvegardées automatiquement dans : ``` tests/ground_truth/pdfs/.annotations.json ``` ## Format de Sortie Le fichier JSON généré contient : ```json { "pdf_path": "tests/ground_truth/pdfs/001_simple_unknown_BACTERIO_23018396.pdf", "metadata": { "annotator": "annotator_1", "annotation_date": "2024-01-15T10:30:00", "document_type": "bacterio", "page_count": 1, "difficulty": "simple" }, "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 } } } ``` ## Bonnes Pratiques ### Exhaustivité - **Annoter TOUS les PII** : Ne pas oublier les PII peu évidents - **Vérifier toutes les pages** : Même les pages qui semblent vides - **Inclure les PII partiels** : Ex: "M. D***" si le nom est partiellement masqué ### Cohérence - **Utiliser les mêmes types** : "NOM" pour tous les noms de famille - **Contexte significatif** : Inclure suffisamment de contexte pour comprendre - **Difficulté réaliste** : Évaluer objectivement la difficulté de détection ### Qualité - **Texte exact** : Copier-coller le texte exact du PII - **Pas de fautes** : Vérifier l'orthographe - **Termes médicaux** : Lister tous les termes à préserver ## Types de PII - Guide de Référence | Type | Description | Exemples | |------|-------------|----------| | NOM | Nom de famille | DUPONT, MARTIN | | PRENOM | Prénom | Jean, Marie | | DATE_NAISSANCE | Date de naissance | 15/03/1980 | | AGE | Âge | 45 ans | | TEL | Téléphone | 01 23 45 67 89 | | EMAIL | Email | jean.dupont@example.com | | ADRESSE | Adresse postale | 12 rue de la Paix | | CODE_POSTAL | Code postal | 75001 | | VILLE | Ville | Paris | | NIR | Numéro de sécurité sociale | 1 80 03 75 001 234 56 | | IPP | Identifiant Permanent Patient | 12345678 | | NDA | Numéro de Dossier Administratif | 23042753 | | RPPS | Numéro RPPS (médecin) | 10001234567 | | FINESS | Numéro FINESS (établissement) | 750000001 | | OGC | Numéro OGC | 257 | | NUMERO_PATIENT | Numéro de patient | PAT-12345 | | NUMERO_LOT | Numéro de lot | LOT-2024-001 | | NUMERO_ORDONNANCE | Numéro d'ordonnance | ORD-12345 | | NUMERO_SEJOUR | Numéro de séjour | SEJ-2024-001 | | ETABLISSEMENT | Nom d'établissement | CHU de Bordeaux | | SERVICE | Nom de service | Cardiologie | | DATE | Date quelconque | 15/01/2024 | | AUTRE | Autre type de PII | - | ## Estimation du Temps - **Document simple** (1-2 pages) : 15-30 minutes - **Document moyen** (3-5 pages) : 30-60 minutes - **Document complexe** (>5 pages) : 1-2 heures **Total pour 27 documents** : ~20-30 heures ## Validation Après annotation, vérifier : 1. **Tous les PII sont annotés** : Relire le document 2. **Types corrects** : Vérifier la cohérence des types 3. **Contexte pertinent** : Le contexte aide à comprendre le PII 4. **Termes médicaux** : Liste complète des termes à préserver ## Commandes Utiles ```bash # Lister les documents python tools/annotation_tool.py --list # Annoter le prochain document python tools/annotation_tool.py --resume # Annoter un document spécifique python tools/annotation_tool.py tests/ground_truth/pdfs/001_simple_unknown_BACTERIO_23018396.pdf # Compter les documents annotés ls tests/ground_truth/pdfs/*.annotations.json | wc -l # Afficher les statistiques d'un document annoté cat tests/ground_truth/pdfs/001_simple_unknown_BACTERIO_23018396.annotations.json | jq '.statistics' ``` ## Dépannage ### Erreur "Fichier introuvable" Vérifier que le PDF existe : ```bash ls tests/ground_truth/pdfs/ ``` ### Erreur "PyMuPDF not found" Installer PyMuPDF : ```bash pip install pymupdf ``` ### Annotations écrasées par erreur Les annotations sont sauvegardées dans des fichiers `.annotations.json` séparés. Si vous écrasez par erreur, il n'y a pas de backup automatique. Faites des commits Git réguliers ! ## Support Pour toute question ou problème : 1. Consulter ce guide 2. Vérifier les exemples dans `tests/ground_truth/pdfs/` 3. Contacter l'équipe projet --- **Bon courage pour l'annotation ! 🎯**