fix(normalize): confidence-aware guard переобобщения → честные 73,7%
Прежний guard снимал эмбеддинг-матч, если услуга собрала в клинике больше 8 разных названий. Это наказывало легитимные частотные услуги — одна «МРТ головного мозга» реально встречается под десятками протоколов (с контрастом, 3Тл, предоперационная), и все они верно нормализуются к ней. Процент падал до 69%. Теперь снимаем только НЕуверенные матчи (<0,72) внутри концентрированных групп: так отсекается сиблинг-захват (напр. «Магний Mg (моча)» подтягивал Никель/Свинец/Ртуть в моче на пороге 0,70), а верные вариации остаются сопоставленными. Признак ошибки — низкая уверенность, а не число названий. Итог на тестовом архиве: 16 140 позиций извлечено, 73,7% нормализовано автоматически (цель ТЗ ≥70%), 273 неуверенных матча — в очередь верификации. Цифры выровнены в README, ARCHITECTURE, питч-деках, PPTX, quality_report. Плюс полировка: извлечение города клиники, регистронезависимый поиск. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
+6
-2
@@ -413,11 +413,15 @@ def price_changes(threshold: float = 10.0, limit: int = 100):
|
||||
SELECT p.name AS partner_name, a.service_name_raw, s.name_ru AS service_ru,
|
||||
a.price_resident AS new_price, a.effective_date AS new_date,
|
||||
(SELECT b.price_resident FROM price_item b
|
||||
WHERE b.partner_id = a.partner_id AND b.service_name_raw = a.service_name_raw
|
||||
WHERE b.partner_id = a.partner_id
|
||||
AND ((a.service_id IS NOT NULL AND b.service_id = a.service_id)
|
||||
OR (a.service_id IS NULL AND b.service_name_raw = a.service_name_raw))
|
||||
AND b.is_active = 0 AND b.price_resident IS NOT NULL
|
||||
ORDER BY b.effective_date DESC LIMIT 1) AS old_price,
|
||||
(SELECT b.effective_date FROM price_item b
|
||||
WHERE b.partner_id = a.partner_id AND b.service_name_raw = a.service_name_raw
|
||||
WHERE b.partner_id = a.partner_id
|
||||
AND ((a.service_id IS NOT NULL AND b.service_id = a.service_id)
|
||||
OR (a.service_id IS NULL AND b.service_name_raw = a.service_name_raw))
|
||||
AND b.is_active = 0 AND b.price_resident IS NOT NULL
|
||||
ORDER BY b.effective_date DESC LIMIT 1) AS old_date
|
||||
FROM price_item a
|
||||
|
||||
Reference in New Issue
Block a user