VYUŽITÍ UMĚLÉ INTELIGENCE V PRAXI aneb vyhněte ( výhněte ) se fatalitám, Ahoj, lidi! Dnes je tu Marky se svojí hypershow "Jak oblbnout uživatele". Řekněme si tedy jednu základní poučku, podle které asi budete celý život programovat. A tato slavná poučka zní: Jediná možnost, jak vydělat, je vydělat na blbosti jiných. A nyní se vám pokusím vysvětlit, jak tato poučka platí ve světě umělé inteligence. Většina lidí se domnívá, že pro skutečné myšlení počítače je nutno využívat množství databází propojených různými závislostmi, a že počítač bude schopen z těchto dat pochopit o co vlastně jde. Chyťme se tedy tohoto modelu a splňme uživateli jeho přání. Jen jednu věc vynecháme. Myšlení počítače. Počítač nebude přemýšlet, ale pouze porovnávat vstup s již existujícími daty. Pro jednoduchost uvažujme pouze otázky a odpovědi. Potom vytvořme pole do kterých se budou jednotlivé otázky a odpovědi zapisovat. Každé z těchto polí musí obsahovat samotná data a závislosti na jejich protějšcích. Typ takovéhoto pole bude vypadat takto: Type Sentence_String = String [ 80 ] ; { Řetezec obsahující data - - věta } TSentence = Record Reading : Sentence_String ; Nodes_Num : Word ; { Počet závislostí } Nodes : Array [ 1 .. Max_Nod ] Of Word ; { Pole závislostí ( Max_Nod - max. počet ) } End; PSentence = ^TSentence ; Var Comment : Array [ 1 .. 1000 ] Of PSentence ; { Pole odpovědí } Question : Array [ 1..1000 ] Of PSentence ; { Pole otázek } Aby počítač plnil svoji funkci a choval se jako když myslí, bude na každou otázku odpovídat a po každé odpovědi se ptát. Pro zjednodušení se rozkaz bere jako otázka nebo je možné využít rozkaz jako povel pro samotný program { Open new data! a pod. } Jak nyní dosáhnout dojmu z myšlení. Pokusím se to vysvětlit následuijícím schématem: | +--+--+ |vstup| +--+--+ | ano +---+---+ ne +----------+otázka +-----------+ | +-------+ | | | ano +-+-+ ne ano +-+-+ ne +-----+pv.+-----+ +-----+pv?+-----+ | +---+ | | +---+ | | | | | +---+---+ +---+---+ +---+---+ +---+---+ |Inc(po)| |Inc(po)| |Inc(p.)| |Inc(p.)| |čo=po | |čo=po | |č.=p. | |č.=p. | |of=čpv.| |of=opv.| |of=čpv?| |of=opv?| +-------+ +-------+ +-------+ +-------+ Vysvětlení zkratek: po - počet otázek p. - pocet odpovědí čo - číslo otázky č. - číslo odpovědi pv. - předchozí výstupní věta odpověd pv? - předchozí výstupní věta otázka of - offset ( závislost ) aktuální zpracovávané věty čpv.- číslo pv. čpv?- číslo pv? opv.- offset pv. opv?- offset pv? Poznámka - Nejednodušší způsob, jak zjistit, zdali je věta otázka či ne je testovat otazník na konci. Takto tedy vypadá algoritmus pro učení se nových vět. A jak tyto věty využívat? Uvažujme, že se uživatel ptá. Program se snaží najít otázku s největŠím počtem podobných slov. Pokud je počet podobných slov větší než 3 použije nejpodobnější odpověd z jejího offsetu. Pokud taková otázka neexistuje, program podobným způsobem prohledá odpovědi a nejpodobnější použije. Pokud ani zde nevyhoví kritérium 3 podobných slov, počítač se zeptá na kořen. Pro tuto otázku je třeby změnit nepříklad zájmena. Algoritmus potom vypadá takto. ( Teď už barvičky nečekejte ) Procedure Ask_for_it; Var Uff : Sentence_String; Function You : Byte; Begin You:=0; For I:=1 To Kuch_Num Do If (Repli_Word[I]='you') Or (Repli_Word[I]='You') Then You:=I; End; Function To_Be : Byte; Begin To_Be:=0; For I:=1 To Kuch_Num Do If (Repli_Word[I]='am') Or (Repli_Word[I]='are') Or (Repli_Word[I]='is') Or (Repli_Word[I]='was') Or (Repli_Word[I]='were') Then To_Be:=I; End; Function To_Have : Byte; Begin To_Have:=0; For I:=1 To Kuch_Num Do If (Repli_Word[I]='has') Or (Repli_Word[I]='have') Or (Repli_Word[I]='had') Then To_Have:=I; End; Begin Repli_Sentence:=Act_Sentence; Rozkuchej_Vetu; Repli_Sentence:=''; For I:=1 To Kuch_Num Do If (Repli_Word[I]='My') Or (Repli_Word[I]='my') Then Repli_Word[I]:='your' Else If (Repli_WOrd[I]='Your') Or (Repli_Word[I]='your') Then Repli_Word[I]:='my'; If To_Have=0 Then For I:=1 TO Kuch_Num Do If (Repli_Word[I]='You') Then Repli_Word[I]:='me' Else If (Repli_Word[I]='I') Then Repli_Word[I]:='you'; Repli_Word[1][1]:=Down_Case(Repli_Word[1][1]); If To_Be<>0 Then If (Repli_Word[1]='i') Or (Repli_Word[1]='you') Then Repli_Sentence:='' Else For I:=1 To To_Be-1 Do Repli_Sentence:=Repli_Sentence+ Repli_Word[I]+' ' Else If To_Have<>0 Then If Repli_Word[1]='i' Then Begin Repli_Sentence:=Repli_Sentence+ 'your '; For I:=To_Have+1 To Kuch_Num Do Repli_Sentence:=Repli_Sentence +Repli_Word[I]+' '; End Else If Repli_Word[1]='you' Then Begin Repli_Sentence:=Repli_Sentence +'my '; For I:=To_Have+1 To Kuch_Num Do Repli_Sentence:= Repli_Sentence+ Repli_Word[I]+' '; End Ufo:=(random(Num_ans-1))+1; If Repli_Sentence<>'' Then Uff:=Answer[Ufo].Main_part+' '+Answer[Ufo].spojka +' '+Repli_Sentence Else Uff:=Answer[Ufo].Main_part+' '; Uff[Length(Uff)]:='!'; Repli_Sentence:=Uff; End; Myslím si, že význam většiny proměnných je jasný. Uff a Ufo jsou pouze lokální, Repli_sentence je odpověď počítače. Kuch_num je počet slov ve větě, Rozkuchej_vetu procedura pro rozdělení na slova. Záměna zájmen je ukázána na zájmenech I a you, pro ostatní platí analogicky. Stejně tak tyto algoritmy platí analogicky pro otázky. Doufám, že jste tedy pochopili, jak jednoduše napsat myslící program a přeju příjemnou zábavu při rozhovorech. Marky P.S.: Příště dodám ještě algoritmus na kořen slova, sem už by se nevešel. výheň