BigARTMПервый шаг в любом проекте — выбор правильных библиотек и инструментов. Наш выбор остановился на BigARTM. И на это есть ряд причин.
Первое —
BigARTM покрывает все классические подходы тематического моделирования — PLSA и LDA.
Второе —
позволяет использовать различные регуляризаторы, дополняющие модель полезными свойствами. Немного поподробнее расскажу про самые популярные:
- Регуляризатор сглаженности/разреженности позволяет сделать все топики модели либо предметными, либо фоновыми. Фоновые темы содержат лексику, характерную для всей коллекции. Предметные, в свою очередь, содержат специфичную для темы лексику.
- Декоррелятор повышает различность тем, удаляя дублирующие и похожие тематики.
- Частичное обучение позволяет строить темы вокруг определенных термов, повышая интерпретируемость самой темы. Эти термы задаются самим пользователем.
Третье — в BigARTM реализован
механизм разбиения коллекции на батчи, что позволяет не хранить её целиком в памяти, и производить параллельное обучение.
Алгоритм применения библиотекиПеред обучением тематических моделей, важно правильно предобработать данные, потому что мы работаем с мешком слов.В нашем случае мы прибегаем к:
- лемматизации: одинаковые слова в разной форме — одни и те же слова;
- удалению стоп-слов: предлоги, союзы, местоимения, числительные, ссылки, ФИО;
- удалению низко/высоко частотных слов, характерных для всей коллекции, а также редких слов, которые вносят лишний шум при построении модели.
Обучение в BigARTM сильно похоже на обучение классических моделей машинного обучения. Первым делом нужно подобрать значения гиперпараметров: количество проходов по документу и коллекции, а также значения используемых регуляризаторов. После просмотра результатов обучения — графики обучения, график распределения тем в коллекции, значение perplexity, — принимается решение о подборе нового набора гиперпараметров, и повторного обучения или сохранении получившейся модели и анализе сформировавшихся тематик.
В качестве результатов мы можем посмотреть на распределение слов в теме, распределение тем в документах и на сами сформировавшиеся тематики.
Интерпретация темПока что мы затронули лишь вопрос формирования тематик, но не их интерпретацию. Это было одним из основных требований к результатам моделирования, потому что мы имеем дело с обучением без учителя.
Первый и самый очевидный способ — описать тематику набором топ слов, слов, принадлежащих теме с наибольшей вероятностью.
Пример интерпретации на основе топ-слов:
«кэшбэк, акция, друг, начисление, начислять, месяц»Но так мы получим достаточно слабую интерпретацию, как и не сможем посмотреть на содержимое. Перейдя к биграммам, мы сможем улучшить интерпретацию, но всё также не будем иметь представления о экспертизах, попавших тему.
Пример интерпретации на основе биграмм:
«кэшбэк_начислять, акция_друг, начисление_кэшбэк, месяц_начислять, кэшбэк_неначислять»Логичное решение добиться максимальной интерпретации и раскрыть содержимое — взять топ n экспертиз из темы. Но в таком случае мы сталкиваемся с проблемой долгой вычитки, от которой так хотим избавиться (экспертизы содержат в среднем 150 слов). А также не сможем раскрыть весь спектр темы — возможно топ n экспертиз будут затрагивать лишь малую часть проблематик.
Поэтому мы решили использовать следующий подход, предложенный К. Воронцовым для одной из
дипломных работ:
- Разбиваем экспертизу на предложения по точкам. Получившиеся предложения прогоняем в предобученной модели BigARTM, и выкидываем предложения, которые принадлежат к теме с малой вероятностью.
- Строим мешок слов на получившихся предложениях, на основе которого формируем матрицу схожести, используя расстояние по жаккарду, потому что хотим оценить расстояние между предложениями по мешку слов, и прогоняем её через алгоритм кластеризации Affinity Propagation. Такой подход позволяет нам не задумываться о количестве необходимых кластеров для каждой тематики, а также построить схожесть экспертиз на основе пересечения слов.
- Выбираем предложения, являющиеся центрами кластеров и наиболее близкие к ним. Тем самым, создаём семантические ядра, и формируем тот самый спектр, покрывающий всю тематику.
- Выбрасываем из получившейся суммаризации технические предложения, если такие попались.
Пример суммаризации по теме: «Выплаты по акциям и кэшбэк».
- Клиент поставил оценку 1, потому что не получил кэшбэк по акции «Получайте призы за покупки кредитной картой Visa Альфа-Банка», так как кэшбэк ограничен и не может быть начислен всем участникам акции из-за её высокой популярности. Хочет расторгать договор по КК.
- Клиент хотел узнать, какую сумму нужно потратить в июле, чтобы получить повышенный кэшбэк. Оператор ответил не по теме вопроса. Также клиент пожаловался, что из приложения убрали данную информацию и теперь сложно разобраться в тратах.
- Уточнить срок выплаты кэшбэка по акции «Кэшбэк по кредитной карте 100 дней без процентов». Не получил ответ на вопрос; сотрудник ответил шаблоном, стал предлагать кредит.
- Клиент обратился для уточнения информации по выплате «Получайте призы за покупки картой Visa Альфа-Банка». Клиент один из первых начал участие в акции, но выплаты не было, хотя со стороны клиента условия были выполнены.
Заметно, что суммаризация получилась достаточно интерпретируемой: изначально не зная, что тема о кэшбэке и акциях, это можно легко и быстро понять.
Установка доверия к моделиНе так сложно построить модель, как убедить бизнес, начать ею пользоваться, поменяв устоявшиеся процессы. Тем более для тематических моделей не существует таких объективных метрик качества, как условный f1 score для классификации. Мы можем посчитать coherence score для каждой тематики — метрика, согласно научным статьям, наилучшем образом коррелирующая с интерпретируемость. Но на практике в нашем случае оказалось, что она не так точно отражает действительность, как хотелось бы. Тем более нам хочется также проверить темы на консистентность и гранулярность.
Поэтому мы придумали следующие три метрики качества:
- Точность — суммаризующие предложения для каждой темы должны совпадать с названием темы. Означая, что, например, в тему о выплатах по кэшбэку не должны просачиваться предложения о проблемах с комиссией.
- Полнота — тематическая модель должна отыскать все проблематики, которые до этого выделил эксперт. А в идеале ещё и найти новые.
- Дельта — доли тематик в суммаризации должны совпадать с долями этих же самых тематик в изначальной коллекции: с той коллекцией, которую уже вычитал эксперт.
Средняя точность у нас получилась 82%, полнота больше 100% — мы смогли найти больше проблематик чем эксперт, а дельта сохранилась в районе +/- 8%.Результаты | Было | Стало |
Продолжительность | 15 дней | 3 дня |
Количество сотрудников | 8 человек | 3 человека |
Объем экспертиз | 1.5 - 2 тысячи | Без ограничений |
Каналы и продукты | С низкой оценкой | Без ограничений |
Как видно из таблицы, используя выше описанный алгоритм, мы смогли ускорить вычитку и сократить количество сотрудников, необходимых для неё. А также теперь мы может анализировать неограниченный набор экспертиз, как и любой канал.
Веб-интерфейсНо на этом мы решили не останавливаться и разработать веб-сервис для тематического моделирования с суммаризацией, уйдя в сторону от Jupyter тетрадок.
Что же послужило нам основной мотивацией это сделать?Любая даже самая интересная задача со временем может стать рутинной. Можно провести аналогию с соревнованиями по машинному обучению. По началу очень интересно копаться в данных, выстраивать пайплайны с нуля, пробуя различные методы.
Но, как правило, ближе к концу идеи заканчиваются (особенно если вы участвуете один) и начинается борьба за тысячные посредством ансамблей и тюнинга всевозможных гиперпараметров. Это может немного утомить.
Рутинна и цикличность послужили первой причиной отойти от jupyter тетрадок.
Дальше мы
захотели сделать аналитиков клиентского опыта независимыми от нас. Другими словами, разработать такой инструмент, который бы позволил анализировать коллекции экспертиз в любой момент времени, при этом не требуя специфичных знаний о тематическом моделировании.
Также мы решили
избавиться от перебросок экселек по почте и хранить все данные и результаты в одном месте.
Интерфейс получился достаточно простым и интуитивно понятным. Backend мы реализовал на Flask, а frontend на HTML/CSS/AJAX. Пример работы можете посмотреть на видео: