Mi is az a chatbot?
Magyarul kb. beszélgető robotot jelent. Egy olyan számítógépes program, amely egy beszélgetőtársat szimulál több-kevesebb sikerrel. Egyszerű kérdésekre válaszol; ha egy kérdés nincs a tudásbázisában, általában egy kérdéssel más témára tereli a beszélgetést. Az első chatbot - Joseph Weizenbaum Eliza nevű programja - bár csupán néhány száz sor kódot tartalmazott, mégis igen sikeresnek bizonyult. A legenda szerint Weizenbaum professzor titkárnője elkezdett "beszélgetni" Elizával, majd kis idő múlva megkérte a professzort, hogy menjen ki, mert személyes dolgokról lesz szó.
Eliza gyakorlatilag szinte semmit sem tudott, a beszélgetőtársai mégis azt hitték, hogy egy élő emberrel kommunikálnak. Miért? A program néhány kulcsszóra figyelt. Ha például a felhasználó mondatában szerepelt az "anya" szó, Eliza valami ilyesmit válaszolt: "Beszéljen még a családjáról!". Ha valamit nem értett, akkor tovább beszéltette a felhasználót, egy ilyesmi mondattal: "Ez nagyon érdekes, beszéljen még róla!". Sok esetben a felhasználó előző nondatának egy részét idézte: "Szomorú vagyok." - "Miért szomorú?".
Tehát Eliza úgy viselkedett mint egy "aktívan hallgató" pszihológus: nem mondott semmi érdemlegeset, csak jól megfogalmazott válaszokkal fenntartotta a beszélgetés fonalát; a hiányzó tudást a felhasználó képzelte mögé.
Ez a magyar (és egyéb ragozó) nyelvű robotoknál sajnos nem járható út: egy-egy szónak rengeteg alakja van a toldalékok miatt. Pl.: anya, anyát, anyját, anyjukat, anyám, anyáim, anyáimat, anyácskám, anyához, anyának, anyától, stb, stb, stb...
A megoldás: Kell egy egyszerű morfológiai elemző, ami leválasztja a toldalékokat, és visszaadja a szó tövét.
A továbbiakban lépésről-lépésre bemutatom egy egyszerű chatbot elkészítését, amolyan napló/blog-szerűen.
2008.10.28 - Az alapok
A chatbotunkat a webre szánjuk, ezért egy html fájl lesz az alapja. Mi is az a html? Ha nem tudnád, olvass utánna, pl.: a Wikipédia megfelelő oldalán! http://hu.wikipedia.org/wiki/Html Ám a html fájl csak a megjelenést és az adatbevitelt nyújtja; a robot működését egy szerver oldali scriptnyelv, a PHP segítségével fogjuk megvalósítani.
Mire lesz szükséged?
- webszerver
- editor
- böngésző
Webszervernek letöltheted például az AppServ nevű alkalmazást; vagy akár egy ingyenes webtárhelyet is használhatsz, pl.: http://extra.hu/
Windows operációs rendszer alatt editornak akár a Windows beépített Jegyzettömbjét is használhatnád, azonban én inkább a Notepad2 nevű nagyszerű kis programot ajánlanám. Linux alatt tökéletesen megfelel a gedit.
A böngésző típusa teljesen mindegy, az én javaslatom az Opera. Kicsi, gyors, szabványkövető, sokmindent tud; ráadásul Windows és Linux alatt is elérhető.
A chatbot felhasználói interfésze (User Interface, UI) tulajdonképpen egy egyetlen szövegmezőből álló form, és az alatta lévő bekezdés lesz. A szövegmezőbe fogja beírni a felhasználó a robotnak szánt üzenetét, s alatta fogja a robot kiírni a választ.
A html fájlnál az egyszerűség kedvéért UTF-8-as karakterkódolást fogunk használni. Ez a kódolás a magyar ékezetes betűket két-két, 128-nál nagyobb kódú karakterrel ábrázolja. Ezzel a kódolással tud menteni a gedit, a Notepad2, és persze a Jegyzettömb is.
Íme az alap html fájl, ehez fogjuk hozzáépíteni a többit: index.html A <!-- <body> --> rész az extra.hu idegesítő javascriptje "megkerülésére" van ott, elképzelhető, hogy a szolgáltató ezt nem veszi jó néven, tehát csak saját felelősségre hagyd a kódban.
Alakítsuk át a html fájlunkat php fájllá! Ez egyszerű lesz: csupán a .html kiterjesztést le kell cserélni .php-ra. Ha ez megvan még pár apróság: A robot kiírandó válaszát tartalmazó bekezdésben a szöveget kicseréljük egy php kódra, ami annyit csinál, hogy kiírja a $answer nevű változó értékét; ez egyenlőre a felhasználó által beírt szöveget jelenti, amit a fájl elején olvasunk be a $question nevű változóba. A biztonság kedvéért php-ből is beállítjuk a karakterkódolást a header() függvény segítségével. Íme az eredmény: index.php Hogy ebben hol a php kód? Azt végrehajtotta az értelmező, ezért nem láthatod!
Íme az eredeti kód, végrehajtás nélkül: index.phps
2008.11.29 - Szünet
Közben abba az "apró" problémába ütköztem, hogy a weboldalam bejegyzés-leírónyelve nem támogatta a forráskódok megjelenítését az oldalon; ezt a dizájncserével együtt orvosoltam.
2008.11.30
Itt a következő, picit interaktívabb verzió: ez már néhány kérdésre tud válaszolni. Itt a forráskód: index_00.phps, és itt lehet kipróbálni: index_00.php. A switch php utasítás a megadott paraméter értékétől függően elágaztatja a program végrehatását; gyakorlatilag rengeteg if utasítást lehet vele megspórolni; itt arra használjuk, hogy a $question változó értékétől függően más-más értéket adjunk a $answer változónak.
Ez egy igen rossz és primitív módszer. Miért? Azért mert:
- Csak akkor ismer fel egy kérdést, ha az karakterről karakterre pontosan van beírva.
- Ha "tanítani" szeretnénk, az csak a kód átírásával lehetséges.
- Ugyanarra a kérdésre mindíg ugyanazt fogja válaszolni.
E hibák egy részén lehet javítani, de nem ez lesz a helyes út.
A formban szereplő <?php echo $_SERVER['PHP_SELF']; ?> kódrészlet kiírja az éppen végrehajtott php fájl nevét; ez azért jó, mert így ha átnevezed az index_00.php-t pl.: index.php-re akkor nem kell átírni a form action attribútumát is.
2008.12.07
Hogy minél kevesebb lehetőséget kelljen a robotnak megvizsgálnia, célszerű "megtisztítani" a beírt szöveget. Vesszőket, idézőjeleket, egyéb speciális jeleket kitörölhetjük a szövegből; és egyúttal kisbetűsíthetjük is azt. index_01.php, a forrás: index_01.phps
2009.03.30
Két újabb eljárással bővült a bot. Az első, a FindQ(), ellenőrzi, hogy létezik-e az user által beírt kérdés, kifejezés, a q_02.txt-ben; és ha igen, visszaadja a kódját. A szövegfájl felépítése egyszerű, minden sor tartalmaz egy-egy kifejezést, és vesszővel elválasztva a kifejezéshez tartozó válasz kódját.
A másik eljárás, a FindA(), megkeresi a kódhoz tartozó választ a a_02.txt-ben. Ez a szövegfájl is hasonló felépítésű, de mivel a robot által adandó válasz vesszőket is tartalmazhat, ezért a szöveg és a kód elválasztására a "|" (pipe) jelet használjuk (AltGr + W).
index_02.php, a forrás: index_02.phps
Folytatása következik...
Keress más chatbotot is az Interneten!
Utóljára módosítva: 2009.12.25, 18:41