Партнеры

Счетчики






Примитивный диалог-бот на Builder 5

Немного истории

Диалоговый бот это программа ведущая (осмысленный?!) диалог с человеком, на какую либо тему. Слово бот окончание слова робот. Первые такие программы появились примерно в 70-х годах 20 века. И создавались почти всегда в развлекательных целях. Первой была "Элиза" (ELIZA), созданная Джозефом Вейнцбаумом еще в 1965 году. У нас в России первой такой программой, наверно, была "Диала" (1985 год) созданная для ЭВМ EC-1022, EC-1033, EC-1060. А в1994 году была полностью переделана и перенесена на IBM PC.

На сегодняшний день замечена тенденция использования таких программ. В Internet не редко можно увидеть так называемые Роботчаты программы, которые постоянно висят в каком либо чате и следят за диалогами людей, при необходимости вмешиваясь (например, лишая слова кого либо за нецензурные слова). С ними часто можно общаться, получая от этого удовольствие. На сайте Хабаровской ТТС есть свой чат, где и сидит пример такого бота, можете посмотреть (http://www.khv.ru/). Программы сортировки и фильтрации электронной почты основаны на тех же принципах, что и диалоговые боты. Поэтому с развитием Internet открываются большие перспективы в этой области.

Немного теории.

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

Аналогичная ситуация и с диалоговыми ботами. У программы имеется ассоциативная база знаний, в которой храниться образец запроса от пользователя и образец ответа на это запрос. Естественно, что чем больше таких образцов тем, более качественный диалог получится в итоге (впрочем, как и у людей, гораздо интересней общаться с образованным, много знающим человеком, чем наоборот). Такие образцы называют прецидентами.

Рассмотрим пример такой программы написанной на Builder 5

Базу знаний будем хранить в двух символьных массивах Basa[16][2] и Prosto[5].

Basa ассоциативная база знаний формат которой:

[образец запроса 1] [ответ на данный запрос]

… … … … … … … …

[образец запроса 16] [ответ на данный запрос]

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

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

AnsiString Basa[16][2]= //база знаний

{

"ЗАНИМАЕШ", "Резвлекаюсь",

"ГОВОРИМ", "А что сейчас мы делаем?",

"ПРОГРАМ", "В программах я не разбираюсь, а ты?",

"ДОСВИДА", "Ну поговори со мной еще немного, а то скучно...",

"АНЕКДОТ", "Ой, такого я не знаю, расскажи сам...",

"ПРИВЕТ", "Привет! как жизнь?",

"ПОЧЕМУ", "Да откуда же мне знать?",

"СКОЛЬК", "Да я точно не знаю, но думаю мало...",

"ЖИЗНЬ", "Вот у меня жизнь сплошная скука, а у тебя?",

"ЗОВУТ", "Меня не зовут, меня просто запускают, я ведь программа",

"ДЕЛАЕ", "С тобой разговариваю...",

"ЗНАЕ", "Я всеголишь программа, как я могу много знать?",

"ПОКА", "Ты ко мне еще зайдешь?",

"КАК ", "Как обычно...",

"ЛЕТ", "Зачем тебе это",

"?","Не знаю...",

};

AnsiString Prosto[5]= //база не знаний

{"Да откуда ты на мою голову?",

"Погоди, ты хоть знаешь о чем речь?",

"Скучно как то...",

"Расскажи лучьше анекдот",

"Обижаешь начальник",};

 

TForm1 *Form1;

//функция осуществляющая понимание реплики пользователя

int __fastcall Unde(AnsiString ForMe)

{ ForMe=ForMe.UpperCase(); //приведение к верхнему регистру

for (int i=0 ; i<=16; i++) //цикл поиска в базе

{ if (ForMe.Pos(Basa[i][0])) return i; //сравнение имеющегося и поступившего

} //если найдено, возвратить индекс ответа на реплику в массиве

return -1; //ничего в базе по этому поводу нет, возвратить отрицательный рез-т.

}

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{}

//---------------------------------------------------------------------------

void __fastcall TForm1::BitBtn1Click(TObject *Sender)

{int Res=-1;

randomize();

Res=Unde(Edit1->Text); //понимание того что ввел пользователь

if (Res>=0) //понял хорошо

{ Edit2->Text=Basa[Res][1]; //выдаем ответ

Form1->Caption=Basa[Res][0]; //выдаем ассоциативный образец

}

if (Res==-1) //ничего не поняли

{Res= random(5);

Edit2->Text=Prosto[Res]; //случ. Образом выдаем из универсальной базы

}

Edit1->Clear();

}

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


Источник: http://itsprogs.chat.ru/Read/prbot.htm (Напиши прогу сам)
Hosted by uCoz