Соответствия фраз и фильтров: семантический поиск для товарных фильтров
В этой статье объясняется, как мы создаём и расширяем соответствия между фразами и фильтрами, которые лежат в основе нашей системы извлечения фильтров. Эти соответствия связывают фразы на естественном языке из поисковых запросов со структурированными товарными фильтрами.
Проблема: Извлечение фильтров из естественного языка
Когда пользователи ищут «мини пк с 16 гб оперативной памяти», нам нужно извлечь:
-
Форм-фактор: Мини ПК
-
Оперативная память: 16
Но пользователи выражают одно и то же намерение разными способами:
-
«мини пк 16 гб оперативки»
-
«мини компьютер с 16 гигабайтами памяти»
-
«маленький пк 16 гб»
-
«компактный десктоп с 16 гигами»
Нам нужна система, которая сопоставляет все эти варианты фраз с правильными значениями фильтров.
Двухэтапный процесс
Мы генерируем соответствия фраз в два этапа:
- Шаг 3a: Генерация базовых фраз из характеристик товаров с использованием перестановок и правил для конкретных характеристик
- Шаг 4: Расширение с помощью семантического сходства с использованием эмбеддингов
Этот гибридный подход сочетает точность на основе правил с семантической гибкостью.
Шаг 3a: Генерация базовых фраз
Метаданные характеристик
Каждая характеристика товара имеет метаданные в последовательности характеристик:
-
Заголовок (Heading): Название категории (например, «Процессор» для характеристик процессора)
-
Единица измерения (Unit): Единица измерения (например, «ГБ» для памяти, «ГГц» для частоты)
Эти метаданные направляют генерацию фраз.
Генерация на основе перестановок
Для каждого значения характеристики мы генерируем все перестановки из:
-
Заголовка: «процессор»
-
Ключа характеристики: «серия»
-
Значения: «i5»
-
Единицы измерения: (отсутствует для серии)
Это даёт:
-
«процессор серия i5»
-
«серия процессор i5»
-
«i5 процессор серия»
-
«i5 серия процессор»
-
«процессор i5»
-
«серия i5»
-
«i5»
Все перестановки гарантируют, что мы сопоставим запросы независимо от порядка слов.
Комбинации «Значение + Единица измерения»
Для характеристик с единицами измерения (память, накопитель, частота) мы генерируем варианты как с пробелом, так и без:
-
«16 гб» (с пробелом)
-
«16гб» (без пробела)
Они комбинируются с другими компонентами:
-
«16гб оперативная память»
-
«оперативная память 16гб»
-
«процессор 16гб»
Правила суффиксов портов
Для характеристик подключения (USB, HDMI, DisplayPort) мы добавляем суффиксы портов:
-
«usb порт»
-
«usb порты»
-
«2 usb порта»
-
«hdmi порт»
Это позволяет сопоставлять запросы вроде «мини пк с 2 hdmi портами».
Правила для конкретных характеристик
Каждый тип характеристики имеет собственную генерацию фраз:
Серия процессора (i3, i5, N-серия):
-
Основные обозначения процессоров генерируют варианты: название производителя, бренд ядра, комбинированные формы
-
Процессоры N-серии (N100 и т.д.) создают комбинации по схожему шаблону
-
Каждый генерирует несколько перестановок со словом «процессор»
Оперативная память:
-
Числовые значения генерируют варианты с ГБ как с пробелом, так и без («16гб», «16 гб»)
-
Автоматически добавляются квалификаторы «оперативная память» и «память» («16гб памяти», «16 гб оперативной памяти»)
Накопитель SSD:
-
Числовые значения генерируют варианты с ГБ («512гб», «512 гб»)
-
Автоматически генерируются варианты с ТБ для значений ≥ 1024 (например, 1024ГБ → 1ТБ)
-
Автоматически добавляются квалификаторы «ssd» и «накопитель» («512гб ssd», «512 гб накопитель»)
Форм-фактор:
-
Мини ПК → несколько вариантов, включая форму без пробела
-
Моноблок → «моноблок», «all in one», «aio», сокращённые формы
-
Тонкий клиент → варианты с пробелом и без
-
Промышленный ПК → сокращённые и полные формы
Поколение (Generation):
- Числовые значения поколения становятся: «12-го поколения», «12 поколение», «поколение 12»
Количество ядер:
-
2 → «двухъядерный»
-
4 → «четырёхъядерный»
-
6 → «шестиядерный»
-
8 → «восьмиядерный»
-
Все генерируют варианты «[n] ядерный процессор»
Ethernet:
-
«1000» → [«гигабитный ethernet», «gbe», «1гбит/с»]
-
«2500» → [«2.5gbe», «2.5 гигабит», «2.5гбит/с»]
Операционная система:
-
«Windows 11» → [«windows», «windows 11», «win 11»]
-
«Ubuntu» → [«linux», «ubuntu»]
-
«FreeDOS» → [«freedos», «без ос», «без операционной системы»]
Белый список для автономных значений
Только определённые характеристики позволяют автономное сопоставление значений, чтобы избежать ложных срабатываний:
-
Серия: «i3», «i5», «N100» (но не одиночные буквы)
-
Модель процессора: «N100», «1335U»
-
Операционная система: «Windows», «Linux», «Ubuntu»
-
Поколение: «12-го», «13-го», «14-го»
-
Бренд процессора: «Intel», «ARM»
Например, «2» не должно сопоставляться с «2 ядра», когда запрос звучит как «2 hdmi порта». Проверка длины предотвращает сопоставление одиночных букв или очень коротких неоднозначных значений как автономных. Характеристики с явными единицами измерения, такие как Ethernet или порты, генерируют автономные комбинации только вместе со своей единицей.
Предотвращение коллизий
Значения памяти и накопителя пересекаются (у обоих есть 64, 128, 256 и т.д.). Шаг 4 применяет правила диапазонов значений для устранения неоднозначности:
-
≤ 64 ГБ: Оперативная память (RAM)
-
≥ 128 ГБ: Накопитель SSD
-
Диапазон 65-127 ГБ: Пропускается (неоднозначно)
Фразы с явными квалификаторами («оперативная память»/«память» или «ssd»/«накопитель») переопределяют это правило и могут сопоставляться с любым значением.
Кроме того, расплывчатые общие термины, которые соответствуют слишком большому количеству несвязанных фильтров, исключаются во время разрешения коллизий с помощью постобработки: термины вроде «подключение», «аудио», «дисплей», «процессор» и «физический» создают слишком много неоднозначности для множества аспектов.
Шаг 4: Семантическое расширение
Извлечение N-грамм
Мы извлекаем частые фразы из реальных поисковых запросов, от отдельных слов (1-граммы, например «мини») до более длинных последовательностей (до 6-грамм, например «мини пк с 16гб оперативной памяти и ssd»). Сохраняются только фразы, встречающиеся как минимум 3 раза. Такой подход фильтрации снижает шум, сохраняя при этом подлинные языковые паттерны пользователей.
Генерация поискового текста для фильтров
Для каждого значения фильтра мы генерируем поисковые тексты:
Оперативная память: 16:
-
«16гб оперативная память»
-
«16 оперативная память»
-
«оперативная память 16»
Накопитель SSD: 512:
-
«512гб накопитель ssd»
-
«512 ssd накопитель»
-
«ssd накопитель 512»
Эти поисковые тексты представляют фильтр в пространстве эмбеддингов.
Эмбеддинги и сопоставление
Мы преобразуем как фразы запросов, так и поисковые тексты фильтров в эмбеддинги, а затем вычисляем косинусное сходство между ними. Фразы со значениями сходства выше установленного порога добавляются в соответствия для этого фильтра.
Ручные начальные фразы (Seeds)
Мы добавляем высоконадёжные ручные начальные фразы перед расширением:
"Series:i5": [
"i5",
"core i5",
"intel i5",
"intel core i5",
"i5 processor",
"cpu i5",
]
Эти начальные фразы представляют собой ключевые фразы, которые, как мы знаем, верны для каждого фильтра. Включая их с максимальным значением сходства, мы направляем алгоритм расширения на поиск связанных фраз со схожим значением.Этим начальным фразам всегда присваивается сходство 1.0, и они направляют процесс расширения.
Инкрементальные эмбеддинги
Мы кэшируем эмбеддинги как для фраз, так и для поисковых текстов фильтров. Когда поступают новые запросы:
- Загружаем существующие эмбеддинги
- Создаём эмбеддинги только для новых фраз
- Добавляем их в кэш
Это позволяет избежать повторного создания эмбеддингов для неизменных данных. Подробности см. в Стратегия работы с эмбеддингами.
Разрешение коллизий
После завершения сопоставления по сходству мы разрешаем коллизии между фильтрами памяти и накопителя:
Разрешение на основе чисел:
-
Для неоднозначных фраз, содержащих числа: если значение во фразе ≤ 64, оставляем только для памяти; если > 64, оставляем только для накопителя.
-
Это предотвращает сопоставление «16гб» с фильтрами SSD и «512гб» с фильтрами памяти.
Явные квалификаторы переопределяют правила:
-
Фразы с ключевыми словами «оперативная память», «память», «cpu», «процессор» → только память
-
Фразы с ключевыми словами «ssd», «накопитель», «диск», «nvme», «драйв» → только накопитель
-
Пример: «процессор 8гб» сопоставляется с памятью, несмотря на числовое значение.
Расплывчатые термины:
- Удаляем фразы вроде «подключение», «аудио», «дисплей», которые соответствуют множеству несвязанных фильтров.
Формат вывода
Итоговые соответствия сортируются по сходству (сначала наибольшее), затем по длине (сначала самые короткие):
{
"Main Memory:16": [
{"phrase": "16gb ram", "similarity": 1.0},
# ... (детали реализации опущены)
Интеграция с алгоритмом извлечения фильтров
Эти соответствия используются алгоритмом извлечения фильтров:
- Поступает запрос: «мини пк с 16гб оперативной памяти»
- Извлекаем фразы: [«мини пк», «16гб оперативная память», «мини», «пк», «16гб», «оперативная память»]
- Сопоставляем фразы с фильтрами, используя соответствия
- Возвращаем фильтры:
{"Form Factor": ["Mini PC"], "Main Memory": ["16"]}
Подробности см. в статье Алгоритм извлечения фильтров.
Хранение и распространение
Соответствия фраз сохраняются в виде JSON-файлов и используются во всей системе:
-
Файл базовых соответствий: Генерируется на Шаге 3a, содержит фразы на основе правил.
-
Файл расширенных соответствий: Генерируется на Шаге 4, содержит результаты семантического расширения.
Расширенные соответствия используются:
-
Генерация страниц запросов: Извлечение фильтров из текста запроса.
-
Поисковый сервис: API извлечения фильтров в реальном времени.
-
Сопоставление товаров: Фильтрация товаров по извлечённым фильтрам.
Характеристики производительности
Базовая генерация (Шаг 3a):
-
Время обработки масштабируется в зависимости от количества значений фильтров.
-
Генерируется большое количество базовых вариантов фраз.
-
Использование памяти остаётся умеренным в процессе генерации.
Семантическое расширение (Шаг 4):
-
Время обработки масштабируется в зависимости от объёма запросов и размера эмбеддингов.
-
Результат содержит значительно больше фраз, чем базовая генерация.
-
Требования к памяти увеличиваются из-за хранения эмбеддингов.
Расширение ограничено производительностью ЦП из-за вычислений сходства. Использование NumPy с ускорением BLAS значительно ускоряет матричные операции.
Интеграция с SEO-пайплайном
Генерация соответствий фраз — это Шаги 3a и 4 в SEO-пайплайне:
- Шаг 0: Загрузка исходных данных - Товары, детали, статьи
- Шаг 1: Получение запросов - GSC, Google Ads, live, Algolia
- Шаг 2: Объединение запросов - Слияние всех источников
- Шаг 3a: Генерация базовых соответствий фраз ← Вы здесь
- Шаг 3b: Создание эмбеддингов для запросов - Преобразование в векторы
- Шаг 4: Расширение соответствий фраз ← Вы здесь
- Шаг 5: Кластеризация запросов - Группировка в страницы
- Шаг 6: Сопоставление товаров - Сопоставление запросов и товаров
- Шаг 7: Построение страниц запросов - Генерация HTML
- Шаг 8: Генерация связанных запросов - Поиск связанных запросов
- **Шаг 11