Egyszerű bot a site számára
Bizonyára sokan már észrevettek néhány újítást a honlapunkon. Most elmondom, honnan jöttek a gyökerek, hogyan működik a bot és hogyan töltötte ki a mondatok adatbázisát. Nem nehéz ugyanazt a botot készíteni, hidd el.
gyökerek
Az a szándék, hogy botot adjanak a helyszínre a nemes Don Virus-ON dobta. így minden babér hozzá.
Mit vesz egy bot létrehozása?
Először is, a mondatok adatbázisa a bot memóriája, így válaszolhat az üzenetekre.
Másodszor, néhány algoritmus a mondatok kiválasztásához a bot agya, így többé-kevésbé válaszol a témában.
Adatbázis. 1. rész
Véletlenül előfordult, hogy megismerkedtem egy személy programozásával az Android-ra és szörnyen utáltam az Apple termékeket. Az egyik fejlesztés a VK iHA bot. amelynek forráskódja a GitHub-on van.
Maga az alkalmazás nem érdekes számunkra, de az adatbázis először nagyon hasznos lenne. És vegye be.
Az adatbázis formátuma a következő:
üzenet \ válasz \ relevancia
példa
hello \ hello, jó látni! \ 3
hogyan vannak a dolgok \ ügyek kiválóak! \ 2
Ember vagyok \ robot vagyok)) \ 2
Meg kell vizsgálnunk ezt a fájlt, törölni kell a felesleges linkeket, neveket, obszcén szavakat (sokan vannak), és menteni mindent egy másik formában, a MySQL adatbázis számára érthető módon.
Scala script:
importál. gyűjtemény. változékony. Hash-halmaz
importál. io. forrás
import java. io. fájl
objektum VkIHAbotDbExtractor # 123;
val filterWords = Array # 40; / / itt egy ismert obszcén szavak listája
def main # 40; args. sor # 91; húr # 93; # 41; # 123;
var set = új HashSet # 91; kifejezés # 93;
új fájl # 40; args # 40; 0 # 41; # 41;
szűrő # 40; _. endsWith # 40; ".bin" # 41; # 41;
foreach # 40; f => set = set ++ megnyílik # 40; f # 41; # 41;
felülírja a def toString elemet # 40; # 41; = s "(" $ message "," $ answer "),"
A fő módszernél átmegyünk a .bin fájlok között a könyvtárban, és minden egyes ilyen fájlhoz megnyitjuk a nyitott hívást. A nyílt módszer leolvassa a fájl sorát sorban, és átalakítja a karakterláncot a Phrase osztályba. A Phrase osztályban a sort egy üzenetválaszba osztjuk.
Valójában a botunk különleges karakterei szemetet jelentenek. Nem szükséges, hogy tudja, hol van a vessző a bejövő üzenetben, szavakat és számokat kell vezetni. sor
replaceAll # 40; "[^ \\ p \\ p] +". „” # 41;
Pontosan ez az.
By the way, botunk nem érti, mi van előttük: kérdés vagy nyilatkozat. De ezt a szokásos szavakból tudja megérteni: mi. hol. hogyan, stb.
A parancsfájl végrehajtása után ezt a kimenetet az SQL formátumban kapjuk meg:
# 40; '0'. - Jó számot írtál. # 41;.
# 40; '1'. "Van problémás számjegyem." # 41;.
Csak egy táblázatot hoz létre az adatbázisban, és töltse ki a dumpot.
CREATE TABLE, HA NEM EXISTS "bot" # 40;
`id` int # 40; 11 # 41; NOT NULL AUTO_INCREMENT.
`message` szöveg NOT NULL.
A `reply` szöveg NOT NULL.
Elsődleges kulcs # 40; `id` # 41;.
FULLTEXT KEY `üzenet` # 40; `message` # 41;
# 41; ENGINE = MyISAM DEFAULT CHARSET = utf8;
A kifejezések kiválasztására szolgáló algoritmus
Az algoritmus egyszerű. A felhasználó ír egy üzenetet, amelyet elküldünk a botnak a feldolgozáshoz. Az összes extra karaktert eltávolítjuk az üzenetből, és egy hasonló bejegyzést keresünk az adatbázisban. Találtunk egyet - választ adunk válaszként. Találtam néhányat - válaszd a véletlenszerűt a találtból. Nem találtunk semmi hasonlót - véletlenszerű választ kapunk.
Most a sorrendben és a kóddal együtt.
1. Fogadott egy üzenetet, visszaadjuk szűrés céljából:
magánfunkciós szűrő # 40; $ üzenetet # 41; # 123;
$ msg = mb_strtolower # 40; $ üzenetet. 'UTF-8' # 41; ; fordítsa le a szöveget kisbetűsre
$ msg = str_replace # 40; én. NAME. ''. ''. $ msg # 41; ; // törölje a hivatkozást a botra
$ msg = preg_replace # 40; '# \ [c (. +?) \ [/ c \] # sui'. ''. $ msg # 41; ; // törölje az idézetet Magatino lustaságának megnyomásakor a Válasz gombra
$ msg = preg_replace # 40; '/ [^ a-za-я0-9] / u'. ''. $ msg # 41; ; // minden speciális karakter eltávolítása
$ msg = preg_replace # 40; '/ \ s + /'. ''. $ msg # 41; ; // több egymást követő teret cserélni egyet
visszajátszás # 40; $ msg # 41; ;
2. Válasszon egy kifejezést kifejezett egybeesésből:
SELECT `answer` FROM` bot` WHERE `message` =" hello "RAND MEGRENDELÉSE # 40; # 41; LIMIT 1
3. Ha ez nem található meg, akkor okosabb opciót használunk:
SELECT `answer` FROM` bot`
MELYEN KÜLÖNÖS # 40; `message` # 41; ELLEN # 40; "hello" A NATURÁLIS NYELV MÓDON # 41;> 0
ORDER BY RAND # 40; # 41; LIMIT 1
4. Ha ez is üres - válaszd ki a rendelkezésre álló válaszokat:
SELECT `answer` FROM 'bot' RENDBEN RAND # 40; # 41; LIMIT 1
Talán a legérdekesebb a második kérés. Keresi a természetes nyelveken alapuló mérkőzéseket. Itt vannak a különbségek:
Itt, valójában az egész agy.
PHP osztály Bot.class.php
Ezt használja (fórum / say.php):
ha # 40; $ id == 226621 # 41; # 123; // id a téma, ahol a bot válaszolni fog
$ answer = Bot. byMessage # 40; $ msg # 41; -> getAnswer # 40; # 41; ;
`text` = '". mysql_real_escape_string # 40; $ számlista. ''. $ válasz # 41;. „„” # 41; ;
mysql_query # 40; "UPDATE` felhasználók` SETDATE `utolsó dátum '=' $ realtime 'WHERE` id` ='". Bot. ID. „„” # 41; ;
Adatbázis. 2. rész
Négyezer üzenet egyértelműen kicsi, az adatbázisnak olyannak kell lennie, amely megfelel a webhely témájának. A fórumban szereplő minden üzenet nem a legjobb megoldás - nem világos, hogy hol van a kérdés, hol a válasz. De itt vannak az üzenetek, amelyek tartalmazzák az idézetet, nagyon alkalmasak nekünk. Már van egy kérdésük, és a válasz ugyanabban az üzenetben van.
Először a fórum alapjául vesszük az összes idézetet tartalmazó üzenetet:
SELECT `text` FROM` fórum` WHERE `szöveg 'REGEXP' ^ \\ [c (= | \]) * '
Aztán megmentjük a dumpot. Kaptam egy 12 MB-os fájlt, amely 38 ezer rekordot tartalmaz.
Most mindent meg kell vizsgálni. Ismét segítségért hívunk Scala-t.
importál. gyűjtemény. változékony. Hash-halmaz
importál. io. forrás
import java. io. fájl