Библиографическое описание:

Кабедева И. Г. Эталонные списки и метод сопоставления с образцом для организации диалога на естественном языке при изучении декларативного языка Пролог // Молодой ученый. — 2013. — №10. — С. 72-74.

Курс «Логическое программирование. Язык программирования Пролог», как правило, предшествует изучению курса «Введение в искусственный интеллект». Поэтому при знакомстве с основами декларативного языка Пролог важно практически показать связь между этими двумя темами.

Многие системы искусственного интеллекта, в частности, экспертные системы, работают в интерактивном (диалоговом) режиме, т. е. обмениваются информацией и выводами с пользователем в форме диалога. Интеллектуальная программа может принимать вводимые данные в свободной форме — в виде простых предложений. Считается, что такая программа ведёт диалог на естественном языке.

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

Для «понимания» системой информации, введённой на естественном языке, можно использовать так называемые эталонные списки и метод сопоставления с образцом.

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

Работа с эталонными списками позволяет анализировать текст, введённый пользователем на естественном языке, на наличие в нём ключевых слов. Анализ осуществляется путём проверки вхождения лексем введённого текста в эталонные списки, состоящие из ключевых слов (метод сопоставления с образцом). Для выполнения этих операций необходимо уметь строить списки из лексем введённого текста, работать со статическими и динамическими базами данных из фактов, осуществлять проверку на вхождение лексем одного списка в другой, строить новые списки.

Для решения задачи построения списка из лексем введённого текста можно использовать стандартный предикат fronttoken(Строка, Лексема, Остаток) и метод обобщённого правила рекурсии (ОПР).

Пример 1. Построить список из лексем введённого текста.

Фрагмент программы.

do: — write(“Введите текст ”), readln(Text), spisok_leksem(Text, Spisok), write (“Список: ”, Spisok),nl.

spisok_leksem(“”, []). % граничное условие

spisok_leksem(Text, [H|T]):- fronttoken(Text, H, Ost), spisok_leksem(Ost, T).

% рекурсивное правило

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

Пример 2. Проверка на вхождение элементов одного списка в другой.

Фрагмент программы.

proverka ([H|_],X):- prinadl (H,X),!. /* граничное условие рекурсии */

proverka ([_|T], X):- proverka(T,X). /* рекурсивное правило */

prinadl (X, [X|_]):_!. /* граничное условие рекурсии */

prinadl (X, [_|T]):- prinadl (X,T). /* рекурсивное правило */

Умение выполнять эти операции со списками позволяет организовать диалог программы с пользователем на естественном языке.

Предположим, пользователю последовательно задаются вопросы, ответы на которые позволят распознать вид животного. Программа содержит список вопросов для распознавания вида животного, каждый из которых последовательно задаётся пользователю. После вывода очередного вопроса пользователь вводит ответ на заданный вопрос, который добавляется в список ответов. Последовательный вывод вопросов и построение списка из ответов можно организовать рекурсивно с помощью одного предиката vopros_otvet (список из вопросов, список из ответов).

Пример 3. Вывод вопросов, находящихся в списке, и построение списка из введённых ответов.

Фрагмент программы.

vopros_otvet ([], [])./* граничное условие рекурсии */

vopros_otvet ([H|T], [H1|T1]):- write(H, «»), readln(H1), vopros_otvet (T,T1).

/* рекурсивное правило */

Для определения названия вида животного, соответствующего введённым признакам, программа имеет статическую базу данных из предикатов типа animal(название вида животного, список ответов о признаках). Например,

animal(заяц, [лес,трава]).

После построения списка из ответов строится список из названий тех животных, которые будут найдены стандартным предикатом findall() путём сопоставления построенного списка из ответов (образец) со списками из ответов о признаках в базе данных фактов animal(название вида животного, список ответов о признаках).

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

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

Пример 4. Изменение списка из ответов, в результате которого строится новый список из «урезанных» до четырёх символов лексем.

Фрагмент программы.

new_sp ([], [])./* граничное условие рекурсии */

new_sp ([H|T], [H1|T1]):- frontstr(4, H, H1,_), new_sp (T,T1).

/* рекурсивное правило */

В качестве второго примера можно рассмотреть программу, которая предназначена для поддержания диалога с «пациентом» в стиле тех психологов, которые ведут себя как «вербальное зеркало пациента» [4]. Беседа начинается с выяснения тревог последнего, но сам врач должен оставаться как бы в тени. Ему достаточно лишь повторять слова пациента (отражая их, как в зеркале) и слегка направлять беседу в нужное русло. Такой диалог «включает» у пациента внутренние модели сопоставления, которые приведут его в состояние душевного равновесия. Программа иллюстрирует, как с помощью небольшой структуры можно создать иллюзию взаимопонимания.

Программа начинает диалог с фразы: «Расскажите, в чём заключается ваша проблема». Затем она получает ответ пациента и строит дальнейшее взаимодействие на основе некоторых образцов, которые содержатся в собранных предложениях (эталонных списках), т. е. работает по методу сопоставления с образцом.

Например.

Образец из предложения Ответ программы

Я испытываю … Сколько времени вы это испытываете≤

… гнев… А что Вы испытываете сейчас≤

…мать… Расскажите подробнее о своей семье.

… любовь… Вас пугают эмоции≤

В тех случаях, когда в ответе пациента программа не находит ключевых слов, может последовать текст: «Расскажите поподробнее».

Список образцов можно продолжить для придания ему большей правдоподобности.

Структура программы может быть следующей. Функция, управляющая ходом выполнения программы, устанавливается правилом, согласно которому от пациента поступает предложение и формируется ответ, а затем цикл повторяется (например, предикат do).

Главное правило do, управляющее ходом программы, задаёт главный вопрос «пациенту», строит список из лексем ответа sp_leksem(ответ, список из лексем), затем проверяет, в какой из эталонных списков попадают лексемы из ответа пациента proverka(список из лексем).

Предикат proverka(список из лексем) изучает (перебором) все имеющиеся эталонные списки etalonN(список из ключевых слов) на предмет принадлежности лексем списка из ответа «пациента» эталонному списку, и в случае успеха, задаёт следующий вопрос, соответствующий этой группе ключевых слов. Эталонные списки могут иметь следующий вид: etalon1([«любовь», «страх», «гнев», «радость», «печаль»]).

Для организации повторения в программе можно использовать предикат repeat — правило, расставляющее точки отката.

repeat.

repeat:-repeat.

Для возврата в точки отката правило do должно заканчиваться предикатом fail.

Для хранения вопросов, задаваемых пациенту, можно создать статические или динамические базы данных (БД) из вопросов. Динамические БД должны быть созданы до того, как «пациент» ввёл свой первый ответ.

Можно создать несколько динамических баз данных (БД) из вопросов (например, по три вопроса) по каждой из изучаемых областей. Например, dvopros_family(“Расскажите подробнее о Вашей семье”), dvopros_family(“Какие у Вас отношения с Вашей мамой≤ ”) и т. д.

В случае совпадения одной из лексем ответа «пациента» с ключевым словом какого-то из эталонных списков (например, по теме «Семья»), задаётся вопрос, находящийся в динамической БД, именно по этой теме.

Чтобы, в случае неоднократного совпадения одной из лексем ответа «пациента» с ключевыми словами какого-то из эталонных списков, задавались разные вопросы по этой теме, можно после того, как вопрос будет задан, удалить его из динамической БД. Таким образом, в следующий раз будет задан следующий вопрос из этой области.

Приведённые примеры достаточно убедительно демонстрируют, как довольно простыми способами можно проиллюстрировать возможности организации диалога на естественном языке средствами декларативного языка Пролог.

Литература:

1.  Адаменко А., Кучуков А. Логическое программирование и Visual Prolog. — С-Птб, “БХВ-Петербург”, 2003.

2.  Боровская Е. В., Давыдова Н. А. Основы искусственного интеллекта: Учебное пособие. — М., БИНОМ. Лаборатория знаний, 2010.

3.  Братко И. Программирование на языке Пролог для искусственного интеллекта. — М., «Мир», 1990.

4.  Марселлус Д. Программирование экспертных систем на Турбо — Прологе. — М., «Финансы и статистика», 1994.

5.  Шрайнер П. А. Основы программирования на языке Пролог: Курс лекций. Учебное пособие. — Интернет-Университет информационных технологий, М., 2005.

Обсуждение

Социальные комментарии Cackle