В статье описывается способ классификации коротких текстовых сообщений в 1С с помощью Yandex CatBoost — библиотеки градиентного бустинга на деревьях решений. Например, если имеется набор сообщений от пользователей с вопросами, ответами или комментариями, то с помощью этого инструмента можно автоматизировать классификацию таких сообщений.
Далее в статье будет использоваться пример компании SM Lab. Имеется поток вопросов от менеджеров логистического подразделения к коллегам из подразделений разработки товара. Каждый вопрос в зависимости от контекста может быть адресован одному из трех получателей: технологу, бренд-менеджеру или производственному менеджеру. В целях улучшения процесса согласования, определение получателя письма стало автоматическим.
Примеры работы
Например, для строки «Просьба подгрузить в систему фото реального изделия в хорошем качестве» модель определит, что это сообщение адресовано бренд-менеджеру, потому что слово «фото» при обучении для категории «Brand manager» имеет большой вес.

Другая строка «Подкладка есть?» определится как сообщение для технолога.

Так же важно предусмотреть категорию "Другое", под нераспознанные строки:

Технологии
Yandex CatBoost
Библиотека градиентного бустинга на деревьях решений.
Библиотека создавалась инженерами и специалистами Яндекса в качестве преемника Матрикснета — алгоритма, применяемого для ранжирования и прогнозирования, а также лежащего в основе рекомендательных технологий. CatBoost использует более универсальный алгоритм, поэтому она подходит для решения и других задач.
Иными словами, инструмент для построения предсказательных моделей.
Преимущества:
Работа с категориальными данными «из коробки». В машинном обучении данные переводятся в коды (числа, токены). На наборе токенов происходит обучение модели. В CatBoost это автоматизировано.
Высокое качество. В сравнительном тестировани и на популярных датасетах CatBoost выигрывает у аналогов.
Простота использования. Можно работать из Python, R и командной строки. Последнее для 1С особенно важно.
Бесплатно для коммерческого использования.
MyStem
Морфологический анализатор для русского языка. Нужен для лемматизации слов. Поставляется в виде exe файла с интерфейсом командной строки, что также удобно для использования в 1С.
Хотя CatBoost и производит автоматическую токенизацию слов, он разбивает слова на токены «как есть». Русский язык довольно богат на формы слов. Необходимо приводить все слова в тексте к нормальной форме: именительный падеж у существительных и начальная форма для глаголов. Например, для получателя «технолог» слова «подкладка», «подкладки», «подкладкой», «подкладку» и т.д. должны стать словом «подкладка».
У CatBoost есть встроенная лемматизация слов, но с русским языком она не всегда работает корректно.
Обучение
Указание категорий
Для того чтобы обучить модель, нужны данные. В нашем случае это короткие текстовые сообщения. Так как каждое сообщение должно относиться к какой-то категории, сначала необходимо вручную/полуавтоматом указать категорию для каждого существующего сообщения. Например, мы можем точно знать, что каждое сообщение, содержащее слово «фото», относится к конкретной категории, а каждое сообщение, содержащее слово «ткань», — к другой.
В моем примере сообщения — это справочник. Выглядит это так:

То, что сейчас делается вручную, в скором времени будет работать автоматически на основе результатов ручной работы.
Подготовка данных
CatBoost для обучения принимает данные в текстовом файле в формате «<текст><TAB><категория>».
Для начала у нас есть сообщения с категориями, например:

Этот список сообщений необходимо лемматизировать с помощью MyStem, предварительно очистив строку от всего, кроме букв и цифр.
Команда вызова MyStem:
mystem -l -c in.txt out.txt
Где:
mystem — приложение.
-l — параметр, указывающий на необходимость лемматизации текста.
-c — вывод каждой строки отдельно.
В файле out.txt MyStem отдаст такой текст:

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

Обучающая и тестовая выборка
CatBoost во время построения модели (обучения) постоянно проверяет, насколько хорошо он научился. Соответственно обучение происходит на двух выборках: обучающей и тестовой.
Для данного примера в несколько тысяч сообщений хорошим соотношением выборок будет 80 на 20: 80% — обучающая, 20% — тестовая.
Разбивка сообщений должна происходить случайным/псевдослучайным образом. Главное — разделение 80/20 должно быть не от всей выборки сообщений, а пропорционально каждой категории. Иначе модель может обучаться на одной категории, но проверить свои знания не сможет, так как категория не попадет в тестовую выборку.
Запуск обучения
Когда готовы лемматизированные категоризированные текстовые файлы для обучающей и тестовой выборки, можно выполнить команду обучения CatBoost:
catboost fit --model-file model.bin --learn-set learn.txt --test-set test.txt --use-best-model --column-description cd.txt --dictionaries "Word" --feature-calcers "BoW" --tokenizers "Tok[lemmatizing=True]" --loss-function MultiClass --od-wait=50 --iterations 5000
Где:
calc — функция применения готовой модели
--input-path — файл, где каждая строка - отдельное сообщение, которое необходимо классифицировать. Каждое сообщение в файле должно пройти лемматизацию с помощью MyStem точно так же, как и при процессе обучения.
--cd — файл описания колонок выборок. Для текущей задачи файл всегда содержит “0 Text”.
-o — выходной файл с результатом классификации
--prediction-type Class — указание метода предсказания
-m model.bin — путь к файлу модели
Результатом в выходном файле будут строки, где каждая строка — класс каждой строки входного файла.
Дальнейшее использование
У нас в системе схема работы сложилась следующая:
раз в неделю джоб обучает модель на новых данных
каждое новое сообщение классифицируется моделью
в неопределенное время специальный сотрудник может просмотреть все сообщения, которые определились как категория «Other» и установить им правильную категорию. Таким образом поддерживается качество классификации.
Полный пример использования на 1С лежит на GitHub.