Начнем с самого простого способа – попробуем ловить рыбу руками. Открываем базу товаров с закупок и начинаем искать похожий товар. Высока вероятность, что к вечеру мы так ничего и не поймаем.
Попробуем как-то отфильтровать базу товаров с закупок. Каждому товару в закупках присваивается код ОКПД2. Общероссийский классификатор продукции по видам экономической деятельности это код, который содержит информацию о товаре.
Например:
Теперь у нас есть удочка, стало немного лучше, но почему-то рыба не желает вешаться на крючок.
Не стоит расстраиваться, используем приманку. Нам нужно найти способ автоматически определять схожие товары внутри одного ОКПД2. Для этого нужно представить семантический смысл описания товара в виде тензора. Чтобы обрабатывать информацию нужно перевести ее в числовой формат. Для этого будем использовать специальный механизм перевода слов в векторное пространство Word2Vec, выполняющий перевод слова в последовательность чисел заданного размера, называемую вектором или тензором. Word2Vec это модель, которую специально обучают понимать семантический смысл слова. Товары из базы данных с таким же ОКПД2 необходимо перевести в тензоры. Отлично, у нас теперь есть один наш товар в виде тензора и куча других тензоров товаров.
Ближайший товар будем искать по косинусному расстоянию, чем больше похож товар из базы данных на наш, тем меньше будет косинусное расстояние. Выбираем товар с минимальным косинусным расстоянием и это и будет наша искомая рыба.
Разберем описанный метод на практике. Начнем с преобразования описания товара в тензор. Сначала описание товара проходит токенизацию, то есть разбивается на отдельные слова. Для преобразования слов в их семантический смысл использовался предобученный Word2Vec размерностью 100 (то есть слово представляется набором из 100 чисел).
Мы получили массив эмбеддингов. Для вычисления косинусного расстояния необходимо посчитать векторное представление всего текста, содержащего описание товара. Самый простой способ реализации — это взять среднее между всеми эмбеддингами слов описания, при этом семантический смысл товара будет искажаться, но не для решения данной задачи это не критично.
После того, как мы перевели наш товар и все товары с таким же ОКПД в эмбеддинги, следующий шаг — посчитать косинусное расстояние между ними.
Как видно на схеме ниже — ближе всего к товару «Рыба большая» продукты «Семга огромная» и «Золотая рыбка».
Таким образом, можно предположить, что цена большой рыбы лежит в диапазоне между ценами золотой рыбки и семги огромной. На реальных данных были получены следующие результаты:
Иногда данный подход может не дать хорошего результата. Например, в базе данных товаров не будет товара похожего на наш. Тогда выловленная рыба будет слишком мелкая, а модуль вернет пустой диапазон.
Последний способ, который мы рассмотрим, будет ловля с помощь сети. В качестве сети будет использовать Яндекс. Из описания товара формируется запрос, для дальнейшего анализа отбирается 20 первых ответов. Брать следующие ответы не имеет смысла, так как их релевантность стоит под вопросом. Тексты первых 20 ответов передаются на модель по поиску цены. Модель отбирает цены из ответов и формирует из них ценовой диапазон. В рыболовную сеть попадает много разной рыбы, поэтому ценовой диапазон выходит очень шумным. Для фильтрации отбросим выбросы. Если полученные цены имеют нормальное распределение, то можно оставить только 68 процентов цен. То есть оставим цены, которые лежат в диапазоне между разностью среднего всех цен и стандартным отклонением, и суммой среднего и стандартного отклонения. Вот как выглядят ценовые диапазоны товаров в Яндексе:
Все рассмотренные способы рыбалки имеют свои плюсы и минусы. Выбор какой вариант предпочтительнее делает каждый рыбак в соответствии со своими требованиями точности и времени. Удачного улова!