Элиза

Последнее обновление 00-12-23

Цель работы

Цель работы - изучение основных способов хранения правил (способы представления знаний нужно рассмотреть до лабораторных работ).

Задание

Создать программу типа "Элиза", ведущую диалог с пользователем. Продукции должны считываться из внешнего (по отношению к программе) текстового файла.

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

Пояснения

Нетрадиционную психотерапевтическую методику под названием "вербальное зеркало пациента" предложил психотерапевт Карл Роджерс. Врач начинает беседу с выяснения тревог пациента, и повторяя некоторые слова (отражая их как в зеркале) слегка направляет беседу в нужное русло, сам терапевт при этом остается как бы в тени. Есть надежда, что такой диалог "включит" у пациента внутренние модели сопоставления, которые приведут его в состояние душевного равновесия.

Программы подобного типа имеют свою историю в развитии искусственного интеллекта. Первой была "Элиза" (ELIZA), созданная Джозефом Вейнцбаумом. Одной из последних - "Алиса", победившая в 1999 году на турнире в Австралии. В турнире участвуют как люди, так и программы. Люди упорядочивают собеседников по тому, насколько они похожи на людей. Побеждает та программа, которая ведет диалог, наиболее похожий на человеческий. В интернете попадается русская программа ChatMaster, которая при ведении диалога использует не одну а несколько предыдущих фраз.

Говорят, что именно эти программы дали толчек к развитию методики, описанной в начале параграфа.

Как работает Элиза? Машина начинает диалог с фразы: "расскажите, в чем заключается ваша проблема". (Или с любой другой.)

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

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

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

Более поздние программы запоминают проведенные диалоги и используют фразы из сохраненных диалогов при своих ответах.

Соображения по написанию программы

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

Работа с базой знаний

Во-первых, нужно придумать формат базы знаний (файла, в котором будут храниться ключевые слова и фразы-ответы). Простейший вариант - каждое правило хранится в отдельной строке, до первого пробела находится ключевое слово, а после первого пробела до конца строчки - фраза-ответ. При этом ключевые слова типа "IF", "DO", "PRINT" подразумеваются, но не вносятся в файл.

отец Расскажите о приятных воспонинаниях своего детства, связанных с Вашим отцом.
ужасн Я не люблю слово "ужасная", оно так надоело в рекламе.
соглас Хорошо, когда люди думают одинаково.
...


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

Во-вторых, нужно написать модуль, отвечающий за работу с базой знаний. В этом модуле следует определить формат хранения правил в памяти (в простейшем случае - массив структур, хранящих пары строк "вопрос-ответ") и реализовать подпрограммы (в простейшем случае одну - считывание файла в память) для работы с правилами. Целесообразно придумать интерфейс, через который остальные части программы будут общаться с данным модулем. Отдельный модуль целесообразно писать даже в случае использования для хранения правил готовой БД, так как это позволяет писать другие части программы не завязываясь на конкретную реализацию модуля для работы с базой знаний.
(Те, кто знаком с курсами "системное программирование, основы конструирования компиляторов" (этот курс читает Жидаков), для считывания базы знаний из файла могут воспользоваться системами Lex и YACC.)

Интерфейс с пользователем

На этом этапе нужно придумать интерфейс для взаимодействия с пользователем. В простейшем случае можно воспользоваться стандарнтыми библиотеками для ввода-вывода из/в стандартные потоки операционной системы. Оптимальным, на мой взгляд, интерфейсом будет форма, в основной части которой отображается диалог (последние фразы), а в нижней части строка для ввода фраз человеком (пример - программа ChatMaster на www.freesoft.ru).
(Другим вариантом является форма с двумя окнами. В одном окне пишет человек, в другом программа. Этот вариант позволит вести параллельный диалог (пример - програма T-Mail), но это для более продвинутых программистов, которые способны запрограммировать обдумывание разговора в отдельном потоке вычислений.)

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

Машина логического вывода

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

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

Выводы

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

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

Смежные темы

Силмер Брингсйорд, профессор философии из Ренселарского политехнического института, и ученый Дэвид Феррачи из исследовательского центра IBM давно ведут работы над программой - интеллектуальным рассказчиком. С результатом их трудов - системой Brutus.1 можно познакомиться на сайте www.rpi.edu/dept/ppcs/BRUTUS/brutus.html. Brutus.1 генерирует рассказы объемом около 500 слов на тему любви и измены.

В этой связи можно отметить книгу ленинградского ученого В. Проппа "Морфология сказки", вышедшую еще в 1928 г. В ней были формально описаны все сказочные сюжеты. Впоследствии на основе этой книги было создано немало программ, автоматически составляющих сказочные тексты произвольной длины.