- PVSM.RU - https://www.pvsm.ru -

Итоги MentorHack: чат-бот по выделению тасков из диалогов, сервисы для построения карьерных траекторий и команд

Недавно мы поучаствовали в организации MentorHack [1] – хакатона по созданию сервисов для наставничества в корпоративной среде, предпринимательстве и образовании.

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

Итоги MentorHack: чат-бот по выделению тасков из диалогов, сервисы для построения карьерных траекторий и команд - 1

Для начала напомним, что в базовом треке хакатона было 2 условных тематических направления: всевозможный matching и элементы AI Boss с призовым фондом в 500 000 рублей.

А также две не менее масштабные спецноминации:

  • SuperJob c задачей по построению карьерных траекторий от текущего резюме до желаемой вакансии с дополнительным призовым также в 500 т.р.
  • BusinessChain с задачей по сборке команд под проект на основе описания проекта и резюме кандидатов с призовым в 300 т.р.

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

— техническая реализация,
— уровень проработки,
— актуальность и востребованность,
— коммерческий потенциал и масштабируемость.

Итоги MentorHack: чат-бот по выделению тасков из диалогов, сервисы для построения карьерных траекторий и команд - 2

Как и ожидалось, на самом деле, в большинстве случаев жюри каждой команде по факту ставит одну оценку, выражая общее впечатление – понравилось / не понравилось, поэтому оценки по четырем критериям были очень близки.

Для итоговой оценки мнение жюри усреднялось с оценкой от наших кураторов по качеству и работоспособности кода.

Итоги MentorHack: чат-бот по выделению тасков из диалогов, сервисы для построения карьерных траекторий и команд - 3

На графике видно, что хорошие проекты практически всегда получали высокие оценки и за презентацию, и за техническую реализацию. Отдельным развлечением стала real-time обработка оценок жюри из 20 человек в отсутствии интернета и работающего принтера под звуки разбирающегосяя павильона. Но мы посадили пару машинлернеров за эксель и успели, в итоге получились вот такие рейтинги:

Итоги MentorHack: чат-бот по выделению тасков из диалогов, сервисы для построения карьерных траекторий и команд - 4

Победители о своих проектах

Jetlex

Проект Nota [2] – бот-ассистент для работы с чатами на естественном языке с выделением поставленных тасков в переписке. Чтобы начать работу нужно добавить Nota в чат и зарегистрироваться в Trello. Дальше бот подскажет, что делать – все просто.

Итоги MentorHack: чат-бот по выделению тасков из диалогов, сервисы для построения карьерных траекторий и команд - 5

После добавления в чат бот выявит сообщения, где один пользователь ставит задачу другому. В этом сообщении Nota определяет срок исполнения и исполнителя, а затем на основе полученных данных сама создаёт в trello задачу. При этом Nota сама генерирует название задачи, исходя из сути задачи, с помощью нейронного суммаризатора. Nota отличает обычные сообщения и флуд от реальных задач.

Например, из текста: "@viktorboyko09 подготовь к следующей неделе ежеквартальный отчет! Тот, котором мы вчера говорили по скайпу." Nota сделает в Trello задание с названием «Составление отчета», сроком «до 26.02.2018 (Nota отсчитала 7 дней от даты постановки задачи)», ответственным «Виктор Бойко» и описанием, соответствующим изначальному тексту.

Итоги MentorHack: чат-бот по выделению тасков из диалогов, сервисы для построения карьерных траекторий и команд - 6

Для обучения классификатора создан датасет на основе сообщений с форумов drom.ru, moskvaforum.ru, women.ru, antiwomen.ru, vashdom.ru – для того, чтобы определить какие сообщения не являются задачами. А в качестве примеров задач были собраны сообщения с youdo.ru и fl.ru. В итоге собрано более 35 млн. примеров, из которых 3 млн являлись задачами. Именно данные о задачах и их заголовках мы использовали для обучения суммаризатора (seq2seq реализации OpenNMT). В процессе соревнования мы обнаружили, что задачи часто ставятся именно в повелительном наклонении, а задачи в нашем датасете использовали глаголы в инфинитиве (например, “[нужно] покрасить забор”). Поэтому решили аугментировать наш датасет сообщениями с глаголами в повелительное наклонением. Оказалось, что это можно легко сделать с помощью pymorphy2 (функцией inflect). Найти датасеты можно здесь:
Обучение суммаризатора – train [3] и test [4].
Обучение классификатора – train [5] и test [4].

Наш временный классификатор tfidf + SVM с линейными ядрами должен был в последующем быть заменен на CNN классификатор. Но этого не произошло и временный вариант остался окончательным решением, потому что нейронный классификатор обучился только через день после окончания соревнований.

Члены команды писали на разных языках, поэтому мы выбрали сервисный подход к архитектуре. Сервисная архитектура позволила нам легко объединить модули написанные на Python (сервисы суморизации, NER и классификации фраз), Go (ввод-вывод в Telegram) и Node.js (ввод-вывод в Trello). IPC между сервисами был построен на базе стандартных потоков ввода-вывода.

Попробовать нашего бота можно, добавив manager_assist_bot [6] в группу. В качестве демо варианта Nota все задачи добавляет в одну общую доску Trello.

Tuggla

Мы разработали систему [7], которая сможет подбирать для каждого кандидата вакансии, подходящие по его навыкам, показывать дальнейшие траектории карьеры по каждому направлению, а также объяснять, какие навыки человеку нужно подтянуть и получить, чтобы попасть на желаемую позицию.После получения датасета от SuperJob в виде json строк резюме и вакансий, мы не успев придумать решение, сочли логичным действием сопоставить опыт работы с реальной вакансией, так как это даст нам представление о хронологии человек получения навыков, которые требует работодатель в вакансии.

Основная проблема заключалась в количестве данных (по 250.000 вакансий и резюме, в каждом резюме опыт работы был не менее 3-4 позиций, а иногда до 50). Если использовать просто word2vec на сопоставление уйдёт больше одного дня, что в рамках хакатона не самый оптимальный шаг. Поэтому мы нашли более менее похожие вакансии для опыта работы в резюме с помощью TF-iDF, а итоговый ответ (подходит или нет) давал нам word2vec. После сопоставления вакансий настало время вытаскивать навыки из поля требования от кандидата в вакансии. Сделали мы это с помощью regex-ов, логики и черной магии. Логику и regex-ы пришлось очень долго тюнить, потому что все требования были написаны в производном стиле. После 20 if-ов и тучи regex-ов мы вытащили что-то более-менее похожее на навыки. Конечно, можно сделать что-то более интеллектуальное, например, сделать merge всех навыков, побольше поиграться со стоп-словами, но у нас оставалось чуть меньше дня, поэтому мы перешли к следующему этапу работ. Так как каждая вакансия в датасете была сопоставлена с абстрактной областью (менеджер, помощник и т.п.), мы посчитали самые часто встречающиеся навыки для каждой области. После чего мы взяли среднее от векторов этих навыков и назвали это вектором профессии.

Вот, например, топ-10 навыков юриста:

Итоги MentorHack: чат-бот по выделению тасков из диалогов, сервисы для построения карьерных траекторий и команд - 7

Далее, когда пользователь вводит навыки, мы такой же магией и regex-ами вытаскиваем «реальные» (наши) навыки, берём их вектор, среднее и с помощью косинуса смотрим на расстояние до вектора профессии. Таким образом, можно сказать под какую область подходят ваши навыки. SuperJob был более заинтересован в предсказании следующего шага, а мы хотели победить, поэтому взяли все карьерные траектории и решили посмотреть на динамику навыков и хронологию профессий. Т.к. мы сопоставили каждую строку в опыте работы с вакансией, а вакансия сопоставлена с профессией – для нас карьерная траектория – это просто набор профессий в хронологическом порядке. Вот как это выглядит для одного резюме:

Итоги MentorHack: чат-бот по выделению тасков из диалогов, сервисы для построения карьерных траекторий и команд - 8

После этого мы выделили «правильные» карьерные траектории. Это самая интересная и мутная часть нашего проекта. Дело в том, что не очень понятно, что такое карьерный рост. Особенно непонятно, как передать наше ощущение карьерного роста в коде. После долгих обсуждений за 7 часов до конца хакатона было решено присвоить профессиям уровни в зависимости от частоты перехода к ней из текущей.

Например: Генеральный директор — уровень 10, Водитель — уровень 1. И вот что у нас получилось:

Итоги MentorHack: чат-бот по выделению тасков из диалогов, сервисы для построения карьерных траекторий и команд - 9

Тут скрыта интересная проблема – оказывается люди не всегда развиваются в нашей парадигме. И иногда они даже становятся водителями после того, как были менеджерами или банкирами или пишут полную чушь в своём резюме – и мы получаем 40 вакансий, которые не имеют ничего общего между собой. Поэтому нам пришлось написать несколько условий для проверки на адекватность карьерного пути:

— Путь должен занимать обозримое количество переходов — например, от 3 до 8.
— Каждая следующая позиция, если она не совпадает с предыдущей, должна быть на 1-3 уровня выше.

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

Пара примеров построения карт по навыками:

Описания проектов еще нескольких призеров

Канапе

Нашей задачей [10] было собрать команду под конкретный проект в виде набора вакансий.

Мы собирали команду по двум основным критериям: покрытие всех необходимых скиллов и совместимость по интересам.

Была сделана кастомная реализацию resume2vec для «умного» поиска подходящих под вакансию людей. Работает это примерно так:

  1. парсим навыки из датасета с резюме,
  2. создаём граф, где вершины это резюме, а ребра это схожесть между ними, далее используем технологию node2vec, описанную в этой статье [11]. Для второй части мы написали чат-бот, который парсит ВКонтакте и по подпискам и группам пользователя определяет его интересы.

TeamUp

Мы работали над сервисом [12] для сборки команд по резюме. Люди из базы фильтровались по компетенциям, а затем проходили ранжирование. Для анализа человека использовались ответы на вопросы об интересах, ответы векторизовались с помощью word2vec и находились ближайшие среди отфильтрованных. С помощью API ApplyMagicSauce определялся дополнительно тип по схеме OCEAN на основе тех же вопросов. Также для ранжирования использовалось отношение возраста к общему опыту работы. Итоговый скор для каждого человека – это взвешенная сумма этих трех параметров.

Nice Folks Out

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

Если вы дочитали до сюда и хотели бы ознакомиться с остальными проектами и их презентациями, добро пожаловать сюда [14], здесь вы найдете прототипы сервиса для подбора научного руководителя, повышения эффективности команды, матчинга ментор-менти и многое другое.

Комментарии партнеров

«В первый день хакатона слабо верилось в то, что участники преодолеют не только технические, но и бытовые трудности. Все-таки форум такого масштаба не очень способствует созданию спокойной творческой атмосферы. С удовольствием хочу отметить, что все 30 команд дошедших до финала справились с холодом, голодом и вредными экспертами во время чекпоинтов. На второй день в некоторых случаях казалось, что идею команды уже не спасти и эксперты не стеснялись в оценках. На следующий день мы с удивлением видели, как буквально за несколько часов проект менялся до неузнаваемости, обретая новую логичную и интересную форму. Для нас это был очень интересный опыт. Спасибо команде организаторов и успехов всем участникам.»

Елена Александрова, директор по развитию Лаборатории ИПИ, автор спецноминации от проекта BusinessChain [15].

«Участвовать в хакатоне мы решили спонтанно. После встречи в офисе Superjob с Аленой Ильиной решение приняли за полчаса. Мы давно вынашивали идею проведения хакатона под свои задачи и в этот момент решили, что звезды сошлись, и это мероприятие станет для нас неплохим плацдармом для обкатки нового механизма и изучения всех подводных камней. И как раз подводных камней нам хватило с лихвой. Начиная с очень спринтерских сроков, заканчивая постоянно изменяющимися организационными вводными, о существовании которых сложно даже догадаться, постоянно играя только в коммерческом поле. У нас было очень много вариантов постановки задачи, так как направлений, которых развивает SJ, немало, начиная от прямых коммерческих историй, заканчивая профориентационным и волонтерским направлениями. Сошлись на задаче по карьерным траекториям — было интересно, как ребята смогут реализовать то, над чем мы уже работаем, смогут ли они нам дать новое видение и покажут, чего нам может не хватать. По размеру призового фонда решение изменили в сторону увеличения также быстро, когда попытались разделить оговоренную сумму на три места и получилось „некрасиво“. Наверное, именно бонусом к нашей решимости против всех законов логики, успеть всё за пару недель, получили в свое распоряжение кусочек под лаунж и с пару сотен седых волос при ее обустройстве в условиях „пока мы не знаем сколько она метров, в каком именно зале и что туда можно поставить, наклеить, подключить“. Когда наконец то мы добежали до дня открытия, поняли, что совсем ничего не знали о процессах и механизмах, но к тому времени у нас уже были друзья, такие же постаревшие как и мы, (прости, Алена, надеемся, что всё обратимо), которые потащили нас сквозь все 48 часов. И если ребята (потрясающие, по хорошему сумасшедшие, и просто хорошие люди) двое суток работали на площадке, то мы 48 часов занимались гаданиями и предсказаниями без всякого машинного обучения. Каждый следующий чек-пойнт менял шкалу „все офигенно-все пропало“ в противоположные стороны. К финалу мы уже понимали, кто фаворит, а вот с 2 и 3 местами неожиданно „застопорились“. Решались уже на питчах, но надеемся, что сделали правильный выбор. Если коротко резюмировать, то это были американские горки и комната ужаса в одном. В общем, аттракцион удался, и он нам понравился. Мы многое узнали о том, „как не надо“, мы познакомились с отличными ребятами и очень многое поняли о том, что мы можем сделать, используя такие механизмы проработки своих задач. Мы знаем, что повторим это и знаем, что это будет круто.»
Юлия Шарапова, руководитель пресс-службы компании SuperJob [16].

Автор: bibilov

Источник [17]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/analiz-danny-h/274658

Ссылки в тексте:

[1] MentorHack: https://habrahabr.ru/company/goto/blog/347772/

[2] Nota: https://drive.google.com/file/d/18Z9L6tiGFU_fVpxEUc1b9Cv9kvSEcanx/view?usp=sharing

[3] train: http://lnsigo.mipt.ru/export/task_summarization/tasks_train.gz

[4] test: http://lnsigo.mipt.ru/export/task_summarization/tasks_test.gz

[5] train: http://lnsigo.mipt.ru/export/task_classifier/classifier_train.gz

[6] manager_assist_bot: http://t.me/manager_assist_bot

[7] систему: https://drive.google.com/file/d/1MZp8l--cL85MzO1V3uc8GPSaD2WpaOBP/view?usp=sharing

[8] карта супервайзера: https://plot.ly/~tvorogme/20/markers-and-text/

[9] карта журналиста: https://plot.ly/~tvorogme/22/markers-and-text/</li>%0A%09<li>

[10] задачей: https://drive.google.com/file/d/1EdoDpzJ-76gWEpwYPx487nNXZ2bznEqJ/view?usp=sharing

[11] в этой статье: https://cs.stanford.edu/people/jure/pubs/node2vec-kdd16.pdf

[12] сервисом: https://drive.google.com/file/d/1Uvdovi8fasEbM4QrAEl264k9K-aHfihb/view?usp=sharing

[13] платформу: https://drive.google.com/file/d/1iyUqTV6jJzBXr1PwI8wCBkGQkOzZ1RHB/view?usp=sharing

[14] сюда: https://drive.google.com/drive/folders/0B1voTBmYH9A-fnlxeXRoOUgyazZVbmkzcEVBQVZiN0EyaEVDUGNmbC1IZVRreWJLNTFCR0k?usp=sharing

[15] BusinessChain: https://businesschain.io/portal

[16] SuperJob: https://www.superjob.ru/

[17] Источник: https://habrahabr.ru/post/350524/?utm_campaign=350524