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:

Egyszerű bot a site számára
Egyszerű bot a site számára

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

Kapcsolódó cikkek