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ň