- PVSM.RU - https://www.pvsm.ru -
В последние выходные сентября наша команда приняла участие в хакатоне [1] М.Видео по анализу данных. На выбор было предложено два задания: первое — генерировать описание продукта на основе отзывов о товарах, второе — выделять важнейшие характеристики товаров на основе справочника, данных о совместных просмотрах и добавлении в корзину. Мы решали оба задания. Под катом история, почему мы завалили этот хакатон и чему научились.
Когда наша команда встретилась перед началом хакатона, нас смущало отсутствие чёткой постановки задачи или пожеланий. За неимением лучшего, мы начали генерировать идеи сами:
Мы мечтали о доказуемом увеличении бизнесовых метрик: просмотров, конверсии, среднего чека и лояльности. За несколько дней мы попытались вытащить информацию из инсайдера, но в результате только больше запутались. Когда мы приехали в офис М.Видео в субботу, у нас в голове было несколько вариантов того, что можно сделать — и ни один в итоге не совпал с тем, о чём нас действительно попросили.
Оказалось, что нужно генерировать описания товаров или выявлять их наиболее существенные характеристики. И метрик не будет, а будут глаза жюри.
Все три инженера в нашей команде сели решать те задачи, которые нам показались верными. С учётом новизны данных и большого количества экспериментов, это отняло весь вечер. К глубокой ночи у нас оказались промежуточные решения, которые мы допиливали все утро. К дедлайну у нас было три алгоритма, которые были мало связаны друг с другом. Ревью алгоритмов никто не делал, кроме их усталых создателей. Кажется неудивительным, что в тройку победителей мы не вошли. Но сами алгоритмы, кажется, достойны внимания.
Первое из двух заданий хакатона была сформулировано как задача автоматической суммаризации текста [2]. Нужно было создать алгоритм, который по множеству отзывов покупателей на товар генерирует один синтетический отзыв, содержащий самую важную информацию о товаре. Формальных требований к синтетическим отзывам не было, так что мы сами придумали свои хотелки:
Из этих требований уже можно перейти к общей схеме алгоритма:
В итоге получили примерно такие синтетические отзывы, как этот (на телевизор):
По первому же примеру видны плюсы и минусы нашего подхода. Плюс — что отзыв читабельный. Минус — например, что 2 и 3 утверждения можно было бы объединить, но наша кластеризация оказалась слишком детальной. К сожалению, никакого способа проверить качество генерации синтетических отзывов, кроме метода пристального взгляда, мы не придумали. А метод пристального (но беглого) взгляда показал, что отзывам недостаёт структуры, но в целом выглядят адекватно.
Другая ветка работы была связана с эмоциональной окраской (тональностью [8]) отзывов. При большей части отзывов была прикреплена оценка товара от 1 до 5. Ещё на отборочном туре мы решали задачу [9] определения тональности — прогнозирования её по тексту отзыва. Для этого каждое нормализованное слово было превращено в бинарную переменную, и на них была обучена линейная регрессия. Большой положительный коэффициент перед словом в такой модели означает, что оно обычно встречается в позитивных отзывах, а отрицательный — что в негативных. Чем больше коэффициент (по модулю), тем сильнее влияет слово на оценку товара.
Для каждого товара мы построили такую регрессию на всех отзывах на него (если их достаточно много. Отсортировав коэффициенты, можно найти самые "позитивные" и "негативные" слова об этом товаре. Среди них, правда, много неинформативных, таких, как "отличный" или "отвратительный". Чтобы их исключить, пришлось составить специальный чёрный список. Для этого мы просто построили модель тональности на абсолютно всех продуктах, и вытащили самые значимые коэффициенты из неё. Они как раз в основном соответствовали неинформативным оценочным суждениям, типа "хороший/плохой".
Оставшиеся после фильтрации по чёрному списку слова оказались действительно достаточно информативными. Например, для IPhone 6 самый большой отрицательный коэффициент оказался у слова "тихий" — и действительно, это одна из основных проблем, на которую жалуются его владельцы.
Наверное, если бы мы встроили эмоциональную оценку свойств товаров в синтетические отзывы, это сделало бы их достаточно привлекательными, чтобы обеспечить нам победу. Но каждый из нас до последнего момента отлаживал свою собственную модель, и вместо нормальной интеграции мы просто записали выдачу одного алгоритма под другим.
Кроме отзывов, у нас была информация о просмотрах товаров и добавлении их в корзину. Мы решили выяснить, какими свойствами продукта определяется конверсия просмотров в покупки. Для любого продукта у нас были характеристики из справочника: габариты, разрешение экрана, марка процессора, и так далее. Мы преобразовали их в бинарные признаки. На них для каждой категории товаров построили логистическую регрессию, предсказывающую вероятность добавления товара в корзину. Полученные коэффициенты при свойствах товаров тоже можно интерпретировать как важность этих свойств при принятии решения о покупке. Дальше мы поступили с ними примерно так же, как со словами в отзывах: перевзвесили важности по частоте, и отобрали самый важный признак из каждой смысловой группы. В итоге для каждого товара мы получили самые важные его характеристики с точки потребительского поведения, но ни сопоставить их с результатами анализа отзывов, ни тем более объединить с ними мы не успели.
Хочется поблагодарить организаторов хакатона за интересную задачу, качественные данные, и вкусную еду. По общему впечатлению эти полтора дня были очень хороши.
С точки зрения организации хакатона не хватило только объявленных с самого начала критериев качества, по которым бы сравнивались решения. Максимизировать неизвестную функцию — не самое продуктивное занятие. Ещё не хватило понятной постановки задачи до начала хакатона — фразы “агрегация отзывов на сайте” и “помощник продавца по подбору товаров в магазине” можно было трактовать как угодно.
Задним числом уже понятно, что даже в таких условиях нашей команде не стоило бросаться в разные стороны, как лебедь, рак и щука. Стоило сразу определить, как должен выглядеть то идеальное описание товара, которое мы хотим получить на выходе. Мы могли бы с первых часов хакатона сконцентрироваться на каком-нибудь одном направлении (не столь важно, каком именно), и к вечеру иметь работающий прототип. Тогда за второй день совместной отладки мы бы довели его до уже неплохо работающего продукта.
В любом случае, мы получили код [10], который можно переиспользовать, большое количество мерча, и, главное, опыт. Для решения простых задач магазина понадобилось применить едва ли не половину вводного курса по машинному обучение. Но решили всё, как обычно, не познания в программировании и математике, а организационные способности.
Автор: Давид Дале
Источник [11]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/data-mining/266366
Ссылки в тексте:
[1] хакатоне: http://hackathon.mvideo.ru
[2] автоматической суммаризации текста: https://en.wikipedia.org/wiki/Automatic_summarization
[3] pymorphy2: http://pymorphy2.readthedocs.io/en/latest/
[4] обратный доле отзывов: https://ru.wikipedia.org/wiki/TF-IDF
[5] обученной кем-то: https://nlpub.ru/Russian_Distributional_Thesaurus
[6] word2vec: https://ru.wikipedia.org/wiki/Word2vec
[7] DBSCAN: http://scikit-learn.org/stable/modules/clustering.html#dbscan
[8] тональностью: https://ru.wikipedia.org/wiki/%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D1%82%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B0
[9] решали задачу: https://github.com/avidale/mvideo_hack/tree/master/test_problem
[10] код: https://github.com/avidale/mvideo_hack
[11] Источник: https://habrahabr.ru/post/340694/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.