fix: corrections retours relecteur — fuites adresses/établissements + FP médicaments

Fuites corrigées :
- "Le BOURG" : nouveau regex RE_LIEU_DIT_SEUL pour lieux-dits courants
- "CABINET ETXEBARNONDOA" : nouveau regex RE_EXTRACT_CABINET
- "REED LES EMBRUNS" : ajouté force_mask_terms + force_mask_regex case-insensitive
- "au [ETABLISSEMENT] nocturne" : "long cours" exclu des phrases FINESS

Faux positifs corrigés :
- "OXYGENE LUNETTES" : "lunettes" ajouté aux stop-words
- "POTASSIUM CHLORURE" : "chlorure" ajouté aux stop-words
- Phrases FINESS génériques étendues (le bourg, le val, les pins...)

Score évaluation maintenu à 100.0/100 (A+)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-16 18:04:08 +01:00
parent d957e72aff
commit 27d19ebed7
2 changed files with 33 additions and 1 deletions

View File

@@ -742,13 +742,17 @@ _MEDICAL_STOP_WORDS_SET = {
"infectieuse", "infectieuses",
# Termes soins infirmiers / activités de la vie quotidienne (FP trackare doc 216)
"aide", "partielle", "partiel", "complete", "complète", "complet",
"contention", "lavabo", "blader", "scan", "post",
"contention", "lavabo", "blader", "scan", "post", "lunettes",
"deshabillage", "déshabillage", "habillage",
"surveillance", "surv", "refection", "réfection",
"miction", "toilette", "douche", "changes",
"installation", "transfert", "mobilisation",
"alimentation", "hydratation", "collation",
"stimulation", "prevention", "prévention",
# Termes pharmaceutiques/matériel médical FP (retour relecteur 2026-03-16)
"chlorure",
# Dispositifs médicaux (FP "OXYGENE LUNETTES" → [NOM])
"canule", "canules", "masque", "sonde", "sondes",
}
# Enrichissement automatique avec les ~4000 noms de médicaments d'edsnlp
_MEDICAL_STOP_WORDS_SET.update(_load_edsnlp_drug_names())
@@ -885,6 +889,12 @@ RE_EXTRACT_COURRIER = re.compile(
r"Courrier\s+(?:Epi|Ep[ée]ph[ée]m[eé]ride|Hospit)\s*[\-]\s*"
rf"((?:{_UC_NAME_TOKEN})(?:\s*,\s*(?:{_UC_NAME_TOKEN}))*)",
)
# "CABINET ETXEBARNONDOA", "Cabinet Médical DUPONT", "CABINET MEDICAL DU DR MACHIN"
RE_EXTRACT_CABINET = re.compile(
r"\bCABINET\s+(?:M[ÉEe]DICAL\s+)?(?:DU\s+)?(?:DR\.?\s+)?"
rf"((?:{_UC_NAME_TOKEN})(?:[ \t]+(?:{_UC_NAME_TOKEN})){{0,2}})",
re.IGNORECASE,
)
# Téléphone avec extension slash : 05.59.44.38.32/34
RE_TEL_SLASH = re.compile(
r"(?<!\d)(?:\+33\s?|0)\d(?:[\s.\-]?\d){8}(?:/\d{1,4})(?!\d)"
@@ -910,6 +920,11 @@ RE_ADRESSE_LIEU_DIT = re.compile(
r"(?:\s+\d{1,4})?",
re.IGNORECASE,
)
# Lieux-dits courants en France (sur ligne seule = adresse)
RE_LIEU_DIT_SEUL = re.compile(
r"^[ \t]*(Le\s+Bourg|Le\s+Village|Le\s+Hameau|Le\s+Château|Le\s+Moulin|La\s+Place|Le\s+Clos)[ \t]*$",
re.IGNORECASE | re.MULTILINE,
)
# --- Nouvelles regex : dates, adresses, âges, dossiers ---
_MOIS_FR = r"(?:janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)"
@@ -1392,6 +1407,12 @@ def _mask_line_by_regex(line: str, audit: List[PiiHit], page_idx: int, cfg: Dict
return PLACEHOLDERS["ADRESSE"]
line = RE_ADRESSE_LIEU_DIT.sub(_repl_lieu_dit, line)
# Lieux-dits courants seuls sur une ligne (ex: "Le BOURG", "Le Village")
line = RE_LIEU_DIT_SEUL.sub(
lambda m: (audit.append(PiiHit(page_idx, "ADRESSE", m.group(1), PLACEHOLDERS["ADRESSE"])) or PLACEHOLDERS["ADRESSE"]),
line,
)
# N° EPISODE / Episode N. (pieds de page Trackare)
def _repl_episode(m: re.Match) -> str:
val = m.group(1) or m.group(2) or m.group(0)
@@ -2016,6 +2037,9 @@ def _extract_document_names(full_text: str, cfg: Dict[str, Any]) -> Tuple[set, s
# Opérateur / Anesthésiste / Chirurgien + nom(s)
for m in RE_EXTRACT_OPERATEUR.finditer(full_text):
_add_tokens_force_first(m.group(1))
# Nom de cabinet (ex: "CABINET ETXEBARNONDOA")
for m in RE_EXTRACT_CABINET.finditer(full_text):
_add_tokens(m.group(1))
# En-tête "Courrier Epi - NOM, PRENOM" (lettres de sortie)
for m in RE_EXTRACT_COURRIER.finditer(full_text):
# Format "NOM, PRENOM" : chaque partie est un token de nom
@@ -2537,6 +2561,10 @@ def _build_finess_ac():
"la maison", "la residence", "les jardins",
"le village", "le parc", "la colline",
"au soleil", "en france",
# Expressions médicales homonymes d'établissements FINESS (FP relecteur 2026-03-16)
"long cours", "au long cours",
"le bourg", "le val", "le clos", "le mas",
"les pins", "les chenes", "les oliviers",
}
try:
ac = _ahocorasick.Automaton()

View File

@@ -28,7 +28,11 @@ blacklist:
- BAYONNE
- '64109'
- LABORATOIRE de BIOLOGIE MEDICALE
- REED LES EMBRUNS
- LES EMBRUNS
- EMBRUNS BIDART
force_mask_regex:
- '[Ee]mbruns'
- 'Centre\s+Hospitalier\s+(?:de\s+(?:la\s+)?)?C[oôÔ]te\s+Basque'
- 'Polyclinique\s+C[oôÔ]te\s+Basque\s+Sud'
- '13\s*,?\s*Avenue\s+de\s+l.Interne\s+J\.?\s*LOEB\s+BP\s*\d+'