Я бы подошел к этой проблеме как к тегированию NER, учитывая, что у вас уже есть набор тегов.Мой подход к решению этой проблемы будет следующим:
- Создание аннотированного набора данных запросов, каждое слово которого будет помечено одним из тегов, скажем, {
color
, brand
, Categories
} - Обучение модели NER (CRF / LSTMS).
Это не экономично по времени и затратам, потому что у меня в движке будут миллионы продуктов, также они будут обновляться / добавлятьсячастая основа
Чтобы справиться с этой ситуацией, я предлагаю не использовать слова в запросе как функции, а использовать атрибуты слов как функции.Например, создайте индикаторную функцию f(x',y)
для слова x
с контекстом x'
(то есть словом вместе с окружающими словами и их атрибутами) и тегом y
, который будет возвращать 1
или 0
.Пример функции индикатора будет выглядеть следующим образом:
f('blue', 'y') = if 'blue' in `color attribute` column of DB and words previous to 'blue' is in `product attribute` column of DB and 'y' is `colors` then return 1 else 0.
Создать множество этих функций индикатора, также известных как карты функций.
Эти функции индикатора затем используются для обучения моделей с использованием CRFS или LSTMS.Наконец, мы используем алгоритм Витерби, чтобы найти наилучшую последовательность тегов для вашего запроса.Для CRF вы можете использовать такие пакеты, как CRFSuite или CRF ++.Используя эти пакеты, все, что вам нужно сделать, это создать индикаторные функции, и пакет обучит вас модели.После обучения вы можете использовать эту модель, чтобы предсказать лучшую последовательность для ваших запросов.CRFs очень быстрые.
Этот способ обучения без использования векторного представления слов обобщает вашу модель без необходимости переподготовки.[Посмотрите на NER, используя CRF].