Už úvodná Elizina otázka Ako sa voláš?, či skôr odpoveď používateľa, predstavuje komplikovaný problém. Niekto odpovie menom, niekto menom a priezviskom, ďalší priezviskom a menom, iný prezývkou v kombinácii s priezviskom či bez neho a ktosi odpovie svojim priezviskom. Ak by Eliza bola človek, vo väčšine prípadov by vedela identifikovať, o ktorý variant ide.
Pokúsme sa tento problém aspoň čiastočne vyriešiť. Ak používateľ popri mene či prezývke uvedie aj priezvisko, problém je riešiteľný syntakticky. Obvykle bude meno od priezviska oddelené medzerou, niekedy budú oddelené čiarkou a medzerou a výnimočne čiarkou bez medzery. Eliza by mohla automaticky predpokladať, že znaky po medzeru sú menom, po čiarku priezviskom, alebo sa spýtať čo je meno a čo priezvisko.
Človek, ako inteligentná bytosť, by postupoval skôr sémanticky a len keby dané meno nepoznal pomohol by si syntaxou, a ak by sa niekto volal Peter Pavol, Martin Filip, … tak by sa pre istotu spýtal, čo z toho je meno a čo priezvisko.
Syntaktické riešenie
Nateraz to vyriešme syntakticky. Ak v odpovedi bude medzera alebo čiarka, odpoveď bude pravdepodobne obsahovať meno a priezvisko, ale pozor, niekto môže odpovedať celou vetou: Volám sa Peter; Moje meno je Peter, Som Peter, … Podobné odpovede by mala Eliza automaticky redukovať na odpoveđ ‚Peter‘.
Celé vety môžeme ošetriť pomocou premennej ignoruj:
ignoruj=(‚volám sa‘,’moje meno je‘,’som‘,’ja som‘,’volajú ma‘,’volajú ma … ale dávam prednosť osloveniu …‘)
pričom vymyslíme funkciu, ktorá z odpovede vyreže ignorované výrazy.
Úloha 1
Vašou úlohou je navrhnúť takúto funkciu. Podľa mňa som vás už oboznámil so všetkými reťazcovými funkciami a metódami, pomocou ktorých možno úlohu vyriešiť a pokiaľ sa mýlim, Google vám určite pomôže.
Úloha 2
Navrhnite funkciu, ktorá štatisticky správne odhadne meno, ak používateľ v odpovedi uviedol meno aj priezvisko.
Sémantické riešenie
Keď sme problėm vyriešili syntakticky, Eliza vlastne nepozná význam slov Peter, Tibor, Anna, iba vydedukovala, že ide o mená.
Skutočne inteligentná bytosť kombinuje syntax aj sémantiku, uvedomuje si ich obmedzenia, je si vedomá i toho, že partner v dialógu vedome, nevedome, podvedome klame alebo robí chyby.
Aby sme hore uvedený problém vedeli riešiť sémanticky, musíme Elizu naučiť aspoň najpravdepodobnejšie sa vyskytujúce mená, prezívky, zdrobneliny, … Aby s nami komunikovala ako tak rozumne, musíme ju naučiť používať pády, alebo ju naučiť komunikovať pádovo neutrálnym spôsobom. Ak jej používateľ odpovie Ján, niekedy ho má osloviť Jano, inokedy Ján alebo Janko, alebo sa ho spýtať, ako ho oslovovať. Podobne, ak bola odpoveď Zuzana, tak môže striedať oslovenia Zuza, Zuzi, Zuzka, Zuzička, Zuzisko, Žužu, … , poprípade sa spýtať, ako ju má oslovovať. Skutočná komunikácia medzi ľuďmi prebieha tak, že oslovenie závisí od momentálneho emotívneho nastavenia.
Zavedieme premennú mena.
mena=(‚Anna‘,’Adam‘,’Anton‘,’Anabela‘,’Antónia‘,’Beata‘,’Bea‘,’Barbora‘,’Barbara’…)
Aj keď opíšeme všetky mená z kalendára a uvedieme všetky varianty mien, ktoré nás napadnú, pri komunikácii s Elizou sa určite vyskytnú mená, na ktoré sme zabudli. Jednou zo základných vlastností inteligentnej bytosti je, že sa dokáže učiť. Jeden zo spôsobov učenia Elizy by bolo, že priebežne sledujeme, ako s ľuďmi komunikuje a postupne dopĺňame jednotlivé varianty odpovedí. Väčšinu vecí sme sa v rannom detstve naučili autonómne, bez priameho zásahu rodičov. Ak má Eliza prejavovať znaky umelej inteligencie, musíme jej dať do vienka i samoučenie. Ak čosi nepozná, má sa spýtať a nabudúce už má použiť poskytnutú informáciu.
Na samoučenie použijeme prácu so súbormi. Elizine vedomosti nebudeme ukladať priamo do programu, ale do pomocných súborov, do ktorých si bude ukladať novozískané vedomosti.
Práca so súbormi
f=open(MenoSúboru,mode)
Premennej f priradí súbor, ktorého meno sme uviedli a súbor otvorí spôsobom mode. Ak nie je uvedená cesta k súboru, otvorí ho v aktuálnom adresári, obvykle v tom, v ktorom sa nachádza spustený program.
Aké módy (spôsoby) otvorenia súboru môžeme použiť:
- r – súbor otvorí na čítanie. Ak súbor neexistuje, vráti chybu. Preddefinovaný spôsob otvorenia súboru – ak mode neuvedieme
- w – súbor otvorí na zápis, ak súbor existuje, zredukuje ho najprv na prázdny súbor, ak neexistuje, vytvorí prázdny súbor
- x – exkluzívne vytvorenie súboru. Ak existuje, vráti chybu.
- a – ak súbor existuje, pridáva nové údaje nakoniec, inak ho vytvorí
- b – binárny mód, vysvetlím neskôr
- t – textový mód, preddefinované
- + – otvorí súbor pre updatovanie, súbor možno čítať i doň zapisovať
Najprv vytvorme súbor mena.txt pomocou poznámkového bloku a zapíšme doň do jednotlivých riadkov všetky či aspoň niektoré mená z kalendára.
Použime nasledujúce príkazy:
f=open(‚mena.txt‘)
mena=f.read()
print(mena)