Плох тот дата сайентист, который не представляет, как будут использоваться его модели в конечных продуктах, как они помогут бизнесу увеличить чистую прибыль, улучшить клиентский опыт или любой другой ключевой показатель в компании. Часто задачи приходят от продуктовых подразделений, но в случае, когда главным компонентом продукта является модель машинного обучения, без экспертного взгляда специалиста не обойтись. В этой статье рассмотрим, как можно принести пользу компании за счет данных кассовых чеков ОФД. Но сначала расскажу, почему для меня как для клиента банка эти данные вызывают повышенный интерес. Сколько себя помню, всегда сохранял стремление очень точно учитывать и оптимизировать расходы. В детстве, когда родители меня отправляли за продуктами, я использовал следующую стратегию: сначала обходил все ближайшие три магазина-палатки рядом с домом, запоминал цены на все продукты из списка, и затем уже по собранной базе данных минимизировал стоимость продуктовой корзины.  Во времена моего студенчества крупные сети активно стали внедрять регулярные скидки, я в свою очередь запоминал динамику цен, научился закупаться впрок по скидкам и выбирал из двух практически идентичных товаров товар с меньшей ценой. В тот момент мне не хватало удобного интерфейса, в который я смог бы вносить все свои покупки с максимальной детализацией и минимальными затратами времени. Идеальным вариантом было бы приложение, которое умеет интегрироваться со всеми магазинами, получать данные без моего участия, но с моего разрешения, отображать детализацию всех покупок, структурировать все траты с целью их анализа и обнаруживать лишние покупки. Судя по количеству скачиваний приложений для учета трат, такая потребность есть у десятков миллионов людей.  После окончания бакалавриата в 2016-м у меня не было огромного желания работать в чужой компании и был небольшой опыт разработки андроид-приложений. В тот момент я решил прокачать свои навыки разработчика на летних курсах и запилить в качестве выпускного проекта приложение, которое помогало пользователю оцифровывать свои кассовые чеки.  По итогу работы андроид-приложение обладало следующим функционалом: отправка фотографий на сервер, получение структуры чека, редактирование отдельного чека и отображение списка покупок. Web-сервис был развернут на AWS и распознавал текст с картинки библиотекой tesseract ocr, парсил текст регулярными выражениями и логировал результаты в БД. За время написания этого приложения пришло понимание, что роль андроид-разработчика - совсем не мое, ибо я устал от правки GUI и прочей рутины.  Одновременно с этим пришло осознание, что для разработки хорошего продукта необходима команда из разработчиков, дизайнеров и маркетологов. И самое главное, не хватало понимания, как удерживать клиентов в приложении. Ведь если пользователь забудет сфоткать один из своих чеков, то картина его трат будет неполной в конце месяца, что приведет к оттоку, ведь польза от приложения становится сомнительной. В итоге я решил пойти поработать в крупную компанию и понабраться опыта, а этот проект был заброшен. Код проекта находится в открытом доступе, может пригодиться для создания mvp, участия в хакатонах или студентам при написании курсовой работы. В последующие несколько лет страна активно двигалась к оцифровыванию кассовых чеков. В июле 2018-го года вышел апдейт закона "о применении контрольно-кассовой техники при осуществлении расчетов в Российской Федерации",  согласно которому на кассовом чеке должен быть указан QR-код.  ФНС России выпустило приложение для проверки кассовых чеков. Стало популярным приложение Едадил, которое позволяло получать кэшбэк в обмен на фотографию чека, его в дальнейшем приобрел Яндекс. Тинькофф Банк совместно с НСПК разработали сервис для привязки чеков ОФД к банковским транзакциям. НСПК запустило сервис для предоставления банкам и их клиентам постоянного доступа к кассовым чекам их транзакций в электронном виде и подключил к нему уже несколько банков. В прошлой статье я рассказывал об успешном опыте участия в соревновании по классификации кассовых чеков. В этот раз расскажу о том, как можно улучшить клиентский опыт и оптимизировать бизнес-процессы банка за счет кассовых чеков ОФД.  Клиента можно сделать счастливее за счет дополнительной экономии его времени или денег. Наглядность моего рассказа будет достигнута за счет иллюстрации возможных пользовательских интерфейсов. Все изображения получены из личных скриншотов приложений Альфа Банка и Тинькофф с последующим редактированием в общепризнанном графическом редакторе на скорую руку Paint.  По умолчанию банковское приложение показывает пользователю список всех его транзакций. По каждой транзакции известны: сумма, дата и время, название магазина и категория. У каждого банка своя категоризация карточных транзакции на основе  MCC магазина. Каждый магазин получает MCC на основании главного направления его деятельности.  Не всегда классификация трат совпадает с ожиданиями клиента. Иногда это связано с экономией на клиентском кешбэке, так например, становится выгодно относить клиентские траты в кафе к фастфуду, а не к ресторанам. Сыграть может и человеческий фактор, так происходит при передаче терминала коллеге на соседней торговым точке, который еще не успел обзавестись собственным. Более того, в крупным гипермаркетах представлен огромный ассортимент товарных категорий: продукты питания, товары для дома и даже электроника.  Детализация в кассовых чеках спускается до уровня отдельных товарных позиций, которые могут быть в дальнейшем сгруппированы до уровня товара. На основании товарного представления можно сформировать иерархическое дерево и отображать в мобильном приложении. Более того, пользователю можно предоставить возможность отредактировать это дерево исходя из его личных предпочтений. Персонализация контента играет важную роль в формировании клиентского опыта. Пользователь может потратить много времени на поиск товара среди великого их многообразия. Банк может на основании данных подобрать наиболее релевантные товары в заданной категории, предложить доставку через партнерский сервис, а также дополнительную скидку. Более того, возможны сценарии, в которых клиенты смогут порекомендовать полюбившиеся им покупки своим друзьям.  Магазины на данный момент очень активно эксплуатируют постоянные скидки в качестве мотивации к сиюминутной покупке. Продавец может на мгновение сильно поднять цену, создав иллюзию наличия скидки, как показано на примере ниже. Без информации о динамике цены покупателю сложно принимать правильное решение.  В онлайне динамику цен мониторят Яндекс.Маркет, е-каталог, mvmonitor.ru и другие. В оффлайне такую роль на себя могут взять банки за счет данных кассовых чеков. Возмещение социальных налоговых вычетов положено за расходы на лечение, покупку медикаментов и траты на образование. Самым популярным является возврат налога в стоматологии. К сожалению, процесс возврата налога требует затрат времени и сил, поэтому не все им пользуются. Клиенту требуется получить копию лицензии поликлиники, собрать все чеки и загрузить их в онлайн интерфейсе налоговой. Реализация сервиса со стороны банка потребует дополнительного интерфейса для клиник, поддерживающего регистрацию и загрузку лицензии. Клиника загрузит лицензию один раз и избавит себя от дополнительного бумажного документооборота.  Структуризация чеков разбивается на две подзадачи: определение места для названия товарной позиции в иерархическом каталоге и выделение бренда. Решение первой задачи можно подчерпнуть из предыдущей статьи про классификацию кассовых чеков. Учесть иерархию можно за счет мультиклассовой разметки с соответствующим изменением функции потерь. Определение бренда потребует сначала решения задачи NER, что на выходе определит необходимую подстроку. Далее потребуется решить задачу NEL для матчинга на имеющийся список брендов и пополнения этого списка. К сожалению, кассовые чеки не всегда выглядят так, как их хотелось бы показывать клиенту в мобильном приложении. Они содержат много специальных символов и сокращений. Решить эту задачу поможет подход Seq2seq, который переведет некрасивую последовательность в приятный для пользователя вид. Архитектура модели может быть основана как на блоках из трансформеров, так и на рекуррентных и сверточных блоках. Кассовые чеки являются более детальным представлением банковских транзакций. Каждая транзакция с привязанным чеком обогащается списком товар и услуг, которые получил клиент. Нейросетевой подход к моделирования карточных транзакций можно переиспользовать практически в неизменном виде для моделировании последовательности кассовых чеков, добавив иерархическим образом дополнительный энкодер для текста товарной позиций. Возможен и классический путь, в котором сначала будет задано дерево категорий, а затем будут построены агрегаты для использования методов классического машинного обучения. Таким образом, описанные выше подходы позволяют использовать этот тип данных для решения всех ключевых задачах: оценка кредитного рейтинга клиента, оценка дохода клиента, предсказание склонности к банковским продуктам и предсказание оттока клиента.  Работа асессоров потребуется одновременно для решения трех задач машинного обучения. Будем стараться ставить задачи разметки таким образом, чтобы получить максимально репрезентативную выборку и одновременно разметить минимально-возможное количество примеров. В этом нам поможет переиспользование разметки и  обученных моделей на одной из задач для решения смежных задач. Начнем распутывать клубок разметки с определения базиса в пространстве названий товарных позиций. Базисом будем считать такой набор, который однозначно определяет место названия товарной позиции в дереве и определяет ее брэнд. Очевидно, пара из подстрок, соответствующих названиям товара и бренда, удовлетворяет этим требованиям. Вычленение базиса из строки существенно сократит асессорский труд при разметке для задачи иерархической классификации.  Эффект будет достигнут за счет того, что асессору не придется размечать товары, отличающиеся свойством и порядком слов, несколько раз. При таком подходе к разметке из сэмплов "молоко домик в дер 0.95л в коробке 2.5%", "молоко домик в дерев 0.5 л в коробке" и "домик в дер молоко 1л пл. бут." будет выделен базис (молоко, домик в дер), и асессору придется разметить только один пример. Определение же бренда потребует дополнительного маппинга "домик в дер" -> "Домик в деревне". Заданный базис и алгоритм поиска подстроки в строке помогут существенно расширять обучающую выборку. Более того, такой подход поможет учить более робастную модель на случай новых брендов и товаров за счет разделение обучающего и валидационного множеств по парам (бренд, товар). Начинать разметку можно как и со случайно подмножества, покрывающего частые слова и словосочетания, так и с парсинга множества крупных тематических сайтов,  содержащих списки брендов и товаров, также стоит обратить внимание на каталоги баркодов. Дополнительно эти данные помогут составить свой иерархический каталог, переиспользовав накопленный опыт ритейла. После определения стартовой точки алгоритм развития модели будет следующим: Найти все названия товарных позиций, содержащих все известные пары (товар, бренд). Количество объектов будет на порядок больше по сравнению с базисным множеством. Использовать данные для обучения NER. Разметить NER-ом неразмеченное после пункта 1 множество. Сформировать множество новых пар (товар, бренд). Провалидировать корректность определения бренда и товара в каждой из пар. Разместить пару (товар, бренд) в дерево категорий и сделать маппинг на множество брендов. Перейти к пункту 1. Осталось придумать эвристики для формирования обучающей выборки в задаче нормализации, которая сводится к развертыванию сокращений. К счастью, на этом этапе мы уже знаем бренд, товар и категорию для каждого названия товарной позиции. Стоит заметить, что ряд свойств присущ только отдельным категориям, а если ограничиться парой (товар, бренд), то он сокращается еще сильнее. Более того, в выборке должны встречаться чеки с полными написаниями всех свойств. Сузив множество поиска, мы сократили возможность возникновения коллизий. Алгоритм развертывания сокращений без учителя: Определить для каждой пары (товар, бренд) множество свойств - все оставшиеся токены. Определить для каждой пары (товар, бренд) множество сокращений, которые оканчиваются точкой. Отфильтровать для каждого сокращения только таких кандидатов, которые полностью его содержат. Добавить дополнительные фильтры по частоте. Такой алгоритм будет полезен не только при нехватке ресурсов, но и при контроле генеративных алгоритмов. Head of ML Laboratory & Chief Data Scientist