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:
@@ -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()
|
||||
|
||||
@@ -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+'
|
||||
|
||||
Reference in New Issue
Block a user