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