IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> реализация ИИ, искуственный интелект
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 9
Пол: Мужской

Репутация: -  0  +


A.L.I.C.E., Элиза у кого нибудь исходники есть этих ботов? Если нет, то с чего посоветуете начать писать?

Добавлено через 5 мин.
вот она элиза, тупит сильно..

Код

{$M 16384,0,655360}
Program Eliza_AI; {Released to the Public Domain 4/22/93 by Ed T. Toton III}

{    This is a pascal implementation of the ever popular Eliza program.    }
{ I realize that this version is a bit larger and more complicated than    }
{ it needs to be, but it has some interesting features. You will want to   }
{ note that since the actual communication routine returns the output      }
{ by way of a string, you can add whatever interface you like. Right now   }
{ it is simply using standard DOS I/O channels, thus allowing it to work   }
{ through many BBS's, and on basically any system.                         }
{                                                                          }
{    Please distribute freely. Enjoy!                                      }
{                                                                          }

uses dos;

const
maxxx      =60;
max_keys   =400;

type
cluster_type=array[1..max_keys,1..2] of integer;
keyword_type=array[1..max_keys] of string[20];
response_type=array[1..600] of string[79];
strl        =string;

var
in_str,outstr:strl;
i,j,k,l,n,m,x:integer;
quit:boolean;
last_char:char;
maxx:byte;
name,questn:string;
cluster:^cluster_type;
keyword:^keyword_type;
responses:^response_type;
num_keys:integer;
regs:registers;


function ltrim(s1:string):string;
var      {removes spaces on left side of a string}
i:integer;
begin
while (length(s1)>0) and ((copy(s1,1,1)=' ') or (copy(s1,1,1)=#8)) do
   s1:=copy(s1,2,length(s1)-1);
ltrim:=s1;
end;


function rtrim(s1:string):string;
var      {removes spaces on right side of a string}
i:integer;
begin
while (length(s1)>0) and ((copy(s1,length(s1),1)=' ') or (copy(s1,length(s1),1)=#8)) do
   s1:=copy(s1,1,length(s1)-1);
rtrim:=s1;
end;


function btrim(s1:string):string;
begin    {removes spaces on both sides of a string}
btrim:=ltrim(rtrim(s1));
end;


function lstr(s1:string; l:integer):string;
begin    {returns left end of string, length l}
if length(s1)<=l then lstr:=s1
                  else lstr:=copy(s1,1,l);
end;


function rstr(s1:string; l:integer):string;
begin    {returns right end of string, length l}
if length(s1)<=l then rstr:=s1
                  else rstr:=copy(s1,length(s1)-l+1,l);
end;


procedure getkey(var c:char);
begin     {read a single key from DOS}
with regs do
   begin
    ax:=$0800;
    msdos(regs);
    c:=chr(ax and $00ff);
   end;
end;


procedure prompt(i:strl);
var       {output string one character at a time}
c:integer;
begin
for c:=1 to length(i) do
   write(i[c]);
end;


procedure nl;
begin     {carriage return+line feed}
prompt(chr(13)+chr(10)); x:=1;
end;


function timer:real;
var      {Time of day in seconds}
h,m,s,t:word;
begin
GetTime(h,m,s,t);
timer:=h*3600+m*60+s+t/100;
end;


Function ucase(s:string):string;
var      {turn a string to all CAPS}
i:integer;
begin
if length(s)>=1 then
   for i:=1 to length(s) do
    s[i]:=upcase(s[i]);
ucase:=s;
end;


Function lcase(s:string):string;
var      {turn a string to all lower case}
i:integer;
begin
if length(s)>=1 then
   for i:=1 to length(s) do
    if (ord(s[i])>=65) and (ord(s[i])<=90) then s[i]:=chr(ord(s[i])+32);
lcase:=s;
end;


procedure _input(var i:strl; ml:integer; up,echo,x:boolean);
var       {read in a string from keyboard. ml=Max-Length
                                           up=uppercase input
                                           echo=show to screen what's typed?
                                           x=show only X's, for passwords etc}
  cp:integer;
  c:char;
  r:real;
begin
     r:=timer;
     cp:=1;
     repeat
      getkey(c);
      if c=#1 then r:=timer;
      if up then c:=upcase(c);
      if (c>=' ') and (c<chr(127)) then
       if cp<=ml then
        begin
         i[cp]:=c;
         cp:=cp+1;
         if echo then
          if not x then prompt(c)
             else prompt('X');
        end
       else
      else
       case ord(c) of
         8:if cp>1 then
            begin
             c:=chr(8);
             if echo then prompt(#8#32#8);
             cp:=cp-1;
            end;
        24:while cp<>1 do
            begin
             cp:=cp-1;
             if echo then prompt(#8#32#8);
            end;
       end;
     until (c=#13) or (c=#14);
     i[0]:=chr(cp-1);
end;



procedure print(s:string);
          {print a string using word-wrap}
var
i,j,k,l,n:integer;
lo:longint;
begin
    i:=1; l:=0; k:=i;
    repeat
     j:=0; k:=i;
     repeat
      inc(k); inc(j);
     until (k>length(s)) or (s[k]=#32);
     lo:=maxx; lo:=lo-x; lo:=lo-1;
     if j>lo then
       begin
         nl; x:=1;
       end;
     for n:=i to i+j-1 do
      begin
       if (last_char in ['-','.',',','?','!',';',':']) and
          (s[n] in ['a'..'z']) and (n=1) then s[n]:=chr(ord(s[n])-32);
       if (x<>1) or (s[n]<>#32) then prompt(s[n]);
       inc(x);
       if s[n]<>' ' then last_char:=s[n];
      end;
     i:=i+j;
    until i>=length(s);
    prompt(' '); inc(x);
end;




function get_input:strl;
         {Get a sentence, keep doing so until something is actually typed}
var
s:strl;
begin
repeat
   prompt('>');
   _input(s,75,false,true,false); nl;
   get_input:=s; s:=btrim(s);
until s<>'';
end;



procedure reverse(var s:strl);
          {conjugate a string}
var
i,k:integer;
begin
i:=0;
while i<length(s) do
  begin
   inc(i);
   if ucase(copy(s,i,5))=' I''M '        then begin s:=lstr(s,i-1)+' you''re'    +rstr(s,length(s)-(i+1)); inc(i); end;
   if ucase(copy(s,i,6))=' I AM '        then begin s:=lstr(s,i-1)+' you are'    +rstr(s,length(s)-(i+2)); inc(i); end;
   if ucase(copy(s,i,8))=' YOU''RE '     then begin s:=lstr(s,i-1)+' I''m'       +rstr(s,length(s)-(i+4)); inc(i); end;
   if ucase(copy(s,i,9))=' YOU ARE '     then begin s:=lstr(s,i-1)+' I am'       +rstr(s,length(s)-(i+5)); inc(i); end;
   if ucase(copy(s,i,6))=' AM I '        then begin s:=lstr(s,i-1)+' are you'    +rstr(s,length(s)-(i+2)); inc(i); end;
   if ucase(copy(s,i,9))=' AREN''T I '   then begin s:=lstr(s,i-1)+' aren''t you'+rstr(s,length(s)-(i+5)); inc(i); end;
   if ucase(copy(s,i,9))=' ARE YOU '     then begin s:=lstr(s,i-1)+' am I'       +rstr(s,length(s)-(i+5)); inc(i); end;
   if ucase(copy(s,i,12))=' AREN''T YOU 'then begin s:=lstr(s,i-1)+' aren''t I'  +rstr(s,length(s)-(i+8)); inc(i); end;
   if ucase(copy(s,i,3))=' I '           then begin s:=lstr(s,i-1)+' you'        +rstr(s,length(s)-(i-1)); inc(i); end;
   if ucase(copy(s,i,5))=' YOU '         then begin s:=lstr(s,i-1)+' me'         +rstr(s,length(s)-(i+1)); inc(i); end;
   if ucase(copy(s,i,4))=' ME '          then begin s:=lstr(s,i-1)+' you'        +rstr(s,length(s)-(i+0)); inc(i); end;
  end;
end;




procedure load_stuff;
          {load the keywords and responses}
var
f:text;
s1,s2:string;
i,j,k,l,n:integer;
begin
num_keys:=0;
for i:=1 to max_keys do
  for k:=1 to 2 do
   cluster^[i,k]:=0;
assign(f,'Eliza.dat');
reset(f); i:=0; j:=0; k:=0; l:=0;
while not eof(f) do
  begin
   inc(i);
   repeat
    readln(f,s1);
    s1:=btrim(ucase(s1));
    if s1<>'!' then
     begin inc(j); keyword^[j]:=s1; cluster^[j,1]:=k+1; inc(num_keys); end;
   until s1='!';
   repeat
    readln(f,s1);
    s1:=btrim(ucase(s1));
    if s1<>'.' then
     begin inc(k); responses^[k]:=s1; end;
   until s1='.';
   for n:=l+1 to j do
    cluster^[n,2]:=k;
   l:=j;
  end;
close(f);
end;



function clip(s:strl; l:integer):strl;
         {remove l characters from left end of a string}
begin
clip:=rstr(s,length(s)-l);
end;



Procedure punctuate(var s:strl);
          {check for punctuation, if none then add it}
begin
if not (s[ord(s[0])] in ['.','?','!']) then s:=s+'.';
s:=s+' ';
end;




function find_word(s1,s2:string):boolean;
         {find word s1 in string s2}
var
i,j,k,l,n,m:integer;
ok:boolean;
begin
s2:=btrim(ucase(s2)); s1:=btrim(ucase(s1));
ok:=false;
if s1=s2 then ok:=true;
if (lstr(s1,length(s2))=s2) and (not (s1[length(s2)+1] in ['A'..'Z','a'..'z'])) then ok:=true;
if (rstr(s1,length(s2))=s2) and (not (s1[length(s1)-length(s2)] in ['A'..'Z','a'..'z'])) then ok:=true;
i:=1;
if not ok then
  while i<length(s1)-length(s2)-1 do
   begin
    inc(i);
    if (copy(s1,i,length(s2))=s2) and
       (not (s1[i-1] in ['A'..'Z','a'..'z'])) and
       (not (s1[i+length(s2)] in ['A'..'Z','a'..'z']))
       then ok:=true;
   end;
find_word:=ok;
end;



function findstr(s1,s2:string):integer;
         {find string s1 in string s2, and return position}
var
i,j,k,l:integer;
begin
if length(s1)>length(s2) then
  begin findstr:=0; exit; end;
for i:=1 to length(s2)-length(s1)+1 do
  begin
   if (ucase(copy(s2,i,length(s1)))=ucase(s1)) and
      ((i=1) or (not (s2[i-1] in ['A'..'Z','a'..'z']))) and
      ((i>length(s2)-length(s1)) or (not (s2[i+length(s1)] in ['A'..'Z','a'..'z']))) then
    begin findstr:=i; exit; end;
  end;
findstr:=0;
end;



procedure eliza(var os:strl);
          {Eliza herself!}
var
i,k,j,l,n:integer;
s1,s2:strl;
{ss:strl;}
begin
repeat
  if (in_str[ord(in_str[0])] in [',','.','?','!','/',':',';']) then
     in_str[0]:=chr(ord(in_str[0])-1);
until not (in_str[ord(in_str[0])] in [',','.','?','!','/',':',';']);
i:=0; k:=0; j:=0; l:=0; n:=1;
while (i<num_keys) and (k=0) do
  begin
   inc(i);
   k:=findstr(keyword^[i],in_str);
  end;
s1:=ucase(rstr(in_str,length(in_str)-k-length(keyword^[i])));
reverse(s1);
i:=random(cluster^[i,2]-cluster^[i,1]+1)+cluster^[i,1];
s2:=responses^[i];
if rstr(s2,1)='*' then s2:=lstr(s2,length(s2)-1)+' '+s1;
{s2:=case_fix(lcase(s2));}
if (ucase(lstr(s2,5))='WOULD') or (ucase(lstr(s2,5))='COULD') or
    (ucase(lstr(s2,3))='DID')   or (ucase(lstr(s2,3))='WHY')   or
    (ucase(lstr(s2,4))='WHAT')  or (ucase(lstr(s2,4))='WHEN')  or
    (ucase(lstr(s2,5))='WHERE') or (ucase(lstr(s2,5))='WOULD') or
    (ucase(lstr(s2,2))='DO')    or (ucase(lstr(s2,2))='IS')    or
    (ucase(lstr(s2,4))='HAVE')  or (ucase(lstr(s2,6))='SHOULD') then
    s2:=s2+'?';
os:=s2;
end;



procedure get_response;
          {get a response}
begin
x:=1; in_str:=btrim(in_str);
outstr:='I don''t fully understand. ';
if in_str='' then begin outstr:='Speak up.'; exit; end;
eliza(outstr); {outstr:=btrim(outstr);}
punctuate(outstr);
end;



procedure do_response;
begin
prompt('- '); x:=3;
get_response; print(outstr); nl;
end;



procedure init;
begin
if maxavail<40000 then
  begin
   writeln('Insufficient memory, need ',40000-maxavail,' more bytes.');
   halt(1);
  end;
new(cluster); new(keyword); new(responses);
nl; writeln('----ELIZA---- 1993, Ed T. Toton III');
nl; nl; x:=1; maxx:=50;
print('Hold on one moment while I do something. I''ll be right back. ');
load_stuff; print('I''m back. ');
nl; nl; quit:=false;
x:=1; maxx:=maxxx;
x:=1; nl; nl;
print('- Greetings! Whenever you wish to leave, simply say "BYE". '
      +'But first, what do you want to talk about? Or maybe you '+
      'should tell me a little about yourself first?');
end;



procedure shutdown;
begin
nl; print('- Goodbye! See you later!'); nl; x:=1;
maxx:=57; nl;
end;



begin    {MAIN}
init;
repeat
  nl; nl;
  in_str:=get_input;
  nl; in_str:=btrim(in_str);  nl;
  if (ucase(in_str)='BYE') or (upcase(in_str[1])='Q') then quit:=true
   else
    do_response;
until quit; x:=1;
shutdown;
end.





elize.dat

Сообщение отредактировано: mrVoodoo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


?
***

Группа: Пользователи
Сообщений: 283
Пол: Мужской

Репутация: -  4  +


начать можно с отсюда

я там нашол вот это ппц прикольный бот нада будет тож мозги направить на эту тему
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 9
Пол: Мужской

Репутация: -  0  +


читал я википедию, тот бот работает по принципу элизы, тоже тупость полная, я его видел.. меня чё нить посерьёзней интересует
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Можно уточнить, какое отношение современные чат-боты имеют к ИИ?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5





Группа: Пользователи
Сообщений: 9
Пол: Мужской

Репутация: -  0  +


это типа толчок к началу работы.. хоть легче чем с пустого места начинать)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Это не толчок, а запутывание потенциальных помощников. Если тебе нужен Чат-бот - это одно, если ИИ (что, кстати, указано в заголовке) - то приходи лет через 50, может и будут какие наработки...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7





Группа: Пользователи
Сообщений: 9
Пол: Мужской

Репутация: -  0  +


Цитата
Это не толчок, а запутывание потенциальных помощников. Если тебе нужен Чат-бот - это одно, если ИИ (что, кстати, указано в заголовке) - то приходи лет через 50, может и будут какие наработки...

ладно, не подскажешь, что ты имеешь ввиду говоря ИИ?

если что то типа
http://www.membrana.ru/articles/readers/20.../01/223400.html
http://www.membrana.ru/articles/readers/20.../09/194600.html
то я с тобой согласен..

дай определение ИИ?
что ты требуешь от ИИ?


Я уточню, что я хочу:
- способность вести диалог с человеком на естественном языке
- способность преобразовывать естественный язык, на язык понятный себе, для выполнения простейших операций
- способность улучшаться/изменяться/обучаться, менять свой код "на лету"

я думаю большего даже от delphi требовать не стоит)

Сообщение отредактировано: mrVoodoo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8





Группа: Пользователи
Сообщений: 9
Пол: Мужской

Репутация: -  0  +


в принципе, если третий пункт(самый сложный) как то реализовать, то вместе со вторым, эта штука может очень не плохо развиться, причём при минимальном человееском контроле.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Цитата
дай определение ИИ?
что ты требуешь от ИИ?
Это не я должен давать определения, а ты, потому что это не я тебя спрашиваю, а ты задаешь вопрос на форуме. Вот и будь добр объяснить, чего тебе надо... Мое представление об ИИ очень сильно отличается от твоего, и на это есть весьма серьезные причины...

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

Цитата
- способность улучшаться/изменяться/обучаться, менять свой код "на лету"
Для того, чтобы обучаться совсем не обязательно менять код на лету, не следуй догмам, которые были написаны в 40-х годах прошлого века... Ты тоже обучаешься, это не значит, что ты ходишь по городу с хирургом, который то и дело производит трепанацию, и меняет тебе порядок соединения нейронов, т.е., фактически, ты обходишься и без изменения "на лету". Почему этого же нельзя требовать от программы?

А вот теперь - вопрос на засыпку: а какую задачу ты хочешь поручить своему "ИИ"? Запустить его в ICQ, чтобы он надоедал пользователям своей высокоинтеллектуальной болтовней? Чему он должен обучаться? Должен ли он "обжегшись на молоке, дуть на воду" (С), хотя о существовании воды при "рождении" он даже не знает, ему известно изначально только молоко?

Цитата
- способность преобразовывать естественный язык, на язык понятный себе, для выполнения простейших операций
Ты представляешь себе объемы задачи? Тебе для начала придется формализовать русский язык, уверяю тебя, русский - это не Эсперанто... К примеру, простейший тест, который не прошел еще ни один из выложенных в сети в открытом доступе ботов: "Как тебя зовут?" - на это отвечают все, это они знают... "Как называют тебя люди?" - 50% отсеиваются моментально, хотя смысл вопроса не изменился, надо идентифицировать себя. "Как ты хочешь, чтобы я к тебе обращался?" - Все, аут... Ни один не в состоянии распознать эту фразу и ответить на нее корректно. Только, если автор заложил в Бота десяток заготовленных фраз, и он случайно выберет подходящий ответ. Но это уже не ИИ, а генератор случайных чисел.

Цитата
я думаю большего даже от delphi требовать не стоит)
Дельфи здесь ни при чем. Язык реализации не играет роли... Главное - алгоритм... А вот с этим - большааая проблема...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10





Группа: Пользователи
Сообщений: 9
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 14.02.2009 1:33) *

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

A.L.I.C.E. смогла).

Цитата(volvo @ 14.02.2009 1:33) *

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

Что бы приспособиться люди менялись, ведь теперь мы не лазаем на деревьях)
Программа не может быть актуальной всё время если не будет изменений. Со временем она уйдёт в прошлое. А как было бы приятно, если она сама могла меняться?(ну хотябы с минимальными человеческими усилиями) Это иногда бывает жизненно необходимо:
Цитата
В 1998 году NASA запустило беспилотный космический корабль Deep Space 1 с задачей изучения планет нашей Солнечной системы. В рамках исследования Deep Space должен был несколько дней работать под управлением программы, написанной на LISP. И вот, к ужасу разработчиков, когда Deep Space находился на расстоянии более ста миллионов километров от Земли, в программе была обнаружена ошибка. А вы говорите - Билл Гейтс! Ну ладно, ошибки в программах были и будут всегда, но в программах, написанных на других языках, такая ошибка требует исправления текста и новой перекомпиляции. Чего, конечно, уже нельзя было сделать в такой ситуации. Однако, используя возможности языка LISP, удалось удаленно (весьма удаленно!) найти ошибку и внести изменения. После чего Deep Space продолжил свои исследования.




Цитата(volvo @ 14.02.2009 1:33) *

А вот теперь - вопрос на засыпку: а какую задачу ты хочешь поручить своему "ИИ"? Запустить его в ICQ, чтобы он надоедал пользователям своей высокоинтеллектуальной болтовней? Чему он должен обучаться? Должен ли он "обжегшись на молоке, дуть на воду" (С), хотя о существовании воды при "рождении" он даже не знает, ему известно изначально только молоко?

мне интересно узнать, что у меня получиться)

Цитата(volvo @ 14.02.2009 1:33) *

Ты представляешь себе объемы задачи? Тебе для начала придется формализовать русский язык, уверяю тебя, русский - это не Эсперанто... К примеру, простейший тест, который не прошел еще ни один из выложенных в сети в открытом доступе ботов: "Как тебя зовут?" - на это отвечают все, это они знают... "Как называют тебя люди?" - 50% отсеиваются моментально, хотя смысл вопроса не изменился, надо идентифицировать себя. "Как ты хочешь, чтобы я к тебе обращался?" - Все, аут... Ни один не в состоянии распознать эту фразу и ответить на нее корректно. Только, если автор заложил в Бота десяток заготовленных фраз, и он случайно выберет подходящий ответ. Но это уже не ИИ, а генератор случайных чисел.

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



Зачем нам спорить? Я бы с удовольствием тебя выслушал, если бы ты посоветовал с чего бы начать реализацию первой части:
- способность вести диалог с человеком на естественном языке
ведь больше пользы будет)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 1.12.2020 3:54
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name