Improve sparse and structured catalog matching

This commit is contained in:
Fiden committed 2026-08-07 18:31:59 +03:00
1 parent 2982161374
commit 42f8f07207
8 files changed
+739 -20

No files matched your search

+16 -3
View File
@@ -118,6 +118,8 @@ Unicode- и текстовая нормализация
↓
восстановление опечаток
↓
вывод типа по триграммам, если алиаса нет
↓
лексическое ранжирование кандидатов
↓
извлечение типизированных характеристик
@@ -194,7 +196,13 @@ alias_to_canonical[normalize_text(alias)] = canonical
отличаются одной соседней перестановкой. А повреждённое `шураыввавёрт` всё ещё может восстановиться до категории `шуруповерт`, но низкая уверенность в категории не превращает один из нескольких шуруповёртов в ложный `matched`.
### Лексическое ранжирование
### Лексический fallback и ранжирование
Если алиас товарного типа не найден, триграммы собирают короткий список
ближайших строк каталога. Тип выводится только когда три лучшие строки относятся к
одному типу и имеют общее слово, которое точно, по префиксу или с малой опечаткой совпало со словом
запроса. Поэтому `удар` находит `ударная дрель`, а `аквариум 125 мм` не выбирает УШМ только
из-за числа `125`.
После определения товарного типа поиск ограничивается соответствующей частью каталога. Внутри неё кандидаты получают совокупный лексический score:
@@ -203,7 +211,8 @@ alias_to_canonical[normalize_text(alias)] = canonical
- выравнивание слов с Damerau–Levenshtein;
- покрытие точных токенов запроса.
BM25 и n-граммы отвечают только за порядок кандидатов. Они не имеют права отменять конфликт размеров или модели.
BM25 и n-граммы отвечают за выбор и порядок кандидатов, но не имеют права отменять
конфликт размеров или модели.
### Структурные характеристики
@@ -441,6 +450,7 @@ python -m pytest -q
- точные совпадения;
- алиасы и разговорные названия;
- Damerau–Levenshtein и тяжёлые опечатки;
- вывод товарного типа по одному слову и шумным фразам;
- разные записи размеров;
- отсутствующие размеры, профили и резьбы;
- неоднозначные фасовки;
@@ -451,7 +461,10 @@ python -m pytest -q
- максимум три кандидата;
- диапазон confidence;
- строгий формат request/response;
- единственный endpoint `/match`.
- единственный endpoint `/match`;
- self-retrieval всех позиций каталога по полному названию;
- поиск по каждому каноническому типу, бренду и модельному коду;
- exact-only поиск без названия товара по размерам и структурным атрибутам.
`tests/test_message_corpus.py` автоматически читает все непустые строки из
`messages.txt` и `more_messages.txt`, прогоняет их через matcher и строго