Найти в Дзене
Продажи.рф

Сложности в работе с яйцами и другие приключения при классификации товаров

Продажи.рф предоставляет статистику в агрегированном виде с детализацией по категориям и брендам. На основе каких данных мы строим такую аналитику? Как чековые наименования обрабатываются, хранятся и распределяются по категориям? Какие инструменты мы используем и как планируем их совершенствовать? Эти и многие другие вопросы мы разберем в статье. Откуда берутся и как хранятся данные? Продажи.рф работает в партнерстве с оператором фискальных данных Первый ОФД, к которому подключено более 350 тысяч торговых точек по всей стране – география охватывает как маленькие села, так и большие мегаполисы. В данных представлены все виды ритейла: федеральные и локальные сети, традиционная торговля, аптеки, заправки и многое другое. Примерная доля Первого ОФД от всего объема рынка 17%, а это около 30 миллионов чеков ежедневно! Справится с таким объемом данных - задачка со звездочкой, но мы ее решили. Нашей командой был создан специальный инструмент Yupana[1] для удобного хранения и обработки десятков
Оглавление

Продажи.рф предоставляет статистику в агрегированном виде с детализацией по категориям и брендам. На основе каких данных мы строим такую аналитику? Как чековые наименования обрабатываются, хранятся и распределяются по категориям? Какие инструменты мы используем и как планируем их совершенствовать? Эти и многие другие вопросы мы разберем в статье.

Откуда берутся и как хранятся данные?

Продажи.рф работает в партнерстве с оператором фискальных данных Первый ОФД, к которому подключено более 350 тысяч торговых точек по всей стране – география охватывает как маленькие села, так и большие мегаполисы. В данных представлены все виды ритейла: федеральные и локальные сети, традиционная торговля, аптеки, заправки и многое другое. Примерная доля Первого ОФД от всего объема рынка 17%, а это около 30 миллионов чеков ежедневно! Справится с таким объемом данных - задачка со звездочкой, но мы ее решили.

Нашей командой был создан специальный инструмент Yupana[1] для удобного хранения и обработки десятков терабайтов данных. Платформа имеет открытый исходный код и позволяет всем подключенным ОФД обрабатывать данные по единой, согласованной с заказчиком методологии и предоставлять результат в стандартизированном формате. При этом соблюдаются все основные принципы безопасности, конфиденциальности и сохранности данных клиентов, подключенных к оператору. Важно, что Yupana не является как таковым аналитическим инструментом, но обработка данных, которая происходит с помощью нее, учитывает все тонкости и специфику задач по анализу рынка.

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

[1] Больше про Yupana вы найдете на сайте https://yupana.org/

В чем сложность категоризации чековых наименований?

Казалось бы, данные из чеков – это удобный и легальный источник информации о продажах, но все не так однозначно. Приятно, когда мы видим чековые наименования подобного плана:

"Простоквашино" Молоко безлактоз.1.5% 970мл

Лапша Роллтон По-домашнему Говядина б/п 90-100 г.

Напиток сокосодержащий Добрый Палпи со вкусом апельсина п/б 0,45 л

Туалетная бумага ПАПИА Балийский цветок 3сл 4рул

СИГАРЕТЫ WINSTON XSTYLE BLUE

Стеклоомыватель Синтек Арктика (-25) 4л

Но обычно мы работаем с такими данными:

"БЗМЖ"См-на Прост-но 25% 300г

РОЛТОН ВЕРМИШ Б/П В АСС 60Г

Добрый Кола 0,4

Папиа тб 8

сиг мальб крафт бонд компакт

ГЕЛЬ COLOR 1,3Л ARIE

Или даже с такими:

ЙОГ НЕЖ С ПЮР КЛ-БАН 0.1\%100Г

LEVR З.П.ОТБ КЕДР

Липучка Липкая смерть /100/

НЕКТ ДОБ ЯБ ЧЕР РЯБ МАЛ 1Л

Заказ №473784. Покупка товара [Яйцо призыва ведьмы 499 рублей]

Ч/Н""ОСГ""№1(30Х2Г) 60Г

Простая практическая задача. Предположим, что мы хотим найти в данных продажи куриных яиц. Вводные с которыми мы работаем: около 1 млрд уникальных наименований, примерно 800 млн чеков в месяц и около 8 млрд записей. Большой объем данных, не так ли? Но это не самое сложное, ведь отбирать куриные яйца надо будет примерно из такого датасета:

11) яйцо отварное

яйцо кукареку с-1 картон

игр.прыгун яйцо 183535/1016s338 кокос

яяяшоколадное яйцо поезд динозавров 20г яйца 1 дес

исследование на яйца глистов 2 способами яйца со комсомольские 10шт

яичница 3яйца 0.17 кг

10003.280278 mystery egg яйцо холодно стойка стабилизатора (яйца) 1118-19 "бмрт"

стальные яйца

Иногда даже человеку тяжело понять, какой продукт подразумевался в чеке. Поэтому задача автоматической категоризации является очень сложной. Но мы справились и с этим.

Какие инструменты мы создали?

Для решения задачи категоризации чековых наименований мы разработали два основных инструмента: классификатор и справочник (каталог) товаров и услуг. Если говорить простым языком, классификатор – это алгоритм, с помощью которого имя товара из чека сравнивается с товарами из нашего справочника. Если товар из чека по определенным критериям похож на товар из каталога, он попадает в соответствующую категорию. Разберемся подробнее.

Что такое справочник? Это набор названий товаров, которые распределены по категориям и имеют ряд сопутствующих атрибутов. Приведем пример описания конкретного товара из каталога.

Название товара: «молоко 3,2% коровье ультрапастеризованное 950 мл простоквашино бзмж»

Категория: Продукты питания/Молочные продукты/Молоко

Бренд: Простоквашино

Вид молока: коровье

Метод пастеризации: ультрапастеризованное

Объем: 950мл

Жирность: 3,2%

Наличие заменителей молочного жира: бзмж

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

  • Более 6 тысяч категорий от продуктов питания до услуг ЖКХ и автомобилей
  • Около 100 тысяч брендов - как крупных, так и небольших локальных игроков
  • Более 2 миллионов товаров и услуг
  • 35 миллионов атрибутов, таких как вес, объем и другие специфические характеристики

Также важная часть процесса – это обогащение каталога новыми товарами, мы регулярно обновляем наполнение, добавляем новые категории и бренды, улучшаем качество.

Для поиска по справочнику и определения конкретной категории для чекового наименования используется специальный инструмент – классификатор.

Как работает классификатор? Первым делом айтем[1] разбивается на важные части, которые называются «токены», по разделителям (разделителями могут быть знаки пробела или специальные символы, а также смена регистра). Далее происходит очистка данных – выбрасываются слишком короткие слова, длинные числа и другая информация, не несущая смысловой нагрузки. Дальше подбирается список синонимов для получившихся токенов, это необходимо для того, чтобы охватить все варианты произношений, переводов или сокращений слов. Например, у слова Marlboro мы насчитали более 9 тысяч вариантов написаний (от Мальбаро до mb-ro).

Следующий шаг – поиск по справочнику: полученный список токенов сопоставляется с набором токенов из справочника. С помощью сложных математических вычислений подбираются самые подходящие и похожие варианты. Чем больше атрибутов товара совпало с токенами из айтема, тем больший вес получает этот товар в данном случае. То есть, простыми словами, чем больше наименование товара из каталога похоже на чековое, тем больший вес ему присваивается. Далее берется топ-200 совпавших продуктов, еще раз происходит взвешивание с учетом мелких, но важных особенностей: позиция токена в запросе, его длина, совместная встречаемость, полнота совпадения и др.

Еще один важный дальнейший этап – корректировка весов вариантов с помощью учета цены и статистики продаж точки. Что это означает на практике? Если стоимость машины будет, например, около 100 рублей – то скорее всего речь идет об игрушке для ребенка, а не о реальном автомобиле. А бананы с большей вероятностью буду продаваться в продуктовом магазине, а не в аптеке. Поэтому эта часть алгоритма распознавания очень важна, она помогают увеличить точность попадания айтема в нужную категорию.

Завершающий этап работы классификатора – ранжирование результатов по весу и выбор наилучшего варианта. Топ-5 результатов для чекового наименования «Яблоко Зеленое, кг» будет выглядеть примерно так:

  1. Caterory: Продукты питания/Фрукты/Яблоки; name=яблоки зеленые, 1 кг; (w=5,5)
  2. Caterory: Строительные материалы и инструмент/Краски/Эмали/Эмали для наружных и внутренних работ; name=эмаль универсальная luxens 0.9 кг зеленое яблоко (банка/горшок) LUXENS; (w=5,25)
  3. Category: Товары для дома/Бытовая химия и товары для уборки/Средства для мытья посуды и ПММ/Средства для мытья посуды; name=grass средство для мытья посуды velly light (зеленое яблоко) 5кг; (w=5,23)
  4. Category: Зоотовары/Товары для кошек/Наполнители для кошачьего туалета/Наполнители комкующиеся; name=комкующийся наполнитель для кошек hitachi соевый, зеленое яблоко, 2 кг, 6 л; (w=5,1)
  5. Category: Продукты питания/Молочные продукты/Йогурты ложковые; name=йогурт село зеленое печеное яблоко - корица 3,5% 120 гр бзмж Село Зеленое; (w=0,89)

Показателем оценки качества работы классификатора является точность. Общая точность нашего алгоритма на случайной выборке 91%, этот же показатель, взвешенный на объем продаж 92%, а точность по бренду 74%.

Ежедневно наша команда работает над улучшения наполнения справочника и качества классификатора. В дальнейшие планы входит разработка инструментов для того, чтобы при определении категории и бренда учитывать количество и кратность товара, а также его популярность. Также в скором будущем планируется добавить в алгоритмы нашего классификатора методы машинного обучения (обучение с учителем[2]).

[1] Айтем – наименование товара из чека

[2] Обучение с учителем (англ. Supervised learning) — один из способов машинного обучения, в ходе которого испытуемая система принудительно обучается с помощью примеров «стимул-реакция».