Соответствия фраз и фильтров: семантический поиск для товарных фильтров

В этой статье объясняется, как мы создаём и расширяем соответствия между фразами и фильтрами, которые лежат в основе нашей системы извлечения фильтров. Эти соответствия связывают фразы на естественном языке из поисковых запросов со структурированными товарными фильтрами.

Проблема: Извлечение фильтров из естественного языка

Когда пользователи ищут «мини пк с 16 гб оперативной памяти», нам нужно извлечь:

  • Форм-фактор: Мини ПК

  • Оперативная память: 16

Но пользователи выражают одно и то же намерение разными способами:

  • «мини пк 16 гб оперативки»

  • «мини компьютер с 16 гигабайтами памяти»

  • «маленький пк 16 гб»

  • «компактный десктоп с 16 гигами»

Нам нужна система, которая сопоставляет все эти варианты фраз с правильными значениями фильтров.

Двухэтапный процесс

Мы генерируем соответствия фраз в два этапа:

  1. Шаг 3a: Генерация базовых фраз из характеристик товаров с использованием перестановок и правил для конкретных характеристик
  2. Шаг 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, и они направляют процесс расширения.

Инкрементальные эмбеддинги

Мы кэшируем эмбеддинги как для фраз, так и для поисковых текстов фильтров. Когда поступают новые запросы:

  1. Загружаем существующие эмбеддинги
  2. Создаём эмбеддинги только для новых фраз
  3. Добавляем их в кэш

Это позволяет избежать повторного создания эмбеддингов для неизменных данных. Подробности см. в Стратегия работы с эмбеддингами.

Разрешение коллизий

После завершения сопоставления по сходству мы разрешаем коллизии между фильтрами памяти и накопителя:

Разрешение на основе чисел:

  • Для неоднозначных фраз, содержащих числа: если значение во фразе ≤ 64, оставляем только для памяти; если > 64, оставляем только для накопителя.

  • Это предотвращает сопоставление «16гб» с фильтрами SSD и «512гб» с фильтрами памяти.

Явные квалификаторы переопределяют правила:

  • Фразы с ключевыми словами «оперативная память», «память», «cpu», «процессор» → только память

  • Фразы с ключевыми словами «ssd», «накопитель», «диск», «nvme», «драйв» → только накопитель

  • Пример: «процессор 8гб» сопоставляется с памятью, несмотря на числовое значение.

Расплывчатые термины:

  • Удаляем фразы вроде «подключение», «аудио», «дисплей», которые соответствуют множеству несвязанных фильтров.

Формат вывода

Итоговые соответствия сортируются по сходству (сначала наибольшее), затем по длине (сначала самые короткие):

{
  "Main Memory:16": [
    {"phrase": "16gb ram", "similarity": 1.0},
# ... (детали реализации опущены)

Интеграция с алгоритмом извлечения фильтров

Эти соответствия используются алгоритмом извлечения фильтров:

  1. Поступает запрос: «мини пк с 16гб оперативной памяти»
  2. Извлекаем фразы: [«мини пк», «16гб оперативная память», «мини», «пк», «16гб», «оперативная память»]
  3. Сопоставляем фразы с фильтрами, используя соответствия
  4. Возвращаем фильтры: {"Form Factor": ["Mini PC"], "Main Memory": ["16"]}

Подробности см. в статье Алгоритм извлечения фильтров.

Хранение и распространение

Соответствия фраз сохраняются в виде JSON-файлов и используются во всей системе:

  • Файл базовых соответствий: Генерируется на Шаге 3a, содержит фразы на основе правил.

  • Файл расширенных соответствий: Генерируется на Шаге 4, содержит результаты семантического расширения.

Расширенные соответствия используются:

  • Генерация страниц запросов: Извлечение фильтров из текста запроса.

  • Поисковый сервис: API извлечения фильтров в реальном времени.

  • Сопоставление товаров: Фильтрация товаров по извлечённым фильтрам.

Характеристики производительности

Базовая генерация (Шаг 3a):

  • Время обработки масштабируется в зависимости от количества значений фильтров.

  • Генерируется большое количество базовых вариантов фраз.

  • Использование памяти остаётся умеренным в процессе генерации.

Семантическое расширение (Шаг 4):

  • Время обработки масштабируется в зависимости от объёма запросов и размера эмбеддингов.

  • Результат содержит значительно больше фраз, чем базовая генерация.

  • Требования к памяти увеличиваются из-за хранения эмбеддингов.

Расширение ограничено производительностью ЦП из-за вычислений сходства. Использование NumPy с ускорением BLAS значительно ускоряет матричные операции.

Интеграция с SEO-пайплайном

Генерация соответствий фраз — это Шаги 3a и 4 в SEO-пайплайне:

  1. Шаг 0: Загрузка исходных данных - Товары, детали, статьи
  2. Шаг 1: Получение запросов - GSC, Google Ads, live, Algolia
  3. Шаг 2: Объединение запросов - Слияние всех источников
  4. Шаг 3a: Генерация базовых соответствий фраз ← Вы здесь
  5. Шаг 3b: Создание эмбеддингов для запросов - Преобразование в векторы
  6. Шаг 4: Расширение соответствий фраз ← Вы здесь
  7. Шаг 5: Кластеризация запросов - Группировка в страницы
  8. Шаг 6: Сопоставление товаров - Сопоставление запросов и товаров
  9. Шаг 7: Построение страниц запросов - Генерация HTML
  10. Шаг 8: Генерация связанных запросов - Поиск связанных запросов
  11. **Шаг 11