Réduction sur-masquage : stop words trackare/CRH + filtre NOM_GLOBAL court

- 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>
This commit is contained in:
2026-02-26 20:09:41 +01:00
parent 50b6f6b70f
commit 0eb27343cc

View File

@@ -332,6 +332,13 @@ _MEDICAL_STOP_WORDS_SET = {
"endoscopie", "endoscopique", "fibroscopie", "endoscopie", "endoscopique", "fibroscopie",
"indication", "conclusion", "technique", "anesthésie", "indication", "conclusion", "technique", "anesthésie",
"digestif", "digestive", "digestives", "nutritive", "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 # Enrichissement automatique avec les ~4000 noms de médicaments d'edsnlp
_MEDICAL_STOP_WORDS_SET.update(_load_edsnlp_drug_names()) _MEDICAL_STOP_WORDS_SET.update(_load_edsnlp_drug_names())
@@ -1608,6 +1615,24 @@ def process_pdf(
_parts_to_drop.add(part) _parts_to_drop.add(part)
_global_name_tokens -= _parts_to_drop _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: for token in _global_name_tokens:
anon.audit.append(PiiHit(page=-1, kind="NOM_GLOBAL", original=token, placeholder=PLACEHOLDERS["NOM"])) anon.audit.append(PiiHit(page=-1, kind="NOM_GLOBAL", original=token, placeholder=PLACEHOLDERS["NOM"]))