Рекомендательный сервис на основе коллаборативной фильтрации на 1С. Расширение формы подбора для УТ 11.4






В данной разработке реализован механизм рекомендаций товаров по принципу схожести товаров в корзине на основе алгоритма Item-to-Item от Amazon. Разобран алгоритм с демо базой и сделано расширение для УТ11.4 которое добавляет в форму подбора таблицу рекомендаций. Протестировано на 8.3.13.1865 на Управление торговлей, редакция 11 (11.4.8.63)

Ко мне обращались клиенты с просьбой сделать рекомендации при подборе номенклатуры "как в интернет магазине". Небольшое исследование показало что подобные алгоритмы строятся на принципах коллаборативной фильтрации, которая бывает 2х видов "по схожести покупателей" и "по схожести предметов" (также есть гибрид этих методов). Первой мыслью было сделать алгоритм Slope One и выдавать в подборе те товары, которые покупают "похожие" покупатели, но вот Амазон в своей статье указывает на недостатки такого подхода https://www.cs.umd.edu/~samir/498/Amazon-Recommendations.pdf

На этой картинке изображено сравнение 2х подходов:

Ð%6;охожее изображение

И они используют свой алгоритм в своей интернет платформе — по схожести предметов "Item-to-Item".

В 1С есть механизм поиска ассоциаций, это реализовано в виде расчета регистра "Номенклатура продаваемая совместно", но он имеет некие настройки, которые надо подобрать эмпирическим путем, кроме того метод вычисления оценки недоступен (а он может быть разный). В то же время амазоновский и другие аналогичные методы считают "похожесть" разными способами . Например вот тут приведены различные оценки схожести векторов https://en.m.wikipedia.org/wiki/Cosine_similarity (я сразу извиняюсь за то что привожу в этой и других своих постах англоязычные тексты, но причина по которой я это делаю в том, что в русскоязычных просто недостаточно полная информация — недописанные статьи и просто не все есть. Это как начать смотреть сериал в котором не хватает серий. Проще уж сразу на англоязычных ресурсах все смотреть)

Детального описания "от и до" я не нашел, поэтому пришлось допускать свои вольности чтобы сделать применение.

Исходными данными являются продажи — документы реализации с товарами. На основе их строятся вектора. Если покупатель купил товар то присваивается "1", если не купил — "0". Т.е. количество не учитывается, учитывается только состав товара в корзине. В результате мы получаем набор векторов продаж для каждого товара . Что то типа такого: (0,1,1,0,0), (0,0,1,0,0) — размер векторов одинаковый.

Далее мы используем оценку от Амазон в виде косинуса между векторами:

Ну и получается для каждого товара мы получаем набор векторов со своими весовыми коэффициентами "похожести". Я беру для каждого товара не более 3х похожих товаров, сортирую их по убыванию коэффициентов и вывожу как рекомендуемые. Можно брать одного "победителя" для каждого товара. Тут возможны вариации.

 Сначала для разработки я использовал чистую демо базу где сделал такие исходные данные (номер продажи используется как группировка продаж, аналогично документу "Реализация товаров")

И написав алгоритм, получил такие данные в рекомендациях:

Это показывает что алгоритм работает. Эта демо база есть во вложении к статье по ней возможно будет проще разобраться с алгоритмом так как в базе простая структура и мало данных.

Также я сделал расширение для УТ11. Что оно делает:

1) там есть расчет рекомендаций по алгоритму написанному выше. Это длительная операция. Можно повесить на регл задание вызов этой функции в принципе. В результате у каждой номенклатуры вычисляются до 3-х рекомендованных товаров

 

2) изменена форма подбора: алгоритм смотрит на корзину, и по корзине заполняет табличная часть Рекомендации. Из рекомендаций также можно добавлять товары в корзину

 

На типовой тестовой базе работает несколько однобоко, так как там данных мало. А вот в рабочих базах уже интереснее. Внимание! В расширении в подборе, в рекомендациях не учитываются доступные остатки — я это не делал, в связи со спецификой задачи. Также расчет рекомендаций не работает по характеристикам — тут уже надо менять алгоритм, сейчас он только по товарам.

21 Comments

  1. wowik

    Круто!

    Reply
  2. informa1555

    (1) Спасиб)

    Reply
  3. sersoft

    Дима как всегда плюшки реализует 🙂 Спасибо. Попробуем использовать у себя.

    Reply
  4. VmvLer

    за идеи спасибо.

    на демках будет работать и можно «удивлять» заказчиков с целью раскошелиться.

    правда, я бы предупреждал заказчика, что механизмы поиска ассоциаций, кластеризации и пр. в 1С то есть,

    но на базах больше демки раз в 10 будут работать очень-очень-очень медленно и после нескольких

    долгих попыток получить результат сведут на нет всю прелесть момента.

    Reply
  5. Rustig

    сила ума!

    Reply
  6. Rustig

    (4) начало положено — а оптимизацию придумаем, я думаю, это решаемо

    Reply
  7. Rustig

    (0) не получается скачать — выходит окно с тарифами

    Reply
  8. informa1555

    (7) Наверное, это после обновления инфорстарта. Я как обычно публиковал…

    Reply
  9. informa1555

    (4) Спасибо за коммент! Да расчет работает медленно, но результат расчета записывается и использование в подборе не может тормозить. Да, в 1С есть «поиск ассоциаций» и «кластеризация» я про это писал же.

    Reply
  10. Rustig

    (8) скачал, проблема в моем впн-канале была. отключился от впн — скачал нормально. Сорри за дезинформацию.

    Reply
  11. stavrosoleg

    Как всегда супер!

    Reply
  12. informa1555

    (11) Спасибо!

    Reply
  13. AlX0id

    Я правильно понимаю, что количество измерений вектора будет равно количеству товарных позиций в базе?

    Reply
  14. informa1555

    (13) Да, почти. Правильнее добавить «учавствующих в продажах»

    Reply
  15. AlX0id

    (14)

    Ну да, фильтровать номенклатуру логично )

    Осталось дождаться, когда Ильдарович научит обсчитывать все это одним запросом %)

    Reply
  16. informa1555

    (15) Я кстати видел на нативном SQL запрос для этого

    Reply
  17. nomadon

    (15) я на скд считал разность векторов по Евклидову расстоянию, расчет вектора товара тоже, думаю, можно запилить

    Reply
  18. user1199510

    Здравствуйте. Подскажите пожалуйста,если у нас в базе есть номенклатура например телефон красный, но он идёт с серийным номером ,то есть с индивидуальной характеристикой, будет ли ваша обработка работать с такими товарами или нужно будет что-то менять? Если нужно будет то как долго и сложно будет это сделать? Например обычно с таким телефоном продаётся чехол и защитное стекло, плюс ещё всевозможные допы.

    Reply
  19. informa1555

    (18) Эта обраблтка работает только с номенклатурой не учитывая характеристики. Если надо учитывать характеристики то можно переделать алгоритм. Насколько я понимаю вам как раз не нужно их учитывать

    Reply
  20. obmanOZ

    (2) Добрый день! А правильно ли я понял, рекомендации работают только для «опта» по сути? Т.е. ТЧ ЧековККМ просматривается?

    Reply
  21. informa1555

    (20) Да для чеков не делал. Если надо чеки надо добавить в запрос по аналогии с реализациями

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *