Mi is az az RiveScript?
Nemrég újra elkezdtem foglalkozni rég elfeledett chatbotjaimmal, és véletlenül rátaltam a RiveScriptre. Ez egy scriptnyelv az AIML kiváltására. A felépítése egyszerű, de mégis több lehetőség rejlik benne, és kényelmesebben is használható az AIML-nél.
Némi hasonlóság is felfedezhető a RiveScript és az én korábban a botjaim tudásbázisai tárolására szolgáló fájlok között, ezért eleinte a kettő keresztezéséből létre akartam hozni egy újat, de aztán rájöttem, hogy a céljaimnak tökéletesen megfelel a RiveScript.
A RiveScript felépítése
A RiveScript fájlok deklarációkból állnak. Kétféle deklaráció lehet bennük: változó és minta-válasz blokk. Minden sor egy-egy egykarakteres parancssal kezdődik, az üres sorok és a megjegyzések figyelmen kívül lesznek hagyva. Kétféle megjegyzés használható: A // jellekkel kezdődőek a sor végéig tartanak; a /* és */ jelek pedig többsoros megjegyzést is közrefoghatnak
Saját bővítés:
Az értelmező a felhasználók által beírt szöveget a speciális karakterektől megtisztítva és kisbetűsítve kapja meg; továbbá a betűkkel írt számok arab számokká lesznek alakítva, azaz a "Van nyolc BITem" mondatból "van 8 bitem" lesz. Ha egy szó számmal kezdődik, akkor a szó szét lesz vágva, és a szám szintén átalakul. Azaz a "hétfejű sárkány"-ból "7 fejű sárkány" lesz. (Persze nem minden számmal kezdődő szó alakítható át, pl.: a "százalék" sem.)
A változódeklarációk
A változódeklaráció parancs-karaktere a ! jel. Többféle típusú változó hozható létre: globális, sima karakterlánc, tömb, verzió, helyesírás-javító, személy-módosító. Ha a tömbelemek szóközt is tartalmaznak, az elemeket a pipe jellel kell elválasztani.
! global debug = 1 ! var name = RiveScript Bot ! array colors = red green blue cyan magenta yellow black white orange brown ! array whatis = what is|what are|what was|what were ! version = 2.00 ! sub vok = vagyok ! sub naon = nagyon ! person te = én ! person én = te
A minta-válasz blokkok
A minta-válasz blokkok két fő részből állnak: a mintáből és a mintára adható válaszokból. Lássuk a legegyszerűbb blokkot:
+ mi a neved ? - Lisa vagyok.
A + parancs-karakter után kell megadni a mintát, kisbetűkkel, a szavakat egy-egy szóközzel elválasztva. A kérdőjel és a pont is egy-egy szónak számít. Vannak a mintákban használható speciális joker-kifejezések is:
- * - bármilyen szóra illeszkedik, pl.: "alma", "11", "a55"
- # - csak számjegyekből álló szóra illeszkedik, pl.: "123", "0"
- _ - csak nem számjegyeket nem tartalmazó szóra illeszkedik, pl.: "alma", "sajt"
- (sok|kevés|#) - alternatív lehetőségek: a felsorolt elemek bármelyikére illeszkedik.
- [a|az] - opcionális lehetőségek, ha ott van, illeszkedik rá, ha nincs, akkor is.
A válaszok parancs-karaktere a - jel. A válaszok hivatkozhatnak a mintában szereplő joker-kifejezésekre a <star1>...<starX> kifejezésekkel, ahol az X a mintában lévő joker-kifejezés sorszáma, a <star> megfelel a <star1>-nek. Az opcionális kifejezésre nem lehet hivatkozni.
+ a nevem _ - Szia <star>!
Ha a felhasználó például az "a nevem joe" szöveget írja be, erre a fenti blokk a "Szia joe!" választ adja. Előfordulhat, hogy a felhasználó által beírt szöveg több mintára is illeszkedik, ekkor az a blokk érvényesül, amelyikkel nagyobb az egyezés. Ha több bloknak is ugyanakkora az egyezése, akkor az előbb deklarált számít. Erre figyelni kell a RiveScript fájlok létrehozásánál. Pl.:
+ szeretem - Mit szeretsz? + szeretem a csokit - Én is! :-) + szeretem (a|az) * - Szóval szereted <star1> <star2>.
Ennél a példánál, ha a felhasználó a "szeretem a csokit" mondatot írja be, az "Én is! :- )" választ kapja, hiába ugyanúgy három egyezése van a harmadik blokknak is. Viszont a "szeretem az almáslepényt" mondatra már a harmadik blokk válasza, azaz a "Szóval szereted az almáslepényt." lesz visszaadva, hiszen a második blokk mintája nem illeszkedik, az elsőé meg csak egy egyezéssel.
A válaszokban használhatók még a változók is. Példa változó módosítására és kiírására:
+ a nevem _ - Szóval <star> a neved. Megjegyeztem.<set username, <star>> + mi a nevem ? - <get username> vagy.
Véletlenszerű válaszok
Megeshet, hogy ugyanarra a kifejezésre több válasz közül szeretnénk véletlenszerűen adni egyet, hogy ne legyen túl egyhangú a chatbot. Ennek a megvalósítása a RiveScriptben a RiveScript mintájára nagyon egyszerű: több választ kell megadni, és az értelmező majd véletlenszerűen visszaad egyet. Pl.:
+ hogy vagy ? - Köszönöm, jól. - Nem túl jól... - Semmi közöd hozzá!
Átirányítás
Ez szintén egy fontos eleme a RiveScriptnek és az AIML-nek is. Az átirányítás parancs-karaktere a @.
+ hogy érzed magad ? @ hogy vagy ?
Ez a példa a "hogy érzed magad?" kérdés esetén átirányít a hogy vagy ? mintára, így a válaszokat nem kell többször is megadni, hasonló jelentésű kérdéseknél. Természetesen itt is használhatók {wordX} kifejezések.
Feltételek
A * parancs-karakterrel kezdődő sorok közül az adja vissza a választ, amelyikben a megadott feltétel teljesül. Ha több feltételes sor is van, és többen teljesül a feltétel, akkor az előbb deklarált adja a választ. Ha egy feltétel sem teljesül, akkor a feltételek után megadott válasz, vagy több válasz esetén a válaszokból véletlenszerűen választott adódik vissza. Pl.:
+ mit akarsz csinálni ? * <get time> < 8 => Még aludnék... * <get time> < 12 => Vásárolni szeretnék! :-) * <get time> < 20 => Tanulnom kell. :-( - Nézem a TV-t. - Miért érdekel?
Előző válasz
Előfordulhat, hogy egy blokknak csak a chatbot előző válaszától függően kellene végrehajtódnia. Például a bot megkérdi, hogy "Milyen színű a szemed?", erre a felhasználó válaszolhatja azt, hogy "kék". De ugyanezt másra is válaszolhatja... Erre a megoldás a %, azaz az előző válasz parancs. Pl.:
+ kék % milyen színű a szemed ? - Tehát a szemed színe kék.
Ebben a példában a blokk csak akkor fog végrehajtódni, ha a chatbot előző üzenete a "milyen színű a szemed ?" volt, és a felhasználó erre a "kék" választ adta.
Kapcsolódó linkek:
- http://www.rivescript.com/wd/RiveScript.html
- http://hu.wikipedia.org/wiki/AIML
- http://localhost/kaszazsolt.hu/lisa
Utóljára módosítva: 2009.12.26, 01:02