В статье представлен алгоритм эвристической сети по некоторым свойствам аналогичный рекуррентной нейронной сети для программы виртуального собеседника. Алгоритм усовершенствован с использованием толкового словаря русского языка. В эвристическую сеть внедрен генератор новых ответов на базе статистической информации базы знаний.

Введение


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

Часто в понимании входящих вопросов пользователей сеть ограничена в небольшой базе знаний, поэтому актуально внедрение толкового словаря русского языка для отображения исходных слов в слова значения возможно содержащихся в вопросах базы знаний.

Алгоритм эвристической сети внедрен в новые режимы программы ChatBot, созданной ранее c использованием AIML разметки базы знаний [2].

Рекуррентная нейронная сеть


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

  1. статистическая связь вопросов и ответов в базе знаний,
  2. взаимозаменяемость слов,
  3. генерация новых текстов.

Поскольку при обучении рекуррентной нейронной сети на больших объемах данных часто возникает проблема перезаписи и некачественного обучения возможно реализовать основные свойства рекуррентной нейронной сети в виде эвристик.

Эвристическая сеть


Свойство статистической связи вопросов и ответов в базе знаний и выбор подходящего ответа из базы знаний на пользовательский вопрос может быть реализовано на базе следующего алгоритма:

  1. Все вопросы в базе знаний обозначим словом patterns.
  2. Соответствующие им ответы в базе знаний словом templates.
  3. Каждый вопрос и соответствующий ответ разбивается на массив слов: pwords и twords.
  4. Высчитываются корреляции между уникальными словами:
    Если слово tword встречается в массиве слов вопроса twords вместе со словом pword в массиве слов ответа pwords, тогда функции корреляции между словами tword и pword прибавляется 1:
    $R\left(tword,pword\right)$ += 1.
  5. Новый пользовательский вопрос обозначим словом question.
  6. Пользовательский вопрос разбивается на слова qwords.
  7. Осуществляется перебор ответов templates из базы знаний с целью найти максимум суммы корреляций между словами из ответа twords и словами пользовательского вопроса qwords:
    $\mathop{\max }\limits_{k} \left[\sum _{i}\sum _{j}R\left(twords_{k} [i],qwords[j]\right) \right]$, где индекс k пробегает по всем ответам templates в базе знаний, i и j ? индексы слов в массивах слов.
  8. Чтобы уменьшить влияние часто встречаемых слов, поиск максиму можно ограничить из сумм не больших определенного порога porog.

Приведем пример свойства взаимозаменяемости слов при поиске ответа на пользовательский вопрос. Например, такая AIML структура в базе знаний:

<category>
	<pattern>Ты любишь мир?</pattern>
	<template>
		<random>
			<li>Да люблю</li>
		</random>
	</template>
</category>
	
<category>
	<pattern>Я люблю мир</pattern>
	<template>
		<random>
			<li>В мире полно женщин</li>
		</random>
	</template>
</category>

Должна приводить к ответу «Да люблю» на пользовательский вопрос «Ты любишь женщин?». Т.е. слова «мир» и «женщин» становятся взаимозаменяемыми.

Соответствующий алгоритм учета взаимозаменяемости слов из базы знаний может быть реализован в следующей форме:

  1. Вводится внутренняя функция корреляции между словами:
    Для этого слова из массива слов вопроса pwords и ответа twords базы знаний объединяется в массив ptwords.
    Вводится функция
    $r_{k} \left(ptwords[i],ptwords[j]\right)=\frac{\beta}{j-i} $, где j > i,
    $\beta =\left\{\begin{array}{c} {1,\begin{array}{ccc} {} & {если} & {i,j\le g\begin{array}{ccc} {} & {и} & {i,j\ge g} \end{array}} \end{array}} \\ {0.25,\begin{array}{ccc} {} & {если} & {\begin{array}{ccc} {} & {i\le g} & {\begin{array}{ccc} {} & {и} & {j\ge g} \end{array}} \end{array}} \end{array}} \end{array}\right. $,
    g ? длина массива pwords.
    Тогда функция внутренней корреляции между словами $R_{in}\left(tword,pword\right)$ определяется либо как сумма функций $r_{k}$, либо как их максимум, либо как их среднее по всем категориям из базы знаний.
  2. Для слова qword из пользовательского вопроса выбираются все слова ptword, коррелирующие с ним по функции $R_{in}\left(qword,ptword\right)$. На выбор ответа из базы знаний на пользовательский вопрос влияет с коэффициентом ? максимум суммы функций внутренней корреляции между словами $R_{in}\left(qword,ptword_{k}\right)$, где индекс k пробегает по всем парам вопрос плюс соответствующий ответ из базы знаний.

Генерация нового текста может быть реализована с помощью следующего алгоритма:

  1. Задается число влияющих слов k.
  2. Подается на вход k слов $\left\{i_{1} ,i_{2} ,\ldots ,i_{k} \right\}$ и для них ищется новое слово s с наибольшей суммой $\sum _{j=1}^{k}\frac{1}{k-j+1}R_{in} \left(s,i_{j} \right)$. Функция $R_{in}$ должна учитывать, что слово s стояло в предложении раньше слова $i_{j}$. Функция $R_{in}$ просчитывается на предложениях типа $pattern_{i}$ + « » + $template_{j}$ + « __end__», где $pattern_{i}$ и $template_{j}$ взяты из одной категории, а слово «__end__» символизирует конец обучающего предложения.
  3. После того как найдено новое слово s, k входящих слов заменяется на слова $\left\{i_{2} ,\ldots ,i_{k} ,s\right\}$ и ищется новое слово по шагу 2.
  4. Процесс поиска новых слов завершается когда найдено слово «__end__», либо начинается повторения последовательности слов (последовательности типа 1, 2, 3, 4, 5, 4, 5), либо превышено необходимое число слов d.

Алгоритм генерации нового текста напоминает алгоритм на цепи Маркова. Отличие здесь в использовании функции корреляций между словами, вместо вероятностей переходов, а также функции суммы корреляций вместо условных вероятностей для цепей k-го порядка.

Внедрение толкового словаря


Когда в пользовательском вопросе встречаются слова, которых не было в базе знаний, оказывается возможным использование толкового словаря русского языка по следующему алгоритму:

  1. Составить базу определений слов из толкового словаря.
  2. Развернуть все слова из пользовательского вопроса по определениям. Т.е. вместо каждого слова из пользовательского вопроса взять наборы слов из определений.
  3. Все слова найденные в вопросе pattern из базы знаний и соответствующие словам пользовательского вопроса оценить по коэффициенту, например, 100. Все слова пользовательского вопроса соответствующие 1-му уровню определений оценить по коэффициенту, например, 50.
  4. Найти суммы таких оценок и выбрать такой вопрос pattern из базы знаний, который набрал максимум.
  5. Ответ template из базы знаний, соответствующий найденному вопросу pattern, взять за ответ на пользовательский вопрос.

Морфологический анализатор


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

Программная реализация


Программа чат бота была реализована в качестве Android приложения с возрастным ограничением 18+. В приложении доступны несколько новых режимов чат бота на базе эвристической сети.
В качестве морфологического анализатора была использована свободная JavaScript-библиотека для обработки текстов на русском языке Az.js.

Приложение доступно по адресу https://play.google.com/store/apps/details?id=svlab.chatbot2.

Заключение


Программно реализованы режимы чат бота на базе эвристической сети имитирующей свойства рекуррентной нейронной сети. Преимуществом эвристической сети является быстрое обучение на базе индексации и возможность простого добавления новых знаний в структуру сети. Алгоритм усовершенствован с помощью толкового словаря русского языка для слов не представленных в базе знаний. Приложение ChatBot доступно для платформы Android в Play Маркете.

Литература


  1. Oriol Vinyals, Quoc Le A Neural Conversational Model // arXiv preprint arXiv:1506.05869, 22 Jul 2015.
  2. Шовин В.А. Программа СhatBot — чат-бот или виртуальный собеседник. // Математические структуры и моделирование. 2016. № 4 (40). С. 96-101.
Поделиться с друзьями
-->

Комментарии (8)


  1. ashurkinam
    22.02.2017 01:08

    Кроме Android где-то можно потестировать?


    1. vladshow
      22.02.2017 01:29

      Ограниченное по функциям приложение тут:
      http://svlaboratory.org/application/chatbot2


      1. SimSonic
        22.02.2017 16:08

        Немного (сильно) бредовато отвечает. Осмысленного разговора не получилось =(


  1. ServPonomarev
    22.02.2017 08:16

    Основа описанного алгоритма — «корреляция» между словами, а по факту — их взаимозаменяемость.

    Я в своё время делал следующее:

    Собирал базу диалогов из художественной литературы, после чего обрабатывал их в вид:

    Q_Ты Q_любишь Q_женщин А_Да А_люблю

    Пара вопрос-ответ составляет одну строку обучающего файла. На обучающий файл натравливается Word2Vec, который устанавливает взаимозаменяемость и ассоциативность между словами вопроса и ответа. Так, очевидно из примера, что «Q_любишь» и «А_люблю» будут иметь хорошую дистанцию, поскольку в примерах часто фигурируют вместе.

    Разумеется, у меня не такой простой способ кодирования был, поскольку я аналогичным образом делал разметку по позиции слова в вопросе/ответе (что позволяет выучивать синтаксис и типовые грамматические конструкции, при наличии достаточной обучающей базы, разумеется).

    В целом, результаты забавные именно с точки зрения «болталки». Но я их использовал не в чистом виде, а для ранжирования подготовленных другими методами вариантов ответной реплики. Поскольку предложенный способ позволяет легко вычислять дистанцию между вопросами/ответами и выбирать вариант ответа с наилучшей дистанцией.


  1. Ikors
    22.02.2017 16:08

    Вот только при чём тут рекурентные сети? Приведённый алгоритм, насколько я могу судить, никакого отношения к ним не имеет.


    1. vladshow
      22.02.2017 16:09

      Данный алгоритм имитирует поведение рекуррентной нейронной сети для программы чат бот


      1. Ikors
        22.02.2017 16:34
        +1

        Что вы под этим имеете в виду? Вы решаете задачу совершенно другим методом, поэтому мне не понятно, в каком смысле тут вообще можно говорить об имитации.


        1. vladshow
          22.02.2017 16:50

          Если представить рекуррентную сеть как черный ящик, и проанализировать лишь поведение рекуррентной сети, т.е. то как она отвечает и генерирует новый текст.

          Рекуррентная сеть для имитации речевого общения обладает рядом свойств:
          статистическая связь вопросов и ответов в базе знаний,
          взаимозаменяемость слов,
          генерация новых текстов.

          Данный алгоритм имитирует поведение рекуррентной нейронной сети, при этом структура алгоритма отличается.