From 0eb27343ccf1245cf876790205b9bf9686e1aae8 Mon Sep 17 00:00:00 2001 From: Domi31tls Date: Thu, 26 Feb 2026 20:09:41 +0100 Subject: [PATCH] =?UTF-8?q?R=C3=A9duction=20sur-masquage=20:=20stop=20word?= =?UTF-8?q?s=20trackare/CRH=20+=20filtre=20NOM=5FGLOBAL=20court?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- anonymizer_core_refactored_onnx.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/anonymizer_core_refactored_onnx.py b/anonymizer_core_refactored_onnx.py index 64e1460..fbea58e 100644 --- a/anonymizer_core_refactored_onnx.py +++ b/anonymizer_core_refactored_onnx.py @@ -332,6 +332,13 @@ _MEDICAL_STOP_WORDS_SET = { "endoscopie", "endoscopique", "fibroscopie", "indication", "conclusion", "technique", "anesthésie", "digestif", "digestive", "digestives", "nutritive", + # Abréviations soins trackare détectées comme NOM (batch 20 OGC) + "soins", "lit", "jeun", "lever", "pose", "surv", "ggt", "vvp", + "verif", "crop", "evs", "maco", "pan", "cet", "trou", "nit", "ute", "nfs", + # Mots narratifs CRH capturés par fusion sidebar 2-colonnes + "evolution", "évolution", "explorations", "fermeture", "allergie", "allergies", + "lotissement", "cholangiographie", "cholecystectomie", "cholécystectomie", + "paracetamol", "paracétamol", "unité", "unite", } # Enrichissement automatique avec les ~4000 noms de médicaments d'edsnlp _MEDICAL_STOP_WORDS_SET.update(_load_edsnlp_drug_names()) @@ -1608,6 +1615,24 @@ def process_pdf( _parts_to_drop.add(part) _global_name_tokens -= _parts_to_drop + # 4a-ter) Filtrage final des tokens globaux : rejeter les mots qui ne ressemblent pas à des noms propres + # - Mots courants français (minuscule initiale déjà filtrés en amont) + # - ALL-CAPS <= 4 chars confirmés par une seule source seulement + _nom_kind_counts: Dict[str, set] = {} + for h in anon.audit: + if h.kind in _nom_kinds: + for word in h.original.split(): + word = word.strip(" .-'") + if word: + _nom_kind_counts.setdefault(word, set()).add(h.kind) + _filtered_global: set = set() + for token in _global_name_tokens: + # ALL-CAPS court (<=4) avec une seule source → probablement une abréviation + if token.isupper() and len(token) <= 4 and len(_nom_kind_counts.get(token, set())) < 2: + continue + _filtered_global.add(token) + _global_name_tokens = _filtered_global + for token in _global_name_tokens: anon.audit.append(PiiHit(page=-1, kind="NOM_GLOBAL", original=token, placeholder=PLACEHOLDERS["NOM"]))