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",
|
"infectieuse", "infectieuses",
|
||||||
# Termes soins infirmiers / activités de la vie quotidienne (FP trackare doc 216)
|
# Termes soins infirmiers / activités de la vie quotidienne (FP trackare doc 216)
|
||||||
"aide", "partielle", "partiel", "complete", "complète", "complet",
|
"aide", "partielle", "partiel", "complete", "complète", "complet",
|
||||||
"contention", "lavabo", "blader", "scan", "post",
|
"contention", "lavabo", "blader", "scan", "post", "lunettes",
|
||||||
"deshabillage", "déshabillage", "habillage",
|
"deshabillage", "déshabillage", "habillage",
|
||||||
"surveillance", "surv", "refection", "réfection",
|
"surveillance", "surv", "refection", "réfection",
|
||||||
"miction", "toilette", "douche", "changes",
|
"miction", "toilette", "douche", "changes",
|
||||||
"installation", "transfert", "mobilisation",
|
"installation", "transfert", "mobilisation",
|
||||||
"alimentation", "hydratation", "collation",
|
"alimentation", "hydratation", "collation",
|
||||||
"stimulation", "prevention", "prévention",
|
"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
|
# 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())
|
||||||
@@ -885,6 +889,12 @@ RE_EXTRACT_COURRIER = re.compile(
|
|||||||
r"Courrier\s+(?:Epi|Ep[ée]ph[ée]m[eé]ride|Hospit)\s*[\-–]\s*"
|
r"Courrier\s+(?:Epi|Ep[ée]ph[ée]m[eé]ride|Hospit)\s*[\-–]\s*"
|
||||||
rf"((?:{_UC_NAME_TOKEN})(?:\s*,\s*(?:{_UC_NAME_TOKEN}))*)",
|
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
|
# Téléphone avec extension slash : 05.59.44.38.32/34
|
||||||
RE_TEL_SLASH = re.compile(
|
RE_TEL_SLASH = re.compile(
|
||||||
r"(?<!\d)(?:\+33\s?|0)\d(?:[\s.\-]?\d){8}(?:/\d{1,4})(?!\d)"
|
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})?",
|
r"(?:\s+\d{1,4})?",
|
||||||
re.IGNORECASE,
|
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 ---
|
# --- Nouvelles regex : dates, adresses, âges, dossiers ---
|
||||||
_MOIS_FR = r"(?:janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)"
|
_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"]
|
return PLACEHOLDERS["ADRESSE"]
|
||||||
line = RE_ADRESSE_LIEU_DIT.sub(_repl_lieu_dit, line)
|
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)
|
# N° EPISODE / Episode N. (pieds de page Trackare)
|
||||||
def _repl_episode(m: re.Match) -> str:
|
def _repl_episode(m: re.Match) -> str:
|
||||||
val = m.group(1) or m.group(2) or m.group(0)
|
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)
|
# Opérateur / Anesthésiste / Chirurgien + nom(s)
|
||||||
for m in RE_EXTRACT_OPERATEUR.finditer(full_text):
|
for m in RE_EXTRACT_OPERATEUR.finditer(full_text):
|
||||||
_add_tokens_force_first(m.group(1))
|
_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)
|
# En-tête "Courrier Epi - NOM, PRENOM" (lettres de sortie)
|
||||||
for m in RE_EXTRACT_COURRIER.finditer(full_text):
|
for m in RE_EXTRACT_COURRIER.finditer(full_text):
|
||||||
# Format "NOM, PRENOM" : chaque partie est un token de nom
|
# Format "NOM, PRENOM" : chaque partie est un token de nom
|
||||||
@@ -2537,6 +2561,10 @@ def _build_finess_ac():
|
|||||||
"la maison", "la residence", "les jardins",
|
"la maison", "la residence", "les jardins",
|
||||||
"le village", "le parc", "la colline",
|
"le village", "le parc", "la colline",
|
||||||
"au soleil", "en france",
|
"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:
|
try:
|
||||||
ac = _ahocorasick.Automaton()
|
ac = _ahocorasick.Automaton()
|
||||||
|
|||||||
@@ -28,7 +28,11 @@ blacklist:
|
|||||||
- BAYONNE
|
- BAYONNE
|
||||||
- '64109'
|
- '64109'
|
||||||
- LABORATOIRE de BIOLOGIE MEDICALE
|
- LABORATOIRE de BIOLOGIE MEDICALE
|
||||||
|
- REED LES EMBRUNS
|
||||||
|
- LES EMBRUNS
|
||||||
|
- EMBRUNS BIDART
|
||||||
force_mask_regex:
|
force_mask_regex:
|
||||||
|
- '[Ee]mbruns'
|
||||||
- 'Centre\s+Hospitalier\s+(?:de\s+(?:la\s+)?)?C[oôÔ]te\s+Basque'
|
- 'Centre\s+Hospitalier\s+(?:de\s+(?:la\s+)?)?C[oôÔ]te\s+Basque'
|
||||||
- 'Polyclinique\s+C[oôÔ]te\s+Basque\s+Sud'
|
- '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+'
|
- '13\s*,?\s*Avenue\s+de\s+l.Interne\s+J\.?\s*LOEB\s+BP\s*\d+'
|
||||||
|
|||||||
Reference in New Issue
Block a user