fix(tradein/geocoder): gate EKB-local tiers for non-EKB oblast addresses (#11) #2504

Merged
lekss361 merged 3 commits from fix/geocoder-non-ekb-city-leak into main 2026-07-12 21:08:50 +00:00
2 changed files with 13 additions and 0 deletions
Showing only changes of commit 2ef3e42da1 - Show all commits

View file

@ -193,8 +193,18 @@ def _names_non_ekb_city(address: str) -> bool:
<город>»). Используется чтобы НЕ пускать EKB-only локальные тиры
(geoportal/cadastral) на не-ЕКБ адрес: улица+дом, совпадающие с ЕКБ-домом
(проспект Ленина 1 есть в обоих городах), иначе адрес снапается в ЕКБ (#11).
Явное "Екатеринбург" в адресе имеет приоритет над любым омонимом другого
города региона иначе ЖК/посёлки с названием, совпадающим с другим
городом области (ЖК «Заречный», пос. «Сысерть» внутри ЕКБ), ложно
отсекали бы EKB-only тиры для реального ЕКБ-адреса.
"""
normalized = " ".join(address.lower().split())
# Явное "Екатеринбург" в адресе → это ЕКБ, даже если в тексте встречается
# омоним соседнего города (ЖК «Заречный», пос. Сысерть в составе МО «город
# Екатеринбург» и т.п. — реальные false-positive из прод-кэша).
if "екатеринбург" in normalized:
return False
for m in _NON_EKB_CITY_RE.finditer(normalized):
prefix_words = normalized[: m.start()].split()
if prefix_words and prefix_words[-1] in _DISTRICT_PREFIXES:

View file

@ -187,6 +187,9 @@ def test_has_oblast_marker(text: str, expected: bool) -> None:
("Серова 27", False), # word-boundary — НЕ город "Серов"
("мкр Заречный, ул. Ленина 5", False), # район внутри города, не ЗАТО Заречный
("Каменск-Уральский, ул. Ленина 1", True),
# явное "Екатеринбург" перевешивает омоним соседнего города в названии
# ЖК/района внутри города (реальный false-positive из прод-кэша, #11):
("24, опалихинская улица, заречный, Верх-Исетский район, Екатеринбург", False),
],
)
def test_names_non_ekb_city(address: str, expected: bool) -> None: