[ka6] fix connecteur derumarketcatering: employeur situé à Kirkland WASHINGTON (É.-U., zip 98033), pas Kirkland QC — faux positif du filtre Québec sur ville homonyme. is_quebec_location rejette désormais un code de province/État explicitement hors Québec en fin de libellé (« Kirkland, WA », « London, ON »); codes ambigus en français exclus (CA/OR/LA/DE/IN/ME/MT — Val-d'Or, La Prairie…). L'offre américaine résiduelle a été retirée par le pipeline (miss_count=2 → active=0). Volume 0 = comportement correct: la source n'a aucune offre québécoise.
1 changed file +16 −1
modified
jobka/normalize.py
+16 −1
@@ -6,7 +6,7 @@ | |||||
| 6 | # Rôle : Normalisation commune des offres (salaires, dates, mode/type | 6 | # Rôle : Normalisation commune des offres (salaires, dates, mode/type | ||
| 7 | # d'emploi, lieu, catégorie, exigences, séniorité) — jamais de | 7 | # d'emploi, lieu, catégorie, exigences, séniorité) — jamais de | ||
| 8 | # valeur inventée | 8 | # valeur inventée | ||
| 9 | −# Créé : 2026-08-17 Modifié : 2026-08-25 | 9 | +# Créé : 2026-08-17 Modifié : 2026-08-26 | ||
| 10 | # ============================================================================= | 10 | # ============================================================================= | ||
| 11 | """Couche de normalisation commune appelée par JobPosting.finalize(). | 11 | """Couche de normalisation commune appelée par JobPosting.finalize(). | ||
| 12 | 12 | ||||
@@ -517,6 +517,19 @@ def parse_location(raw: str) -> dict: | |||||
| 517 | return out | 517 | return out | ||
| 518 | 518 | ||||
| 519 | 519 | ||||
| 520 | +# Code de province canadienne ou d'État américain explicitement HORS Québec | ||||
| 521 | +# (« Kirkland, WA », « London, ON ») : jamais une offre québécoise, même si la | ||||
| 522 | +# ville est homonyme d'une ville du Québec (Kirkland WA ≠ Kirkland QC — bug | ||||
| 523 | +# derumarketcatering 2026-08-26 : restaurant de l'État de Washington affiché | ||||
| 524 | +# comme Montréal). Codes ambigus avec le français exclus volontairement : | ||||
| 525 | +# CA (Canada/Californie), OR (Val-d'Or), LA (La Prairie), DE, IN, ME, MT. | ||||
| 526 | +_NON_QC_REGION_RE = re.compile( | ||||
| 527 | + r"[,\s](on|bc|ab|sk|mb|ns|nb|pe|pei|nl|yt|nt|nu|" | ||||
| 528 | + r"wa|ny|tx|fl|il|ma|md|mi|mn|mo|ms|nc|nd|ne|nh|nj|nm|nv|oh|ok|" | ||||
| 529 | + r"pa|ri|sc|sd|tn|ut|va|vt|wi|wv|wy|ak|al|ar|az|co|ct|dc|ga|hi|" | ||||
| 530 | + r"ia|id|ks|ky)\.?(?=$|[,\s])") | ||||
| 531 | + | ||||
| 532 | + | ||||
| 520 | def is_quebec_location(raw: str) -> bool: | 533 | def is_quebec_location(raw: str) -> bool: | ||
| 521 | """Vrai si le libellé pointe vers le Québec (filtre des ATS pancanadiens).""" | 534 | """Vrai si le libellé pointe vers le Québec (filtre des ATS pancanadiens).""" | ||
| 522 | key = _key(clean_text(raw)) | 535 | key = _key(clean_text(raw)) | ||
@@ -529,6 +542,8 @@ def is_quebec_location(raw: str) -> bool: | |||||
| 529 | m = _POSTAL_RE.search(raw) | 542 | m = _POSTAL_RE.search(raw) | ||
| 530 | if m and m.group(1)[0].upper() in "GHJ": | 543 | if m and m.group(1)[0].upper() in "GHJ": | ||
| 531 | return True | 544 | return True | ||
| 545 | + if _NON_QC_REGION_RE.search(key): # « Kirkland, WA » : homonyme hors QC | ||||
| 546 | + return False | ||||
| 532 | return any(re.search(rf"(?<![a-z]){re.escape(ck)}(?![a-z])", key) | 547 | return any(re.search(rf"(?<![a-z]){re.escape(ck)}(?![a-z])", key) | ||
| 533 | for ck in _QC_CITIES) | 548 | for ck in _QC_CITIES) | ||
| 534 | 549 | ||||
| 535 | 550 | ||||