- Sélection et copie de 27 documents représentatifs (10 simples, 12 moyens, 5 complexes) - Outil d'annotation CLI complet (tools/annotation_tool.py) - Guide d'annotation détaillé (docs/annotation_guide.md) - Évaluateur de qualité (evaluation/quality_evaluator.py) * Calcul Précision, Rappel, F1-Score * Identification faux positifs/négatifs * Métriques par type de PII * Export JSON et rapports texte - Scanner de fuite (evaluation/leak_scanner.py) * Détection PII résiduels (CRITIQUE) * Détection nouveaux PII (HAUTE) * Scan métadonnées PDF (MOYENNE) - Benchmark de performance (evaluation/benchmark.py) * Mesure temps de traitement * Mesure CPU/RAM * Export JSON/CSV - Tests unitaires complets pour tous les composants - Documentation complète du module d'évaluation Tâches complétées: - 1.1.1 Sélection de 27 documents (au lieu de 30) - 1.1.2 Outil d'annotation CLI - 1.2.1 Évaluateur de qualité - 1.2.2 Scanner de fuite - 1.2.3 Benchmark de performance Prochaines étapes: - 1.1.3 Annotation des 27 documents (manuel) - 1.1.4 Enrichissement stopwords médicaux - 1.3 Mesure de la baseline
341 lines
8.8 KiB
Markdown
341 lines
8.8 KiB
Markdown
# 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/<nom_du_pdf>.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 ! 🎯**
|