Т.к. мой классификатор из прошлого поста таки работает (впрочем, параметры «из коробки» не всегда удачны, потому я вынес возможность слегка настроить Conv1d-слои и скрытый слой) — я решил прикрутить его к боту. Да, запоздал я на этот хайп ) Кстати, заранее уточню, что прикрутить русский я пока таки не пробовал, хотя это не должно стать проблемой — в nltk поддерживаются нужные фичи, обучение word2vec концептуально не отличается от английского, да и предобученные модели вроде бы имеются.
Ну и сходу возникают вопросы:
под какие платформы его пилить — пока решил остановиться на telegram. В теории — конструкция позволяет легко дописать обертки для других платформ (как будто он кому-то понадобится )
как описывать «сценарий». Навелосипедил свою структуру с классами и сущностями поверх YAML
ну и неплохо бы хранить ботов/состояние в какой-нибудь БД
Речь, как ни странно, пойдёт о использующем свёрточную сеть классификаторе текстов (векторизация отдельных слов — это уже другой вопрос). Код, тестовые данные и примеры их применения — на bitbucket (уперся в ограничения размера от github и предложение применить Git Large File Storage (LFS), пока не осилил предлагаемое решение).
В моём случае — на входе сети находятся векторы слов (использована gensim-я реализация word2vec). Структура сети изображена ниже:
Вкратце:
Текст представляется как матрица вида word_count x word_vector_size. Векторы отдельных слов — от word2vec, о котором можно почитать, например, в этом посте. Так как заранее мне неизвестно, какой текст подсунет пользователь — беру длину 2 * N, где N — число векторов в длиннейшем тексте обучающей выборки. Да, ткнул пальцев в небо.
Матрица обрабатывается свёрточными участками сети (на выходе получаем преобразованные признаки слова)
Выделенные признаки обрабатываются полносвязным участком сети
Стоп слова отфильтровываю предварительно (на reuter-м dataset-е это не сказывалось, но в меньших по объему наборах — оказало влияние). Об этом ниже.
После недавнего диалога возник вопрос поиска классификаторов, способных работать с текстами на русском языке без костылей в виде сборки watson-го NLC и bing translator-а. Решено было свелосипедить макет. За основу взят word2vec для получения векторного представления примеров и пользовательского ввода. Больше примеров работы с ним можно найти, например — тут. Кстати, вопрос более опытным — нет ли более подходящей альтернативы? Классифицировать объемные тексты не планируется. Напомню, что word2vec позволяет получать векторное представление переданного слова (к полученным векторам можно применить сложение/вычитание и умножение на численный коофициент). При этом вектор будет в пространстве, в котором в качестве осей — применим «связанные» слова.
Собственно, после одного из недавних постов @IBM возникла идея скрестить ежа с ужомDialog с Natural Language Classifier. Причём тут Токио? А при наличии возможности определить его как сущность типа «город» в dialog и сохранить в профиле для обработки. Впрочем, именно получения погоды под катом не будет. Однако, по идее, можно прицепить обработку соответствующей «команды».
Перед началом работы понадобится зарегистрироваться в Bluemix, создать приложение и получить учётные данные для Dialog и Natural Language Classifer. Само же приложение может быть локальным.