На сегодняшний день остается актуальным создание программ имитирующих общение человека. Простейшей моделью общения является база вопросов и ответов к ним [1]. В данном случае возникает проблема описания базы знаний и реализация программы интерпретатора. Язык разметки базы знаний может включать в себя паттерны вопросов и соответствующие им шаблоны ответов, также предысторию диалогов к ним и название соответствующей темы общения.
Чат бот может выполнять дополнительные функции, например, такие как поиск музыки, картинок, фактов, калькулятор, прогноз погоды, вывод курса валют. Большинство таких функций имеют реализацию в интернете и доступны в качестве внешнего API.
Альтернативным вариантом создания программы виртуального собеседника является использование алгоритмов машинного обучения на базе диалогов общения, именно искусственные нейронные сети. Подходящей моделью ИНС является рекуррентная нейронная сеть, способная хранить, обобщать и прогнозировать различные последовательности. В данной работе в качестве элементов последовательности предлагается использовать индексы соответствующие словам в базе знаний вопросов и ответов.
Одним из форматов разметки базы знаний является стандарт языка разметки AIML (Artificial Intelligence Markup Language). Ключевыми словами в языке являются category, pattern и template:
Тег category является родительским к тегам pattern и template, хранящими шаблоны вопроса и ответов. Тег random позволяет указать несколько ответов к вопросу, выбираемые интерпретатором случайным образом. В работе предлагается ввести дополнительные теги соответствующие истории и теме разговора.
Несколько тегов pattern позволяют описать различные варианты вопросов, соответствующие данной категории, на которые должны последовать одни и те же варианты ответов. Тег history хранит историю диалога, предшествующую данному вопросу. Тег theme хранит название темы разговора. Данные теги позволяют интерпретатору подобрать паттерн вопроса соответствующий предыстории диалога и темы общения, что должно сказаться на улучшении качества имитации общения чат ботом.
Интерпретатор языка разметки должен позволять находить наиболее релевантные вопросы следующими дополняющими друг друга способами:
Соответствующий алгоритм выбора лучшего совпадения формируется на базе алгоритма сортировки:
В результате выбирается первый элемент отсортированного массива совпадений.
Для повышения качества поиска релевантных ответов в процедуру сравнения слов был внедрен модуль морфологического анализатора, позволяющий находить базовые формы слов. Тем самым сравнение происходит по базовым формам слов, что исключает несоответствия слов, связанные с их склонениями.
Предлагается использовать алгоритм определения названий тем категорий, когда определена лишь их часть.
Рекуррентная нейронная сеть – вид многослойного перцептрона у которого сигналы с нейронов выходного слоя поступают на дополнительные нейроны входного слоя, т.н. нейроны контекста.
Входной вектор сигнала поступает на группу нейронов INPUT, на группе нейронов CONTEXT нулевой сигнал. Далее сигнал распространяется в группу нейронов скрытого слоя HIDDEN, а затем преобразуется ими и попадает на нейроны выходного слоя OUTPUT. На следующей итерации вместе с вектором сигнала INPUT, на контекстную группу нейронов поступает копии сигналов с выходного слоя OUTPUT прошлой итерации (рис. 1).
Рис. 1. Общий вид структуры рекуррентной нейронной сети.
Структура рекуррентной нейронной сети для запоминания предложений имеет следующий вид:
Слой CONTEXT, INPUT и OUTPUT имеют по одному нейрону, значения сигнала на выходе которого ставится в соответствие индексу слова в наборе слов. Дополнительно вводится слово __end__ соответствующее концу предложения [2]. Сеть последовательно обучается предложениям вида:
«Привет. Как дела? __end__ Привет. Нормально. __end__»
Получение ответов на вопросы рекуррентной нейронной сетью происходит по следующей схеме (рис. 2).
Рис. 2. Получение ответа на вопрос рекуррентной нейронной сетью.
Объем слоев HIDDEN должен позволять запоминать весь набор предложений. Сеть обучается методом обратного распространения ошибки.
Программа чат бота была реализована в качестве Android приложения. В приложении доступно несколько режимов чат бота:
В качестве морфологического анализатора была использована свободная JavaScript-библиотека для обработки текстов на русском языке Az.js.
Для создания и обучения рекуррентной нейронная сети использовалась свободная JavaScript библиотека RecurrentJS.
Во всех режимах доступен автоперевод ответов на язык вопросов пользователя на базе сервисов Yandex Translate API и Bing Translate API. Также в качестве внешних сервисов используется сервис поиска картинок Custom Search API и Bing Image Search API. Поиск знаний реализован на базе Google Knowledge Graph Search API. Поиск музыки реализован на базе SoundCloud API. Калькулятор, прогноз погоды, курс валют, время реализованы на базе Wolfram|Alpha API.
Приложение ChatBot доступно в Google Play по адресу https://play.google.com/store/apps/details?id=svlab.chatbot.
Рассмотрены алгоритмы построения чат бота на базе расширенной разметки AIML и рекуррентной нейронной сети. Расширение разметки AIML включает в себя новые теги theme и history для более эффективного поиска релевантных вопросов и ответов в соответствии контексту диалога. Для определения названий тем категорий, когда определена лишь их часть предлагается использовать эвристический алгоритм классификации тем. Использование модуля морфологического анализатора отдельных слов и приведения их в базовую форму позволяет улучшить качество поиска релевантных ответов. Рекуррентная нейронная сеть позволяет получать ответы на вопросы, которых не было в базе знаний, с помощью способности сети к обобщению. Приложение ChatBot доступно для платформы Android в Play Маркете.
Чат бот может выполнять дополнительные функции, например, такие как поиск музыки, картинок, фактов, калькулятор, прогноз погоды, вывод курса валют. Большинство таких функций имеют реализацию в интернете и доступны в качестве внешнего API.
Альтернативным вариантом создания программы виртуального собеседника является использование алгоритмов машинного обучения на базе диалогов общения, именно искусственные нейронные сети. Подходящей моделью ИНС является рекуррентная нейронная сеть, способная хранить, обобщать и прогнозировать различные последовательности. В данной работе в качестве элементов последовательности предлагается использовать индексы соответствующие словам в базе знаний вопросов и ответов.
AIML
Одним из форматов разметки базы знаний является стандарт языка разметки AIML (Artificial Intelligence Markup Language). Ключевыми словами в языке являются category, pattern и template:
<aiml>
<category>
<pattern>Привет! Как дела?</pattern>
<template>
<random>
<li>Привет. Нормально.</li>
<li>Привет. Отлично. Как у тебя?</li>
</random>
</template>
</category>
</aiml>
Тег category является родительским к тегам pattern и template, хранящими шаблоны вопроса и ответов. Тег random позволяет указать несколько ответов к вопросу, выбираемые интерпретатором случайным образом. В работе предлагается ввести дополнительные теги соответствующие истории и теме разговора.
<aiml>
<category>
<pattern>Чем занимаешься?</pattern>
<pattern>Что делаешь?</pattern>
<template>
<random>
<li>Читаю книгу.</li>
<li>Смотрю телевизор.</li>
</random>
</template>
<history>Привет! Как дела? Привет. Нормально.</history>
<theme>Дела</theme>
</category>
</aiml>
Несколько тегов pattern позволяют описать различные варианты вопросов, соответствующие данной категории, на которые должны последовать одни и те же варианты ответов. Тег history хранит историю диалога, предшествующую данному вопросу. Тег theme хранит название темы разговора. Данные теги позволяют интерпретатору подобрать паттерн вопроса соответствующий предыстории диалога и темы общения, что должно сказаться на улучшении качества имитации общения чат ботом.
Интерпретатор языка разметки должен позволять находить наиболее релевантные вопросы следующими дополняющими друг друга способами:
- 1. Поиск по всей фразе вопроса на основе регулярного выражения.
- 2. Поиск по количеству совпадающих слов в вопросе и паттернах.
- 3. Поиск по совпадению текущей темы и темах категорий.
- 4. Поиск по количеству совпадающих слов в текущей предыстории разговора и предысториях категорий.
Соответствующий алгоритм выбора лучшего совпадения формируется на базе алгоритма сортировки:
sortMatches = allMatches.sort(function(a, b) {
if(a.pattern == inputText && b.pattern != inputText)
return -1;
if(b.pattern == inputText && a.pattern != inputText)
return 1;
if(a.matches < b.matches)
return 1;
if(a.matches > b.matches)
return -1;
if(a.theme == bot.theme && b.theme != bot.theme)
return -1;
if(b.theme == bot.theme && a.theme != bot.theme)
return 1;
if(a.historyMatches < b.historyMatches)
return 1;
if(a.historyMatches > b.historyMatches)
return -1;
return 0;
})
В результате выбирается первый элемент отсортированного массива совпадений.
Для повышения качества поиска релевантных ответов в процедуру сравнения слов был внедрен модуль морфологического анализатора, позволяющий находить базовые формы слов. Тем самым сравнение происходит по базовым формам слов, что исключает несоответствия слов, связанные с их склонениями.
Алгоритм классификации тем
Предлагается использовать алгоритм определения названий тем категорий, когда определена лишь их часть.
- 1. Пусть множество категорий в которых определены темы ? T. Множество категорий в которых темы не определены ? D. Элементам данных множеств ставится в соответствие объединение строк всех значений паттернов и шаблонов категории.
- 2. Вводится порог детерминации, например p = 70%.
- 3. Последовательно перебираются элементы множества D. Выбирается подмножество V элементов множества T, в котором p процент уникальных слов определен.
- 4. Если V пусто, то тема определяется строкой элемента множества D.
- 5. Если V не пусто, то выбирается элемент из V для которого отношение количества совпадающих уникальных слов к общему количеству уникальных слов в строке этого элемента максимально. Соответствующая тема данного элемента V определяется как тема элемента D.
Рекурентная нейронная сеть
Рекуррентная нейронная сеть – вид многослойного перцептрона у которого сигналы с нейронов выходного слоя поступают на дополнительные нейроны входного слоя, т.н. нейроны контекста.
Входной вектор сигнала поступает на группу нейронов INPUT, на группе нейронов CONTEXT нулевой сигнал. Далее сигнал распространяется в группу нейронов скрытого слоя HIDDEN, а затем преобразуется ими и попадает на нейроны выходного слоя OUTPUT. На следующей итерации вместе с вектором сигнала INPUT, на контекстную группу нейронов поступает копии сигналов с выходного слоя OUTPUT прошлой итерации (рис. 1).
Рис. 1. Общий вид структуры рекуррентной нейронной сети.
Структура рекуррентной нейронной сети для запоминания предложений имеет следующий вид:
Слой CONTEXT, INPUT и OUTPUT имеют по одному нейрону, значения сигнала на выходе которого ставится в соответствие индексу слова в наборе слов. Дополнительно вводится слово __end__ соответствующее концу предложения [2]. Сеть последовательно обучается предложениям вида:
«Привет. Как дела? __end__ Привет. Нормально. __end__»
Получение ответов на вопросы рекуррентной нейронной сетью происходит по следующей схеме (рис. 2).
Рис. 2. Получение ответа на вопрос рекуррентной нейронной сетью.
Объем слоев HIDDEN должен позволять запоминать весь набор предложений. Сеть обучается методом обратного распространения ошибки.
Программная реализация
Программа чат бота была реализована в качестве Android приложения. В приложении доступно несколько режимов чат бота:
- 1) на базе внешнего API www.pandorabots.com;
- 2) на базе оригинального обобщения языка AIML;
- 3) на базе рекуррентной нейронной сети.
В качестве морфологического анализатора была использована свободная JavaScript-библиотека для обработки текстов на русском языке Az.js.
Для создания и обучения рекуррентной нейронная сети использовалась свободная JavaScript библиотека RecurrentJS.
Во всех режимах доступен автоперевод ответов на язык вопросов пользователя на базе сервисов Yandex Translate API и Bing Translate API. Также в качестве внешних сервисов используется сервис поиска картинок Custom Search API и Bing Image Search API. Поиск знаний реализован на базе Google Knowledge Graph Search API. Поиск музыки реализован на базе SoundCloud API. Калькулятор, прогноз погоды, курс валют, время реализованы на базе Wolfram|Alpha API.
Приложение ChatBot доступно в Google Play по адресу https://play.google.com/store/apps/details?id=svlab.chatbot.
Заключение
Рассмотрены алгоритмы построения чат бота на базе расширенной разметки AIML и рекуррентной нейронной сети. Расширение разметки AIML включает в себя новые теги theme и history для более эффективного поиска релевантных вопросов и ответов в соответствии контексту диалога. Для определения названий тем категорий, когда определена лишь их часть предлагается использовать эвристический алгоритм классификации тем. Использование модуля морфологического анализатора отдельных слов и приведения их в базовую форму позволяет улучшить качество поиска релевантных ответов. Рекуррентная нейронная сеть позволяет получать ответы на вопросы, которых не было в базе знаний, с помощью способности сети к обобщению. Приложение ChatBot доступно для платформы Android в Play Маркете.
Литература
- 1. Провотар А.И., Клочко К.А. Особенности и проблемы виртуального общения с помощью чат-ботов // Научные труды Винницкого национального технического университета. 2013. № 3. С. 2.
- 2. Oriol Vinyals, Quoc Le A Neural Conversational Model // arXiv preprint arXiv:1506.05869, 22 Jul 2015.
Поделиться с друзьями
Комментарии (6)
J_K
30.06.2016 22:48>>Чат бот может выполнять дополнительные функции, например, такие как поиск музыки, картинок, фактов, калькулятор, прогноз погоды, вывод курса валют.
Это нонсенс! Чат-бот должен хорошо болтать! А искать и делать все остальное должны поисковые и прочие алгоритмы, которые, как вы верно заметили в следующем предложении, могут быть реализованы в виде внешних функций:
>>Большинство таких функций имеют реализацию в интернете и доступны в качестве внешнего API.vladshow
01.07.2016 07:18В приложении хотелось внедрить как можно больше функций помощника (аналог на iOS это Siri). В тоже время кто не любит в реальном общении обменяться музыкой и картинками. Тем более, что эти функции кажутся интересными и ими многие пользуются в приложении.
BlackMetal
Можно ли это всё привязать к Телеграм-боту?
vladshow
Думаю можно, а почему бы и нет.