Bai simplu pentru site

Desigur, mulți au observat deja unele inovații pe site-ul nostru. Acum vă voi spune unde au ieșit rădăcinile, cum funcționează botul și cum a completat baza de date cu fraze. Nu e greu să faci exact același bot, crede-mă.








rădăcini
Ideea de a adăuga bot la site a fost aruncată de nobilul Don Virus-ON. astfel încât toate lauri să-l.

Ce este nevoie pentru a crea un bot?
În primul rând, baza de date cu fraze este memoria botului, astfel încât acesta să poată răspunde la mesaje.
În al doilea rând, un algoritm pentru alegerea expresiilor este creierul botului, astfel încât să răspundă mai mult sau mai puțin subiectului.


Baza de date. Partea 1
Într-o întâmplare, am întâmplat să mă familiarizez cu programarea unei persoane pentru Android și să urăsc teribil produsele Apple. Una dintre evoluțiile sale este botul VK iHA. codul sursă al cărui conținut se află pe GitHub.
Aplicația însăși nu ne interesează, dar baza de date ar fi foarte utilă. Și ia-o.

Formatul bazei de date este după cum urmează:
mesaj \ answer \ relevanță
exemplu
salut \ salut, bine sa te vad! \ 3
cum sunt lucrurile \ Cazurile sunt excelente! \ 2
Sunt un om \ Sunt un robot)) \ 2
Avem nevoie pentru a analiza acest fișier, eliminați link-uri inutile, nume, injuraturi (din care sunt multe) și să păstreze totul într-un format diferit, care este de înțeles de baze de date MySQL.
Scala Scala:

scala de import. de colectare. mutabil. HashSet

scala de import. io. sursă

import java. io. fișier

obiect VkIHAbotDbExtractor # 123;

val filterWords = Array # 40; // aici este o listă a cuvintelor obscene cunoscute pentru

def principal # 40; args. mulțime # 91; șir # 93; # 41; # 123;

var set = nou HashSet # 91; expresie # 93;

fișier nou # 40; args # 40; 0 # 41; # 41;

filtru # 40; _. endsWith # 40; ".bin" # 41; # 41;

foreach # 40; f => set = set + deschis # 40; f # 41; # 41;

suprascrie def toString # 40; # 41; = s "('$ mesaj', '$ answer'),"


În metoda principală, trecem prin toate fișierele .bin din director și sunăm deschise pentru fiecare astfel de fișier. Metoda deschisă citește linia fișierului după linie și convertește șirul la clasa de expresii. În clasa Frază, împărțim linia într-un mesaj-răspuns.
De fapt, personajele speciale pentru botul nostru sunt gunoi. Nu este necesar ca el să știe unde este virgul în mesajul primit, el ar trebui să fie ghidat de cuvinte și cifre. rând

replaceAll # 40; "[^ \\ p \\ p] +". „“ # 41;

Exact asta face.
Apropo, botul nostru nu înțelege ce este înainte: o întrebare sau o declarație. Dar el poate înțelege acest lucru din cuvinte comune: ce. în cazul în care. cum, etc.

După executarea scriptului, obținem această ieșire în format SQL:






# 40; '0'. - Ai scris un număr bun. # 41;.

# 40; '1'. "Am cifre cu probleme." # 41;.


Rămâne doar să creați o masă în baza de date și să completați memoria.

CREATE TABLE Dacă nu există "bot" # 40;

id id # 40; 11 # 41; NU NULL AUTO_INCREMENT.

mesajul "text" NOT NULL.

Textul răspunsului NU NULL.

TASTĂ PRIMARĂ # 40; `id` # 41;.

FULLTEXT KEY `mesaj` # 40; `message` # 41;

# 41; MOTOR = MyISAM DEFAULT CHARSET = utf8;

Algoritm pentru alegerea expresiilor
Algoritmul este simplu. Utilizatorul scrie un mesaj, care este trimis apoi botului pentru procesare. Acolo eliminăm toate caracterele suplimentare din mesaj și căutăm o înregistrare similară în baza de date. Am gasit unul - oferim ca raspuns. Găsiți câteva - alegeți aleatoriu de la găsită. Nu am găsit nimic similar - rezultă un răspuns aleatoriu.

Acum, în ordine și cu codul.

1. Am primit un mesaj, îl returnez pentru filtrare:

filtru de funcții private # 40; $ mesaj # 41; # 123;

$ msg = mb_strtolower # 40; $ mesaj. 'UTF-8' # 41; ; // traduceți textul în litere mici

$ msg = str_replace # 40; de sine. NAME. ''. ''. $ msg # 41; ; // eliminați referința la bot

$ msg = preg_replace # 40; '# \ [c (. +?) \ [/ c \] # sui'. ''. $ msg # 41; ; // eliminați citatul în cazul în care lenea Magatino apasă Răspundeți

$ msg = preg_replace # 40; '/ [^ a-za-y0-9] / u'. ''. $ msg # 41; ; // eliminați toate caracterele speciale

$ msg = preg_replace # 40; '/ \ s + /'. ''. $ msg # 41; ; // înlocuiți mai multe spații consecutive cu unul

retur trim # 40; $ msg # 41; ;


2. Alegeți o frază prin coincidență explicită:

SELECTAȚI "răspuns" FROM `bot` WHERE" mesaj` = "salut" ORDER BY RAND # 40; # 41; LIMIT 1


3. Dacă acest lucru nu este găsit, atunci vom folosi o opțiune mai inteligentă:

SELECTați răspunsul FROM `bot`

Unde se potriveste # 40; `message` # 41; CONTRA # 40; "salut" în modul de limbă naturală # 41;> 0

ORDINEA DE RAND # 40; # 41; LIMIT 1


4. Dacă este și gol - alegeți răspunsul din partea disponibilă:

SELECTați răspunsul din 'bot' ORDER BY RAND # 40; # 41; LIMIT 1


Poate că cea mai interesantă este a doua cerere. El caută meciuri bazate pe limbajul natural. Iată diferențele:

Bai simplu pentru site
Bai simplu pentru site

Aici, de fapt, întregul creier.
Clasa PHP Bot.class.php

Folosiți acest mod (forum / say.php):

dacă # 40; $ id == 226621 # 41; # 123; // id al subiectului în care botul va răspunde

$ answer = Bot. byMessage # 40; $ msg # 41; -> getAnswer # 40; # 41; ;

`text '='". mysql_real_escape_string # 40; $ llogin. ''. $ răspuns # 41;. „„“ # 41; ;

mysql_query # 40; "UPDATE" utilizatori SET `lastdate` = '$ realtime' WHERE` id` = '". Bot. ID-ul. „„“ # 41; ;

Baza de date. Partea 2
Patru mii de mesaje sunt în mod clar mici, trebuie să completați baza de date cu ceva care corespunde temei site-ului. Parshit fiecare mesaj pe forum nu este cea mai bună opțiune - nu este clar unde este întrebarea, unde este răspunsul. Dar aici sunt mesajele care conțin citatul, ele sunt destul de potrivite pentru noi. Ei au deja o întrebare și un drept în același mesaj răspunsul.

Mai intai vom lua de la baza forumului toate mesajele care contin citatia:

SELECT `text` FROM` forum` Unde textul REGEXP '^ \\ [c (= | \]) *'


Apoi salvăm dumpul. Am un fișier de 12 MB conținând 38 de mii de înregistrări.
Acum toate aceste afaceri trebuie analizate. Din nou, cerem ajutorul Scalei.

scala de import. de colectare. mutabil. HashSet

scala de import. io. sursă

import java. io. fișier







Articole similare

Trimiteți-le prietenilor: