fix: preserve topic terms after act titles

This commit is contained in:
agent committed 2026-09-25 22:39:24 +03:00
1 parent feb0ddde32
commit 9c3cbee141
2 files changed
+24 -15

No files matched your search

+20 -14
View File
@@ -31,6 +31,21 @@ BOILERPLATE_PREFIXES = {
),
"ky": (),
}
ACT_TITLE_PREFIXES = {
"ru": (
r"(?:гражданский\s+)?процессуальный\s+кодекс(?:\s+(?:кыргызской\s+республики|кр))?",
r"(?:гражданск\w*|уголовн\w*|налогов\w*|трудов\w*|семейн\w*)\s+кодекс\w*(?:\s+(?:кыргызской\s+республики|кр))?",
r"кодекс\s+о\s+правонарушениях(?:\s+(?:кыргызской\s+республики|кр))?",
r"конституци\w*(?:\s+(?:кыргызской\s+республики|кр))?",
r"(?:гк|ук|нк|коап|гпк|упк|уик)(?:\s+(?:кыргызской\s+республики|кр))?",
r"закон(?:\s+(?:кыргызской\s+республики|кр))?\s+о\s+(?:защит\w*\s+прав\w*\s+потребител\w*|государственн\w+\s+регистраци\w+\s+юридическ\w+\s+лиц|труд\w*)",
),
"ky": (
r"кыргыз\w*\s+республикасынын\s+конституци\w*",
r"(?:кыргыз\w*\s+республикасынын\s+)?(?:жарандык|кылмыш\w*|салык|эмгек|үй-бүлө|административдик|жарандык\s+процесстик)\s+кодекс\w*",
r"(?:кыргыз\w*\s+республикасынын\s+)?(?:жк|үк)(?:\s+кр)?",
),
}
def relaxed_query_text(language: str, query: str) -> str:
@@ -39,20 +54,11 @@ def relaxed_query_text(language: str, query: str) -> str:
if value.casefold().startswith(prefix):
value = value[len(prefix):].strip()
break
act_patterns = {
"ru": (
r"\b(?:кодекс\w*|конституци\w*|закон\w*|гк|ук|нк|коап|гпк|упк|уик)\b",
r"\bо\s+защит\w*\s+прав\w*\s+потребител\w*\b|\b(?:гражданск\w*|уголовн\w*|налогов\w*|труд\w*|семейн\w*|административн\w*|процессуальн\w*|правонарушени\w*|кыргызск\w*|республик\w*|кр|о|об|и)\b",
),
"ky": (
r"\b(?:кодекс\w*|конституци\w*|мыйзам\w*|жк|үк)\b",
r"\b(?:жарандык\w*|кылмыш\w*|салык\w*|эмгек\w*|үй-бүлө\w*|административдик\w*|процесстик\w*|бузуу\w*|кыргыз\w*|республика\w*|кр)\b",
),
}
marker, title_terms = act_patterns[language]
if re.search(marker, value.casefold()):
value = re.sub(rf"{marker}|{title_terms}", " ", value, flags=re.IGNORECASE)
value = re.sub(r"[^\w\-]+", " ", value).strip()
for pattern in ACT_TITLE_PREFIXES[language]:
match = re.match(rf"\s*{pattern}(?=\s|$|[.,;:!?])", value, re.IGNORECASE)
if match:
value = value[match.end():].lstrip(" \t,;:—-")
break
return value
+4 -1
View File
@@ -84,13 +84,15 @@ class SearchRelevanceTest(unittest.TestCase):
stopword_fallback = next(item["multi_match"] for item in stopword_clauses if item.get("multi_match", {}).get("boost") == 0.1)
self.assertEqual(stopword_fallback["minimum_should_match"], 2)
for language, query in (("ru", "изменения ГК КР"), ("ky", "Кыргыз Республикасынын Конституциясы")):
for language, query in (("ru", "последние изменения ГК КР"), ("ky", "Кыргыз Республикасынын Конституциясы")):
act_body = json.loads(build_search_body(language, query, 10))
act_clauses = act_body["query"]["bool"]["must"]["bool"]["should"]
self.assertFalse(any(item.get("multi_match", {}).get("boost") == 0.1 for item in act_clauses))
for language, query, expected in (
("ru", "Налоговый кодекс ответственность за неуплату налога", "ответственность за неуплату налога"),
("ru", "Налоговый кодекс налоговая ставка", "налоговая ставка"),
("ru", "Налоговый кодекс: налоговая ставка", "налоговая ставка"),
("ru", "закон о труде порядок выплаты зарплаты", "порядок выплаты зарплаты"),
("ky", "Кыргыз Республикасынын Конституциясы укуктарды чектөө тартиби", "укуктарды чектөө тартиби"),
):
@@ -102,6 +104,7 @@ class SearchRelevanceTest(unittest.TestCase):
for query in (
"Закон о защите прав потребителей",
"Закон Кыргызской Республики о защите прав потребителей",
"Закон Кыргызской Республики о государственной регистрации юридических лиц",
):
body = json.loads(build_search_body("ru", query, 10))
clauses = body["query"]["bool"]["must"]["bool"]["should"]