- Script demo_evaluation.py montrant tous les outils
- Correction test flottant dans test_quality_evaluator.py
- Installation pytest/pytest-cov
- Tous les tests passent (16/16)
Audit OGC 17/74 : ajout variante accentuée apyréxie, termes courants
(mode, retraitée, régression, tel) et noms de villes françaises pour
éviter leur masquage comme NOM_GLOBAL.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Ajout paramètre vlm_manager à process_pdf()
- Nouvelle fonction _apply_vlm_on_scanned_pdf() : envoie chaque page
au VLM (qwen2.5vl) pour détecter visuellement les PII
- Les entités VLM sont ajoutées à l'audit et au texte pseudonymisé
- Dégradation gracieuse : si Ollama indisponible, le pipeline continue
- Actif uniquement sur les PDFs scannés (ocr_used=True)
- Testé sur 2 scans : LACAZE/PAUL/CAPDUPUY détectés et masqués (0 PII résiduel)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Retirer "regina" de _MEDICAL_STOP_WORDS_SET (bloquait la détection du prénom)
- Ajouter regex "Prénom de naissance" / "Prénom utilisé" dans _extract_document_names
- Substitution tolérante aux sauts de ligne pour noms composés (tiret + \s*)
- Conserver les parties longues (>=5 chars) des noms composés dans _global_name_tokens
au lieu de les supprimer (le texte PDF peut les scinder sur des lignes séparées)
Vérifié : REGINA 33→0, NOCENT 90→0, EJNAINI 90→0 occurrences en clair
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Rasterisation parallèle (ProcessPoolExecutor) : _rasterize_page worker par page
- Déduplication tokens dans redact_pdf_vector : 401 hits → 28 tokens uniques par page
- Séparation phase search / phase annotate pour éviter dégradation PyMuPDF
- Déduplication tokens dans redact_pdf_raster (Phase 1)
- Index by_page dict au lieu de filtrage linéaire par page
- Ajout process_pdfs_batch() pour batch multi-PDF sans NER
- Support OCR word map dans vector et raster (fallback PDFs scannés)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Ajout glyc, glycosurie, vider, forte aux stop words médicaux
- Shrink horizontal de 1.5px sur les rectangles raster pour éviter
le débordement sur le texte adjacent (issue rectangles trop larges)
- Batch 10 OGC : 21 OK, 0 PII résiduel, 0 FP
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Ajout ~30 stop words : abréviations soins trackare (SOINS, LIT, JEUN, LEVER,
SURV, GGT, VVP, VERIF, NFS...) et mots narratifs CRH capturés par fusion
sidebar 2-colonnes (Evolution, Explorations, Cholécystectomie, Paracétamol...)
- Filtre NOM_GLOBAL renforcé : mots ALL-CAPS ≤4 chars confirmés par une seule
source regex sont rejetés (probables abréviations médicales, pas des noms)
- Résultat batch 10 OGC : CRH 23042753 passe de 326 à 284 hits
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Évite que le sigle HGT/Hgt soit masqué comme [NOM] dans les trackare (23 occurrences sur OGC 316).
Validé sur batch 20 OGC (42 OK, 0 PII résiduel, 0 FP).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Track A : chargement automatique de ~4200 noms de médicaments depuis edsnlp/drugs.json dans _MEDICAL_STOP_WORDS_SET (réduit les faux positifs médicaments)
- Track B : règles de validation EDS par type (NOM rejeté si contexte dosage, HOPITAL rejeté si < 5 chars ou mot structurel)
- Track C : nouveau script qc_audit.py pour contrôle qualité post-anonymisation (scan FN résiduels, densité placeholders, FP/FN candidats, mode batch CSV)
- Track D : garde structurelle trackare — NOM_GLOBAL <= 3 chars ignoré dans les documents trackare pour éviter de masquer des codes diagnostics
- Track E : détection enrichie des noms soignants (Pr/Professeur, Prescripteur, Prescrit par, Exécuté par, Réalisé par)
Testé sur 3 OGC (407, 316, 589) — 4 PDFs, 0 erreur, 0 PII résiduel, 0 faux positif détecté.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Skip EDS_TEL dans PDF (valeurs Pouls détectées comme N° de téléphone)
- Ajout EDS_VILLE au whole-word matching (évite "GEL" dans "GELULE")
- Filtre stop words étendu à EDS_HOPITAL et EDS_VILLE dans la détection NER
- Détection noms soignants dans "Note IDE\nPrenom NOM" (BARGAIN, LACOTE, etc.)
- Stop words : semaine, jour, matin, soir, nuit, midi
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Parseur trackare spécifique (détection par contenu, extraction structurée des PII)
- Support format "Dr X. NOM" et "Mme X. NOM" (initiales + noms composés avec tiret)
- Détection noms personnel médical (Aide, Cadre Infirmier, etc.)
- Masquage RPPS, établissements (EHPAD/SSR/USLD standalone), lieux de naissance
- Stop words médicaux enrichis (~270 entrées : DCI, spécialités, termes contextuels)
- Détection compagnon (noms adjacents à des noms connus dans le texte brut)
- Protection noms composés (JEAN-PIERRE traité comme un tout, pas JEAN + PIERRE)
- Nettoyage codes postaux orphelins, téléphones fragmentés/partiels
- Désactivation masquage dates génériques, AGE avec contexte obligatoire
- GUI : extraction OGC depuis le nom du répertoire parent, incrustation sur les pages
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Re-ajoute --nofollow-import-to pour tous les packages externes lourds
(onnxruntime, numpy, transformers, PIL, fitz, pdfplumber, etc.)
- Ajoute --no-deployment-flag=excluded-module-usage pour autoriser
leur import à l'exécution
- Nouvelle étape : pip install --target=dist pour copier les packages
Python directement dans le dossier de distribution
- Nuitka ne compile en C que nos 4 modules + stdlib + tkinter
- Les packages externes restent en bytecode Python natif (fiable)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- _app_dir() utilise toujours Path(__file__).parent au lieu de
dir() qui ne détecte pas __compiled__ dans une fonction
- Ajout crash.log + messagebox en cas d'erreur fatale
(même avec --windows-console-mode=disable)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Les flags --nofollow-import-to excluent complètement les modules du bundle
au lieu de juste sauter leur compilation C. pdfplumber, fitz, PIL etc.
étaient absents de l'exe. Augmente aussi le timeout à 120min.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- --standalone sans --onefile : produit un dossier au lieu d'un exe compressé
- Windows Defender ne bloque plus (pas de technique d'extraction suspecte)
- Le dossier est zippé pour distribution facile
- Renommé en Pseudonymisation/ pour plus de clarté
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
orderedset ne compile pas sur Windows/Python 3.12
(longintrepr.h manquant). C'est optionnel pour Nuitka.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Cache Nuitka entre les builds (accélère les rebuilds)
- --nofollow-import-to pour les gros packages déjà compilés
(onnxruntime, numpy, transformers, PIL, etc.)
- Nuitka les inclut tels quels sans les recompiler en C
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>