Lucrare de licent a [618499]

Universitatea ,,Alexandru Ioan Cuza" din Ias i
Facultatea de Matematic a
Lucrare de licent  a
Conduc ator  stint i c:
Conf. dr. Rusu D anut 
Candidat: [anonimizat] ut  a Irina
Iulie, 2019
Ia si

Universitatea ,,Alexandru Ioan Cuza" din Ias i
Facultatea de Matematic a
Motoare de c autare ^n web
Lucrare de licent  a
Conduc ator  stint i c:
Conf. dr. Rusu D anut 
Candidat: [anonimizat] ut  a Irina
Iulie, 2019
Ia si

Cuprins
Introducere 2
1 Motoare de c autare ^ n web – Introducere 4
1.1 Preg atirea documentelor pentru indexare . . . . . . . . . . . . . . . . 4
1.1.1 Analizarea documentului . . . . . . . . . . . . . . . . . . . . . 5
1.1.2 Indexarea manual a . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.1.3 Automatizarea index arii . . . . . . . . . . . . . . . . . . . . . . 7
1.1.4 Normalizarea informat iei dintr-un document . . . . . . . . . . . 9
1.1.5 Structuri de  siere . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.1.6 Management-ul interog arilor . . . . . . . . . . . . . . . . . . . 11
1.2 Rangul si feedback-ul relevant . . . . . . . . . . . . . . . . . . . . . . . 14
1.2.1 Evaluarea nal a a sistemului de c autare . . . . . . . . . . . . . 14
1.3 Interfat a utilizator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.3.1 Interfet ele motorului de c autare . . . . . . . . . . . . . . . . . . 16
2 Aplicat ie 19
Bibliogra e 49
1

Introducere
Avem a stept ari mari de la motoarele de c autare. Le adres am ^ ntreb ari vagi despre
diverse subiecte  si anticip am un r aspus concis, clar. ^In principiu, solicit am com-
puterului s a furnizeze informat iile pe care le dorim, ^ n loc de informat iile pe care
le-am cerut. Pe scurt, solicit am computerul s a g^ andeasc a intuitiv. Exist a ^ ns a o
problem a ^ n localizarea documentelor relevante pentru o interogare,  si anume dimen-
siunea mare a web-ului. P^ an a ^ n prezent, noua tehnologie se concentra mai mult pe
prelucrarea  si digitizarea informat iilor dec^ at pe organizarea lor, e ca este vorba de
text, video sau audio.
Prin decenii (sau secole) de experient  a, bibliotecarii au perfect ionat un sistem
de organizare a materialelor care intr a ^ n bibliotec a. Fiecare articol este catalogat,
pe baza evalu arii a ceea ce este vorba despre aceast a carte, urmat a de intr ari co-
respunz atoare ^ n catalogul on-line al bibliotecii sau ^ n catalogul de c art i. De si este
adesea externalizat a, ^ n esent  a, ecare carte din bibliotec a a fost individual inde-
xat a sau revizuit a pentru a se determina cont inutul acesteia. Aceast a abordare este
denumit a indexarea manual a.
Exist a c^ ateva avantaje  si dezavantaje reale pentru indexarea manual a. Un avan-
taj major este c a un indexator uman poate stabili relat ii  si concepte ^ ntre subiecte
aparent diferite, care pot foarte utile cititorilor viitori. Din nefericire, aceast a
sarcin a poate costisitoare, consumatoare de timp. De asemenea, este posibil ca
sistemul indexat manual s a nu e reproductibil dac a sistemul original a fost distrus
sau modi cat.
Din fericire, datorit a cre sterii puterii de procesare a calculatorului, computerele
au fost folosite pentru a extrage  si indexa cuvinte din documente^ ntr-un mod automa-
tizat. Acest lucru a schimbat rolul index arii manuale. Urm atoarea etap a a evolut iei
index arii automate este capabil a s a coreleze conceptele asociate chiar  si atunci c^ and
interogarea nu face o astfel de solicitare.
Una dintre cele mai put in pline de farmec  si de multe ori trecut a cu vederea p art i
a motorului de c autare este preg atirea documentelor care urmeaz a s a e c autate.
Dac a documentele nu sunt cur at ate sau puri cate prin efectuarea unor activit at i,
cum ar asigurarea faptului c a ecare document are un titlu, un marcaj ^ n e-
2

Introducere 3
care document ^ ncepe  si se termin a  si manipuleaz a p art i ale documentelor care nu
sunt text (cum ar imaginile) majoritatea motoarelor de c autare vor r aspunde prin
returnarea documentelor gre site sau a fragmentelor de documente.
O concept ie gre sit a este aceea c a informat iile care au fost formatate printr-un
editor HTML  si a  sate ^ ntr-un browser sunt su cient de formatate. Acest lucru nu
este ^ ntotdeauna gre sit, deoarece HTML a fost conceput ca un limbaj independent de
platform a. ^In general, browserele web sunt foarte "tolerante" cu documentele web,
chiar dac a acestea au erori. Cu toate acestea, motoarele de c autare au cerint e de
format mai strict  si de aceea, atunci c^ and este construit a o colet ie de documente web
pentru un motor de c autare, ecare document HTML trebuie validat ^ ntr-un format
speci c modului de indexare.
Unui utilizator de motorare de c autare nu-i pas a cum funct ioneaz a un motor de
c autare, ^ l intereseaz a doar s a obt in a informat iile pe care le-a solicitat. Aceast a ati-
tudine creaz a anumite provoc ari pentru constructorul motorului de c autare deoarece
numai utilizatorul poate decide dac a informat iile preluate r aspund nevoilor sale. ^In
recuperarea informat iei, aceasta este cunoscut a ca relevant  a. Motorul de c autare
face asta ^ n dou a moduri: clasi c^ and documentele preluate ^ n funct ie de c^ at de bine
se potrivesc feedback-ului cu ^ ntrebarea  si relevant a sau solicit^ and utilizatorului s a
identi ce care documente corespund cel mai bine nevoilor sale de informat ii  si apoi,
pe baza r aspunsului, retrimite interogarea.

Capitolul 1
Motoare de c autare ^ n web –
Introducere
1.1 Preg atirea documentelor pentru indexare
Dezvoltarea continu a a motoarelor de c autare in
uent eaz a modul de preg atire a do-
cumentelor care trebuie c autate. Dac a documentele sunt indexate automat, acestea
vor gestionate ^ ntr-un mod mult mai diferit dec^ at dac a ar fost indexate manual.
Construirea automat a a indexului este la fel de important a ca orice alt a component a
a dezvolt arii motorului de c autare.
Proiectant ii de sisteme trebuie s a ia ^ n considerare  si faptul c a nu este neobi snuit
ca un utilizator s a e conectat la mai multe baze de date diferite printr-o singur a
interfat  a de utilizator. Fiecare dintre aceste baze de date are propriul mod de a
manipula datele. De asemenea, utilizatorul nu este con stient de faptul c a el caut a
baze de date diferite. Constructorul motorului de c autare trebuie s a diminueze aceste
diferent e astfel ^ nc^ at pentru un utilizator s a nu e majore.
Crearea unul index necesit a doi pa si:
1. Analizarea modului ^ n care ecare document din ecare baz a de date este or-
ganizat ^ n constituirea unui document (titlul, autorul sau sursa)  si modul ^ n
care sunt prezentate informat iile (cele critice din text sau cele prezentate ^ n
tabele, gra ce, imagini). Deciziile trebuie luate cu privire la ce informat ii ale
documentului (numite zonare) vor indexate  si ce informat ii nu vor .
2. Extragerea termenilor semni cativi dintr-un document: trebuie luat a o decizie
cu privire la care cuvinte (sau fraze) ar trebui folosite drept repere pentru a
reprezenta cel mai bine cont inutul semantic.
4

Capitolul 1. Motoare de c autare ^ n web – Introducere 5
1.1.1 Analizarea documentului
Documentele HTML sunt compuse din multe atribute, cum ar imagini gra ce,
fotogra i, tabele, diagrame  si clipuri video, acestea ind doar caracteristicile vizi-
bile. Codul surs a al unul document HTML, are o varietate de etichete, cum ar
< TITLE > ,< COMMENT >  si< META > care sunt utilizate pentru a descrie
modul ^ n care documentul este organizat  si a  sat. ^In mod evident, documentele
hipertext sunt mai mult dec^ at text.
Orice motor de c autare trebuie s a abordeze diferent ele documentului HTML. Una
dintre schimb arile ^ n dezvoltarea motoarelor de c autare ^ n ultimii ani este c a, ^ n locul
dezvoltatorilor de motoare de c autare care se adapteaz a diferitelor tipuri de pagini
web, dezvoltatorii de pagini web ^  si adapteaz a paginile web pentru a atrage motoarele
de c autare comerciale. O ^ ntreag a industrie a ap arut pentru a se specializa ^ n ceea
ce se nume ste optimizarea motorului de c autare (SEO), elabor^ and strategii pentru a
^ mbun at at i pozit ia site-ului pe pagina de "rezultate". Motoarele de c autare trebuie
s a abordeze neuformalitatea proces arii documentelor HTML  si s a ia decizii cu privire
la modul de gestionare a unor astfel de elemente nontextuale, dup a cum urmeaz a:
< COMMENT > permite utilizatorului s a lase comentarii despre pagin a;
< ALTTEXT > un atribut care permite utilizatorului s a furnizeze o descriere
text a unei imagini ^ n cazul ^ n care utilizatorul are setul de browser numai
pentru text;
Resursele de localizare a resurselor (URL-uri) care sunt de obicei de nite ^ n
etichetele < HREF > ;
< FRAME > un atribut care controleaz a aspectul paginilor web;
< META > nu fac parte din cont inut, ci sunt folosite pentru a descrie cont inutul.
< META > tag-urile descriptive  si cuvintele cheie < META > furnizeaz a uti-
lizatorului posibilitatea de a mai speci c ^ n ceea ce prive ste ecare pagin a
web;
< TITLE > reprezint a titlul documentului;
Elementul < TABLE > reprezint a informat ia prezentat a ^ ntr-o tabel a bidi-
mensional a compus a din r^ anduri  si coloane de celule care cont in date;
< HEAD > furnizeaz a informat ii generale despre document, inclusiv titlul  si
link-uri c atre scripturi  si foi de stil;

Capitolul 1. Motoare de c autare ^ n web – Introducere 6
Elementul < SCRIPT > este utilizat pentru a ^ ncorpora sau a face referint  a
la codul executabil; acest lucru este utilizat ^ n mod obi snuit pentru a ^ ncorpora
^ n codul JavaScript;
< HTML > reprezint a r ad acina (element de nivel superior) unui document
HTML  si este denumit  si elementul r ad acin a. Toate celelalte elemente trebuie
s a e descendente acestui element.
^In trecut, unele mari motoare de c autare web evitau indexarea unora dintre
elementele nontextuale, cum ar etichetele < META > , pentru a evita probleme-
le/prejudec at ile asociate cu lista de documentele returnate. Acest lucru s-a f acut
pentru a combate dezvoltatorii web care ar supra^ ncarca tagurile < META > folo-
sind cuvinte cheie ^ n sperant a de a aduce rezultatele c aut arii ^ n favoarea lor. Acest
lucru a determinat motoarele de c autare s a schimbe ceea ce au indexat. De exem-
plu, motoarele de c autare au ignorat anterior < FRAME >  si< ALTTEXT >
^ n timpul sarcinilor lor de accesare cu crawlere, dar acum nu mai este cazul. Se
recomand a autorilor web s a acorde atent ie atribuirii valorilor c^ ampurilor de cuvinte
cheie  si descriere < META > .
Formatarea textului
^Inainte de a trece de la analiza unui document la procesarea elementelor sale indivi-
duale, este esent ial ca ecare document s a e ^ n format ASCII. Acest lucru pare s a e
o cerint  a standard, dar trebuie s a ne amintim c a unele documente sunt ad augate ^ n
colect ii prin scanare de caractere optice (OCR)  si pot reformate in formate precum
postsript. Un astfel de format restrict ioneaz a c autarea deoarece exist a mai mult ca o
imagine dec^ at ca o colect ie de elemente individuale, care pot c autate. Documentele
pot convertite de la postscript la  sierele ASCII, p^ an a la puctul ^ n care elementele
speciale  si critice ale documentului, cum ar titlul, autorul  si data, pot marcate
 si procesate ^ n mod corespunz ator.
De asemenea, dezvoltatorii de motoare de c autare trebuie s a determine modul ^ n
care vor indexa textul.
Validare
Producerea de  siere HTML valide nu este simpl a din cauza lipsei elementelor con-
secvente  si a software-ului nestandard pentru generarea HTML care genereaz a pagini
web eronate care pot face at^ at parsarea, c^ at  si a  sarea unor erori. Utilizatorii pot tri-

Capitolul 1. Motoare de c autare ^ n web – Introducere 7
mite pagina lor de web pentru revizuire  si serviciile de validare on-line pot^ mbun at at i
abilit at ile lor ^ n dezvoltarea HTML.
Pentru a identi ca ce versiune de HTML este utilizat a ^ ntr-o anumit a pagin a web,
se utilizeaz a ^ n mod obi snuit linia de comentarii a identi catorului public (FPI).
1.1.2 Indexarea manual a
Motoarele de c autare au suferit o cre stere exponent ial a a paginilor web, de la 320 de
milioane de pagini indexabile ^ n 1998 au ajuns la peste patru miliarde de pagini ^ n
2004. ^In 2002, Yahoo!  si-a ^ ntrerupt practica de a utiliza indexatoare manuale pentru
a examina adresele URL trimise ^ nainte de a le trimite crawlere-lor s a le indexeze.
Cu toate acestea, directoarele web mai mici exist a ^ nc a pe web, ele caracteriz^ andu-se
prin concentrarea lor pe subiecte speci ce. Un avantaj al acestor directoare mai mici
nu este numai c a rezultatele sunt mai relevante, dar  si faptul c a intervent ia uman a
reduce foarte mult probabilitatea de extragere a rezultatelor din context.
Recunoa sterea relat iilor  si a conceptelor ^ n documente const a ^ n a identi ca su-
biectele mai extinse, mai restr^ anse  si pe cele legate de ment inerea index arii manuale
a unei alternative viabile ^ ntr-o industrie care este oarecum dominat a de indexarea
automat a. Aceasta ofer a, de asemenea, un obictiv pentru sistemul automat de inde-
xare a capacit at ii de a fort a corect relat iile dintre documentele care la suprafat  a nu
sunt legate lexical.
1.1.3 Automatizarea index arii
Automatizarea index arii sau utilizarea algoritmilor/software-ului pentru extragerea
termenilor pentru indexare reprezint a metoda predominant a pentru procesarea do-
cumentelor din bazele de date web. Spre deosebire de conotat ia indexatoarelor ma-
nuale care sunt ascunse, viziunea indexurilor automate const a ^ n robot i automat i
computerizat i navig^ and pe tot parcursul web-ului, colect^ and documente  si index^ and
ecare cuv^ ant din text. Aceast a viziune este la fel ca cea pentru indexatoarele ma-
nuale, av^ and ^ n vedere c a robot ii sunt stat ionari  si fac cereri c atre servere ^ ntr-un
mod asem an ator cu cel al unui utilizator care solicit a un server.
O alt a diferent  a^ ntre indexarea manual a  si cea automat a este aceea c a, conceptele
sunt realizate ^ n etapa de indexare, spre deosebire de etapa de extragere/colectare a
documentelor. Aceast a caracteristic a a index arii automat a plaseaz a o presiune supli-
mentar a asupra constructorului de motoare de c autare pentru a oferi unele mijloace
de c autare a subiectelor mai extinse, mai restr^ anse sau conexe. Scopul ec arui sis-
tem este acela si: s a extrag a din documente cuvinte care vor permite unui c aut ator

Capitolul 1. Motoare de c autare ^ n web – Introducere 8
s a g aseasc a cele mai bune documente pentru a- si satisface nevoile de informare.
Motoare de c autare comerciale
Privind la caracteristicile unui motor de c autare cum a Google, Yahoo!  si Ask
Jeeves se poate obt ine o idee general a despre modul ^ n care motoarele de c autare
importante fac indexarea lor automat a. De asemenea, poate oferi informat ii despre
tipurile de decizii pe care un constructor de motoare de c autare trebuie s a le fac a
atunci c^ and extrag termenii indexului.
Fiecare motor de c autare are, de obicei, un crawler propriu, care indexeaz a ^ n
mod constant milioane de pagini pe zi. ^In timp ce unele crawlere doar caut a alea-
toriu, altele se uit a ^ n mod speci c la paginile indexate anterior pentru informat ii
actualizate sau sunt ghidate de trimiterile utilizatorului. Site-urile populate sunt
veri cate mai des, ^ n timp ce site-urile mai put in populate pot veri cate o singur a
dat a pe lun a.
Motorul de c autare sau crawlerul grabs ia numai o parte din pagina web  si o
copiaz a ^ ntr-o baz a de date mai bine localizat a, adic a atunci c^ and un utilizator tri-
mite o interogare c atre motorul de c autare, doar reprezentarea (sau submult imea)
particular a a motorului de c autare este defapt c autat a. Numai atunci utilizatorul
este direct ionat la adresa URL corespunz atoare. Acest lucru explic a motivul pentru
care link-urile din rezultatele c aut arii sunt nevalide sau redirect ionate  si important a
motoarelor de c autare pentru actualizarea bazelor de date existente.
Cu toate acestea, exist a limite pentru ce motoare de c autare sunt dispuse sau
capabile s a indexeze pe pagina web. De exemplu, crawlerul web Google capteaz a ^ n
jur de 100 Kde texte pe pagina web, ^ n timp ce Yahoo! capteaz a aproximativ 500 K.
Odat a ce paginile web sunt captate, instruct iunile sunt stabilite ^ n prealabil cu pri-
vire la ceea ce este exact indexat. Deoarece majoritatea documentelor sunt scrise
in HTML, ecare motor de c autare trebuie s a decid a ce s a fac a cu cadre, site-uri
protejate prin parol a, comentarii, meta tag-uri  si imagini. Proiectact ii motoarelor
de c autare trebuie s a stabileasc a ce p art i ale documentului sunt cei mai buni indi-
catori ai documentului pentru clasarea viitoare. ^In funct ie de tipul motorului de
c autare, cuvintele din < TITLE >  si< META > sunt deobicei examinate , pre-
cum  si link-urile care apar pe pagin a. Ment inerea num arului sau a frecvent elor de
cuv^ ant ^ n ^ ntrega pagin a web este esent ial a pentru determinarea important ei globale
a cuvintelor.
Exist a multe motive pentru care motoarele de c autare indexeaz a automat, cel
mai important motiv ind timpul. ^In plus, motorul de c autare nu poate s a copieze

Capitolul 1. Motoare de c autare ^ n web – Introducere 9
ecare milion de documente pe web f ar a a epuiza capacitatea de stocare disponibil a.
Un alt motiv critic pentru utilizarea acestei metode este de a controla modul ^ n care
se adaug a noi documente ^ n colect ie. Dac a cineva ar ^ ncerca s a "indexeze ^ n zbor",
ar di cil s a e controlat
uxul de ad augare a unor noi documente. Preluarea
documentelor  si construirea unui index ofer a o infrastructur a u sor de gestionat pentru
recuperarea  si stocarea informat iilor.
Una dintre cele mai dramatice schimb ari pentru motoarele de c autare comerciale
din ultimii c^ at iva ani a fost trecerea de la folosirea ponderii termenului de analiz a
bazat a pe structur a pentru a determina modul^ n care paginile se clasi c a atunci c^ and
rezultatele c aut arii sunt returnate. Cu alte cuvinte, paginile relevante sunt cele care
au pagini care le indic a. Google a luat aceste tehnici bazate pe structura link-urilor
pentru a deveni principalul juc ator pe piat a motoarelor de c autare comercial a.
1.1.4 Normalizarea informat iei dintr-un document
Construirea unui index reprezint a mai mult dec^ at extragerea cuvintelor  si constru-
irea unei structuri de date pe baza aparit iilor lor. Cuvintele trebuie s a e t aiate
^ nainte de a plasate ^ n orice structur a de  siere inversat a. Acest proces este numit
normalizarea informat iei dintr-un document.
Cu alte cuvinte, o parte din preg atirea informat iei ia cea mai mic a unitate a
documentului, ^ n majoritatea cazurilor cuvinte,  si construirea de structuri de date
care pot c autate. Cuvintele sunt rede nite ca simboluri (litere, numere) ^ ntre sim-
bolurile de interfat  a, cum ar semnele. Un motor de c autare trebuie s a ia decizii
cu privire la modul de gestionare al cuvintelor, al numerelor  si al punctuat iei. Do-
cumentele nu sunt alc atuite doar din cuvinte, ele sunt compuse din indicative de
procesare. Identi carea indicativelor de procesare constituie prima parte a norma-
liz arii elementului. Caracterizarea indicativelor (derivarea semni cat iei unui cuv^ ant
bazat pe context) poate tratat a dupa nalizarea normaliz arii.
Urm atorul pas ^ n normalizarea elementului este aplicarea listelor de oprire la
colectarea indicativelor de procesare. Listele de oprire sunt liste cu cuvinte care au
o valoare mic a sau nu au deloc valoare ca termen de c autare. Din punct de vedere
al comprim arii datelor, listele de oprire elimin a necesitatea de a gestiona cuvintele
inutile  si de a reduce dimensiunea textului  si cantitatea de timp  si spat iu necesare
pentru a construi structuri de date care pot c autate.
Cu toate acestea, valoarea elimin arii cuvintelor stop pentru un  sier inversat com-
primat este discutabil a. Aplicarea unei liste de oprire reduce dimensiunea indexului,
dar cuvintele care sunt omise sunt de obicei cele care necesit a cel mai mic num ar de
bit i pe indicator pentru a stocate, astfel ^ nc^ at economiile globale de stocare s a nu
e at^ at de impresionante.

Capitolul 1. Motoare de c autare ^ n web – Introducere 10
1.1.5 Structuri de  siere
Una dintre leg aturile universale ale tuturor sistemelor de recuperare a informat iilor  si
a bazelor de date este structura de  siere inversat a (IFS), o serie de trei componente
care urm aresc ce documente cont in termenii indicatori. IFS ofer a o comand a rapid a,
critic a ^ n procesul de c autare. ^In locul c aut arii ^ ntregii baze de date pentru terme-
nii speci ci dintr-o interogare, IFS organizeaz a informat iile ^ ntr-o list a abreviat a de
termeni, care apoi, ^ n funct ie de termen, se refer a la un anumit set de documente.
Ambele metode funct ioneaz a, dar a doua metod a este mult mai rapid a.
Cele trei componente ale unui IFS sunt  sierul, dict ionarul  si lista invers a.
Fi sierul este locul ^ n care ec arui document i se atribuie un identi cator unic
de num ar  si se identi c a tot i termenii (indicativele de procesare) din cadrul
documentului;
Dict ionarul este o list a sortat a a tuturor termenilor unici (indicativele de pro-
cesare) din colet ie ^ mpreun a cu indicii ^ n lista de inversiuni;
Lista invers a cont ine indicatorul din termenul ^ n care documentele cont in acest
termen.
Primul pas ^ n crearea unui IFS este extragerea termenilor care ar trebui folosit i
^ n index  si atribuirea ec arui document unui num ar unic. Din simplitate, ecare
linie a bibliotecii poate utilizat a pentru a reprezenta un document. Nu numai c a
se elimin a semnele de punctuat ie, dar acele cuvinte frecvent folosite au o valoare
mic a ^ n c autare  si astfel se g asesc ^ n listele de oprire  si nu sunt extrase pentru index.
Aceasta ^ nseamn a c a un procent semni cativ din cuvinte nu sunt indexate, reduc^ and
cerint ele de spat iu de stocare pentru sistem.
Al doilea pas este extragerea termenilor  si crearea unui dict ionar de termeni care
s a poat a c autat. Pentru a facilita c autarea, termenii ar putea aranjat i ^ n ordine
alfabetic a; cu toate acestea, exist a alte strategii de economisire a timpului  si stoc arii
care pot implementate. ^In loc de cuvinte ^ ntregi, cuvintele semni cative procesate
sunt ^ mp art ite la un nivel molecular scris de litere pentru implement arile structurale
speci ce de date, adic a o reorganizare a datelor ^ n a sa fel ^ nc^ at s a permit a c autarea
mai e cient a. Dou a structuri de date bine cunoscute pentru prelucrarea dict ionarelor
sunt N-grame  si arbori PAT.
Uneori, lista de dict ionar ar putea indica  si num arul de aparit ii a termenului ^ n
baza de date a documentului.
Ultimul pas ^ n construirea unui IFS const a ^ n amestecarea listei de dict ionare  si
listei de documente pentru a forma lista de inversiuni care indic a un anumit document
atunci c^ and este selectat un termen. Pe l^ ang a indicarea unui document speci c,

Capitolul 1. Motoare de c autare ^ n web – Introducere 11
listele de inversiuni pot construite pentru a indica o zon a sau o anumit a sect iune
a documentului ^ n care termenul este utilizat.
Listele de inversiuni sunt mai so sticate dec^ at cele descrise p^ an a acum, mai ales
atunci c^ and motorul de c autare trebuie s a sust in a fraze de cuv^ ant ^ nvecinate. O
fraz a contigu a de cuv^ and este utilizat a atunci c^ and utilizatorul solicit a combinat ii
speci ce de cuvinte.
De asemenea, nu exist a o regul a bun a  si rapid a care s a permit a crearea unui singur
sistem de  siere inversat pentru o colect ie de documente. IFS-urile separate pot
dezvoltate pentru diferite zone sau port iuni ale documentelor, cum ar titlul sau
rezumatul. Un sistem de  siere inversat ar putea construit doar pentru autori cu
un set speci c de reguli, cum ar listele de oprire. Acest lucru permite utilizatorului
s a caute mai repede c^ ampurile speci ce din baza de date.
^In timp ce IFS este utilizat ^ n mod obi snuit pentru a construi un index, exist a
 si alte abord ari. O alternativ a este utilizarea  sierelor de semn aturi ^ n care ter-
menii sunt convertit i ^ n  siruri binare. Cuvintele dintr-o interogare sunt mapate la
semn aturile lor, iar c autarea presupune potrivirea pozit iilor de bit i cu semn aturile
elementelor/documentelor. ^Intr-un sens,  sierul de semn atur a are o abordare opus a
^ n comparat ie cu IFS. ^In timp ce IFS se potrive ste cu interogarea cu termenul,
 sierul de semn atur a elimin a toate nepotrivirile. Dup a suprapunerea unor  siere
de semn aturi diferite, semn atura interog arii este comparat a, iar nepotrivirea intr a
de-a lungul drumului. ^In general, documentele care corespund semn aturilor r amase
sunt apoi c autate pentru a vedea dac a termenii de interogare exist a ^ ntr-adev ar ^ n
acele documente.
De si  sirurile binare pot deveni destul de mari, blocarea poate folosit a pentru
a combina semn aturile  si pentru a facilita c autarea. O variant a de reprezentare a
 sierului de semn atur a este bitmap, adic a o reprezentare ^ n care ecare element co-
respunde cu unul sau mai mult i bit i de informat ii, ^ n special cu informat iile utilizate
pentru a controla a  sarea. Pentru un anumit document, ecare bit asociat cu un
termen utilizat ^ n acel document este setat la unul. Tot i ceilalt i bit i sunt setat i la
zero. Pentru documentele lungi, vor produse  siruri binare foarte lungi, iar cerint ele
de stocare complet pentru colect ii de documente mari pot face acest a abordare im-
practicabil a.
Fi sierele de semn aturi necesit a mai mult spat iu dec^ at  sierele inversate compri-
mate  si sunt deobicei concepute pentru a gestiona bazele de date convent ionale mari.
1.1.6 Management-ul interog arilor
Selectarea celui mai e cient motor de c autare poate depinde de tipul de interogare
permis, care, la r^ andul s au, depinde de modelul de indexare folosit pentru un motor

Capitolul 1. Motoare de c autare ^ n web – Introducere 12
de c autare. Unele tipuri de motoare de c autare gestioneaz a mai bine anumite tipuri
de interog ari, ^ ns a utilizatorul poate avea ^ n totalitate un alt tip de interogare.
Interogarea este un termen general care descrie procesul de trei nivele de traducere
a nevoii utilizatorului ^ ntr-o interogare a motorului de c autare.
1.^In primul nivel, utilizatorul formuleaz a nevoia de informat ii ^ ntr-o ^ ntrebare sau
o list a de termeni, folosind propriile experient e  si introduc^ and-o ^ n motorul de
c autare;
2. La nivelul al doilea, motorul de c autare trebuie s a traduc a cuvintele (cu posibile
erori de ortogra e) ^ n indicativele de procesare;
3. La cel de-al treilea nivel, motorul de c autare trebuie s a utilizeze indicative de
procesare pentru a c auta ^ n baza de date a documentului  si pentru a prelua
documentele corespunz atoare.
^In practic a, utilizatorii pot introduce interogarea lor ^ ntr-o varietate de moduri
diferite; ca o a rmat ie boolean a, ca o ^ ntrebare, ca o list a a termenilor cu operatori
de proximitate  si fraze de cuv^ ant contigue sau cu utilizarea unui tezaur. Problemele
apar atunci c^ and motoarele de c autare nu pot accepta toate tipurile de interog ari.
O interogare care utilizeaz a un operator boolean, cum ar AND sau OR, trebuie s a
e procesat a diferit dec^ at o interogare de limb a natural a. Construirea unui motor de
c autare pentru a accepta un anumit tip de interogare ^ l oblig a pe utilizator s a ^ nvet e
cum s a introduc a interog arile ^ n acest mod.
Acest lucru nu ^ nseamn a c a un tip de interogare este mai bun dec^ at altul, ci mai
degrab a s a subliniem c a exist a mai multe tipuri de interog ari, iar designul motorului
de c autare este extrem de dependent de ce tip de interog ari va accepta motorul de
c autare. O parte a alegerii tipului de interogare depinde  si de anticiparea celui care va
folosi motorul de c autare. Un c autator f ar a experient  a prefer a o interogare de limb a
natural a, ^ n timp ce un profesionist de informat ii familializat cu funct iile avansate de
c autare prefer a un sistem care poate efectua c autari booleene sau c aut ari utiliz^ and
parametri de proxemitate  si fraze de cuv^ ant contigue.
Exist a mai multe tipuri de interog ari. Fiecare tip trebuie evaluat^ n funct ie de mo-
dul ^ n care utilizatorul acceseaz a o pagin a web  si de ceea ce a steapt a ^ n schimb, punc-
tele forte  si limit arile acestuia  si compatibilitatea cu designul motorului de c autare.
Nu exist a reguli rapide atunci c^ and se discut a despre compatibilitatea cu motorul
de c autare. De asemenea, este interesant de observat c a tendint a actual a pentru
majoritatea sistemelor operat ionale este de a aplica o combinat ie de interog ari cu
sperant a c a utilizatorii vor a
a cele mai bune strategii de utilizat pentru un anu-
mit sistem. Unele sisteme sunt mai amestecate dec^ at altele  si ofer a aleg atorilor de
informat ii opt iuni ^ ntre potrivirea exact a (lexical a)  si abord arile booleene.

Capitolul 1. Motoare de c autare ^ n web – Introducere 13
1.Interog ari booleene
Cuvintele logice  si cuvintele de c autare interact ioneaz a folosind operatori pre-
cum AND, OR  si NOT. Operatorul NOT oblig a sistemul s a exclud a membrii
din setul de rezultate returnat. Una dintre punctele slabe ale interog arii este
c a nu pare s a existe o modalitate bun a de a m asura semni cat ia ^ ntr-o intero-
gare booleean a. Majoritatea utilizatorilor de sisteme informatice nu sunt bine
instruit i ^ n operatorii booleeni.
2.^Intreb ari de limb a natural a
^Intreb arile de limb a natural a (NQL) sunt ^ ntreb ari pe care utilizatorul le for-
muleaz a ca o ^ ntrebare sau ca o declarat ie. Pentru a procesa un NQL, motorul
de c autare trebuie s a extrag a tot i termenii indexat i pentru a init ia o c autare.
Evident, unele cuvinte din interogare vor eliminate prin utilizarea listelor
de oprire. Aceast a abordare, are dezavantajul c a odat a ce extragi un cuv^ ant
dintr-un NQL, contextul ^ n care se folose ste acest cuv^ ant devine pierdut.
3.Chestionarele tezaurului
Interogare tezaurului reprezint a selectarea unui termen dintr-un set anterior
de termeni de c atre un utilizator. Avantajul acestei interog ari este c a prima
faz a a leg arii interog arii este automatizat a pentru utilizator. Pe de alt a parte,
utilizatorul este legat de termenul tezaur, chiar daca nu consider a ca terme-
nul este cea mai bun a alegere. Mai mult, pot exista probleme cu ^ nt elegerea
semni cat iei speci ce a unui cuv^ ant.
Tezaurele tind s a e generice unei limbi  si pot astfel s a introduc a/insereze
numero si termeni de c autare care nu au fost niciodat a indexat i sau g asit i ^ n
colect ie.
4.C aut ari pe termen lung
Cel mai r asp^ andit mod de interogare (mai ales pe web) este atunci c^ and un uti-
lizator ofer a c^ ateva cuvinte sau fraze pentru c autare. Lista invers a nu trebuie
s a urm areasc a doar termenii care apar ^ n documente, ci  si pozit ia acestor ter-
meni din documente, pentru a oferi sprijin operatorilor de vecin atate  si frazelor
contigue. Acest lucru necesit a o capacitate mai mare de stocare  si prelucrare.
O dilem a pentru utilizator este s a decid a ce termeni s a furnizeze. Utilizatorii
au tendint a de a scrie doar doi sau trei termeni. Ar bine dac a sistemul ar
orientat spre potrivire sau bazat pe operatorul boolean OR. Totu si, utilizatorul
poate s a nu realizeze c a interogarea (^ n acest caz) ar putea mai mult o repre-
zentare pseudo-documentar a pentru potrivirea conceptual a, spre deosebire de
un  sir lung de termeni pentru potrivirea lexical a.

Capitolul 1. Motoare de c autare ^ n web – Introducere 14
1.2 Rangul si feedback-ul relevant
La ^ nceput pare c a toate motoarele de c autare au acelea si caracteristici de baz a, dar
exist a un aspect care separ a mai multe motoare de c autare complete  si funct ionale
de echivalent ele lor mai mici. Acest lucru nu este doar abilitatea de a lista rezultatele
c aut arii ^ ntr-un mod semni cativ, permint ^ and utilizatorului s a aib a  sansa de a utiliza
aceste rezultate pentru a retrimite a alt a interogare mai mult pe t int a. Caracteristica
numit a feedback de relevant  a a fost destul de e cient a pentru a ajuta utilizatorii s a
g aseasc a documentele mai relevante cu mai put in efort.
^In timp ce designerii de calculatoare continu a ^ n ^ ncercarea de lor a face com-
puterele mai receptive la utilizatori, feedback-ul privind rang-ul  si relevant a poate
considerat ca o c autare extrem de interactiv a a informat iilor, acesta ind un alt
avantaj al feedback-ului de clasi care  si relevant  a.
Unele sisteme comerciale limiteaz a aceast a caracteristic a  si aleg s a renunt e la
construirea acesteia ^ n sistem, deoarece feedback-ul privind relevant a poate crea sar-
cini computat ionale care pot ^ ncetini un sistem. De asemenea, necesit a o actualizare
constant a a cuno stint elor sistemului ^ n sine, deoarece pentru ca motorul de c autare
s a  stie dac a un anumit document este cel mai bun trebuie s a  stie ce cont ine ecare
document din sistem.
1.2.1 Evaluarea nal a a sistemului de c autare
Evaluarea nal a a oric arui sistem de c autare este determinat a de p arerea utilizato-
rului, dac a acesta este mult umit de rezultatele c aut arii  si dac a informat iile au fost
satisf acute^ n timp util. ^In acest caz, sistemul  si utilizatorul sunt declarat i c^ a stig atori.
Satisfact ia utilizatorului poate m asurat a ^ ntr-o varietate de moduri: binare
(adic a rezultatele sunt acceptabile sau inacceptabile) sau relative (de exemplu, se
clasi c a pe locul 5 pe o scar a de la 1 la 10, 10 ^ nsemn^ and perfect). De asemenea,
trebuie luate ^ n considerare  si alte considerente atunci c^ and se evalueaz a un sistem,
cum ar dac a utilizatorul nu a obt inut rezultatele dorite din cauza unei interog ari
slabe. Cuv^ antul gre sit, nevoia ca ghilimelele s a e ad augate la o fraz a sau lipsa de
^ nt elegere a ceea ce este solicitat s a e c autat poate afecta, de asemenea, performant a
unui motor de c autare.
Utilizatorii nu vor tolera mai mult de trei sau patru ^ ncerc ari de a readuce
informat ii ^ n sistem, iar utilizatorul nu consider a c a acela si set de documente apare
din nou  si din nou. Acest lucru scoate la iveal a o dilem a interesant a pentru designerul
de sistem. De exemplu, dupa ce at i primit o list a de documente, s a presupunem c a
utilizatorul marcheaz a un anumit document ca ind recuperat mai mult ca acesta.
^In noua list a de rezultate ar trebui ca acest document s a e automat ^ n partea de sus

Capitolul 1. Motoare de c autare ^ n web – Introducere 15
a listei urm atoare, chiar dac a ar putea clasate mai jos dec^ at noul set de documente.
Apoi, din nou, dac a documentul nu se a
 a ^ n partea de sus a listei, utilizatorul se
poate ^ ntreba de ce.
Astfel de probleme nu au ^ mpiedicat cercet atorii s a elaboreze anumite standarde
pentru a discuta cel put in despre rezultatele unei c aut ari, e c a este vorba despre
c autarea pe web, o baz a de date on-line sau un CD-ROM.
Precizia  si relevant a sunt doua dintre de nit iile standard utilizate ^ n evaluarea
sistemului de c autare  si, deoarece sunt at^ at de str^ ans legate, sunt discutate ^ n paralel.
Precizie
Precizia sau raportul de precizie P al unei metode de c autare este de nit prin:
P=Dr
Dt;
undeDreste num arul de documente g asite  si Dteste num arul total de documente
scanate. Doi c aut atori pot c auta acelea si informat ii pe aceeat i tem a, iar atunci c^ and
rezultatele sunt g asite, unul dintre c aut atori le poate considera utile sau relevante,
^ n timp ce cel alalt c aut ator le poate considera irelevante  si nefolositore, deci precizia
este subiectiv a.
Relevant a
Relevant a sau raportul de relevant  a R al unei metode de c autare este de nit prin:
R=Dr
Nr;
undeDreste num arul de documente g asite  si Nreste num arul total de documente
scanate din colect ie. Ratele de relevant  a sunt oarecum di cil de obt inut, deoarece
num arul total de documente relevante este ^ ntotdeauna necunoscut.
Dac a un utilizator dore ste doar documentele care se potrivesc cerint elor sale,
interogarea va necesita termeni foarte speci ci. Cu toate acestea, multe documente
relevante se pot pierde dac a c autarea este extrem de precis a. Acest lucru explic a rolul
integral al relevant ei. C autarea trebuie extins a astfel ^ nc^ at un num ar semni cativ de
documente relevante s a e incluse ^ n rezultatele c aut arii. Un utilizator are nevoie ^ n
general de un subset complet de documente relevante care nu necesit a o examinare
substant ial a din toate materialele irelevante.

Capitolul 1. Motoare de c autare ^ n web – Introducere 16
1.3 Interfat a utilizator
Conceptul de interfat  a cu utilizatorul sau crearea unui instrument pe care oamenii ^ l
utilizeaz a pentru a interanct iona cu motorul de c autare reprezint a o parte important a
a domeniului ^ n cre stere al interact iunii om-calculator (HCI). Semni cat ia interfet ei
cu utilizatorul nu poate subliniat a su cient, deoarece de multe ori utilizatorul
va judeca performant a motorului de c autare, nu rezultatele nale ale c aut arii. De
exemplu, dac a exist a incertitudini cu privire la modul ^ n care motorul de c autare
se va ocupa de termenii de c autare sau dac a rezultatele relevante nu sunt ceea ce
utilizatorul a c autat, atunci exist a posibilitatea ca utilizatorul s a e nemult umit.
Proiectant ii de interfat  a sunt^ ncurajat i s a elaboreze linii directoare pentru ceea ce
ar trebui s a fac a interfat a, adic a ce sarcini trebuie s a e efectuate pentru utilizatori.
Poate necesar ca o interfat  a pentru un utilizator general cu abilit at i de c autare
limitat a s a e mult mai diferit a de cea pentru un c aut ator cali cat. C aut atorul
cali cat prefer a s a ^ nt eleag a modul ^ n care opereaz a c autarea pentru a-i ^ ngusta
sau l argi  si pentru a- si asigura minut iozitatea, ^ n timp ce ^ ncep atorul dore ste doar un
r aspuns. Sistemele nu ar trebui s a g azduiasc a numai c aut atori analitici  si structurat i,
ci  si important a navig arii nestructurate, care poate considerat a o metod a valoroas a
de ^ nv at are pentru mult i utilizatori potent iali. ^In plus, distinct ia dintre c autarea
plani cat a  si navigarea simpl a este deseori neclar a.
Instrumentele de construct ie ale interfet ei se a
 a ^ ntr-o stare continu a de evolut ie.
Acestea includ instrumente cum ar gramatici, arbori de select ie a meniurilor  si di-
agrame de tranzit ie care pot utilizate pentru a de ni speci cat iile pentru interfat  a.
Init ial, pentru a construi interfet ele s-au construit programe de calculator scrise ^ n
limbi precum Java, C  si C++, ^ ns a acestea au fost ^ nlocuite cu instrumente software
mai puternice  si mai speci ce, care scurteaz a timpul pentru layout-urile init iale  si
revizuirile ulterioare.
1.3.1 Interfet ele motorului de c autare
De si dispune de instrumente potrivite pentru construirea interfet ei ^ ntre motorul
de c autare  si utilizator, este important modul ^ n care caracteristicile motorului de
c autare se vor manifesta ^ n interfat a cu utilizatorul. Premisa fundamental a ^ n toate
interfet ele utilizatorilor este c a, ^ n mod ideal, interfat a trebuie proiectat a astfel ^ nc^ at
s a r aspund a nevoilor unui utilizator. Acest lucru creeaz a probleme ^ n interfet ele
pentru motoarele de c autare, deoarece gama de experient  a ^ n utilizatorii motoarelor
de c autare variaz a de la ^ ncep ator la expert. ^Imbun at at irea continu a a problemelor
de proiectare a interfet ei este din cauza nevoilor de informare ale utilizatorilor, care
variaz a de la identi carea facturilor speci ce  si cele legate de navigare  si explorare. O

Capitolul 1. Motoare de c autare ^ n web – Introducere 17
interfat  a trebuie s a poat a gestiona ambele tipuri de c aut ari. ^In mod ideal, sistemele
ar trebui s a e capabile s a g azduiasc a init ial utilizatorii care, ^ n timp ce c^ a stig a
experient  a cu sistemul, pot necesita o gam a mult mai larg a de instrumente de c autare
pentru compunerea, salvarea  si revizuirea interog arilor.
Completarea formularului
^In prezent, stilul predominant de c autare este o completare simpl a a formularului,
^ n care utilizatorul introduce o interogare ^ n linia goal a desenat a pe ecran. Aceasta
este o sarcin a simpl a, logic a  si u sor de ^ nv at at de c atre utilizator, ceea ce explic a
popularitatea acestora. Cu toate acestea, uneori spat iul nu este su cient de mare
pentru mai mult dec^ at una sau dou a cuvinte, ceea ce poate ^ mpiedica utilizatorul s a
ofere termeni suplimentari care ar putea folositori ^ n c autare.
De asemenea, trebuie luat^ n considerare modul^ n care utilizatorul trimite/invoc a
interogarea. ^In mod interesant, dac a ne uit am la motoarele de c autare comerciale
actuale (de exemplu: Google, Yahoo!), exist a un singur formular de interogare, de
obicei de o singur a linie, dar un link c atre un formular de c autare mai avansat.
Acest formular avansat poate cont ine meniuri derulante care permit utilizatorului s a
regleze interogarea exact a a potrivirilor de cuvinte, a tipurilor de domenii c autate
etc. Aceast a c autare avansat a necesit a mai mult a g^ andire, timp  si efort din partea
utilizatorului.
NQL-urile, ^ n cazul ^ n care utilizatorul a fost ^ ncurajat s a- si scrie cererea sub
form a de^ ntrebare, au fost accentuate^ n ultimii ani. Consensul general a fost c a aces-
tea sunt mai lente pentru procesarea interog arii, iar NQL-urile induc ^ n eroare utili-
zatorul s a cread a c a calculatoarele sunt de fapt capabile s a ^ nt eleag a limba uman a.
Indicarea progresului
Un indicator de progres sau o noti care temporar a pe ecran este o caracteristic a
necesar a. Cu alte cuvinte, ^ n timp ce c autarea este efectuat a, utilizatorul trebuie s a
 stie ce face sistemul cu interogarea. O solicitare ,,A steptat i v a rog" sau un anumit tip
de ,,num ar atoare invers a" vizual a pentru a l asa utilizatorul s a  stie c a rezultatele care
vin sunt su ciente ^ n aceast a situat ie. ^In mod ironic, ^ n timp ce este important ca
rezultatele s a vin a rapid (de exemplu ^ ntre 2  si 5 secunde), exist a o problem a pentru
utilizatori dac a se ^ ntorc prea repede, adic a instantaneu. Acest lucru este u sor de
^ nt eles. De exemplu, dac a utilizatorul introduce un termen de c autare  si apas a tasta
de ^ ntoarcere  si motorul se ^ ntoarce ^ ntr-o jum atate de secund a cu ,,Nu s-au g asit

Capitolul 1. Motoare de c autare ^ n web – Introducere 18
rezultate", apare un anumit scepticism dac a motorul a c autat a acceptat vreodat a
ceva. ^In acest caz, dac a a steptarea era doar o secund a sau dou a, utilizatorul ar
probabil mult umit c a cel put in motorul de c autare a executat corect.
Rezultate
Rezultatele motorului de c autare sau abilitatea unui utilizator de a manipula rezul-
tatele motorului de c autare reprezint a o zon a ^ n care utilizatorii par s a acceptat
un standard mai mic dec^ at ceea ce ar trebui s a e. P^ an a ^ n prezent, tariful standard
are sute, p^ an a la mii de rezultate a  sate ^ n ordinea relevant ei lor cu termenii de
c autare subliniat i ^ n descrieri scurte sau fragmentate. Cu toate acestea, exist a loc de
^ mbun at at ire.
Se recomand a dezvoltatorilor s a salveze timpul unui utilizator, evit^ and a  sarea
scorurilor de c autare (procente sau pictograme), deoarece este o pierdere a timpului
utilizatorului s a interpreteze. Lista de documente ar trebui s a poat a manipulat a
^ n ceea ce prive ste num arul de rezultate  si abilitatea de a schimba ordinea, e c a
este alfabetic, cronologic sau ^ n termeni de relevant  a. Gruparea rezultatelor dup a
valoarea sau subiectul atributului reprezint a o posibilitate pe care proiectant ii ar
trebui s a o aib a ^ n vedere.
Testarea
Interfat a trebuie testat a de persoane care nu au f acut parte din echipa de design
init ial a. Acest lucru nu necesit a zeci de indivizi. Patru sau cinci utilizatori la nivel
de cali care adecvat, care sunt capabili s a- si comunice observat iile pe o versiune de
test a unei interfet e, vor surprinde orice erori grave ^ n proiectare. Marchionini vede
avantajul studierii continue  si testarea interfet elor utilizatorilor. De asemenea, el nu
reduce cu at^ at mai mult important a uit arii la modelele  si strategiile utilizatorilor
novici. ^Intr-un fel, ace stia sunt utilizatorii mai naturali  si, prin urmare, interfet ele
trebuie s a e adaptate pentru a se potrivi preferint elor lor, ^ n loc de viceversa.

Capitolul 2
Aplicat ie
Un motor de c autare este un program c aut ator apelabil, care acceseaz a Internetul
^ n mod automat  si frecvent  si care stocheaz a titlul, cuvinte cheie  si, part ial, chiar
cont inutul paginilor web ^ ntr-o baz a de date. ^In momentul ^ n care un utilizator
apeleaz a la un motor de c autare pentru a g asi o informat ie, o anumit a fraz a sau
un cuv^ ant, motorul de c autare se va uita ^ n aceast a baz a de date  si, ^ n funct ie de
anumite criterii de prioritate, va crea  si a  sa o list a de rezultate.
^In aplicat ia ce urmeaz a ne-am propus s a construim un motor de c autare demon-
strativ.
Problema nu este una minor a deoarece exist a peste 100 de milioane de site-uri
web care ^ nsumeaz a milioane de pagini web pe tot globul. Faptul c a acestea ^  si
schimb a cont inutul ^ n mod dinamic face di cil a returnarea rezultatelor. R aspunsul
la o comand a trebuie s a e rapid (^ n mai put in de o secund a), chiar  si atunci c^ and
lista de rezultate cont ine un num ar mare de pagini returnate.
Deoarece c autarea informat iilor pe toate site-urile web de pe internet presupune
foarte multe resurse hardware pentru stocarea informat iilor culese din web, ne-am
limitat la indexarea doar pe un anumit site  si anume site-ul facult at ii de matematic a
(https://www.math.uaic.ro).
Aplicat ia se folose ste ^ n felul urm ator: are o aplicat ie facil a de tip HTML ^ n care
utilizatorul scrie textul c aut arii ^ ntr-o caset a text. C^ and este trimis a cererea, motorul
o parseaz a, caut a cuvintele ^ ntr-un  sier index asociat site-ului respectiv. Rezulta-
tele c aut arii sunt furnizate ca o list a de link-uri c atre paginile ce cont in cuvintele
respective.
Aplicat ia a fost construit a folosind limbajul HTML, CSS  si JAVASCRIPT  si se
refer a doar la partea de c autare, nu  si la partea de indexare.
^In continuare vom prezenta detaliile de implementare ale aplicat iei.
Primul pas ^ n acest proces este crearea unei interfet e de c autare pentru utilizator.
Pentru a crea interfat a, avem nevoie de dou a elemente:
19

Capitolul 2. Aplicat ie 20
1. O caset a text pentru introducerea cuvintelor ce urmeaz a a c autate.
2. Un buton pentru pornirea c aut arii.
1<! DOCTYPE html >
2<html >
3<head >
4<meta http – equiv =" Content – Type " content =" text / html ;
charset =utf -8">
5<title > Motor de cautare demonstrativ </ title >
6<meta name =" viewport " content =" width =device -width , initial
– scale =1, maximum – scale =1">
7<link href =" https :// fonts . googleapis .com /css ? family = Squada
+One| Source + Code +Pro| Merriweather :300| Abril + Fatface "
8rel =" stylesheet ">

Capitolul 2. Aplicat ie 21
9<script src =" https :// ajax . googleapis .com / ajax / libs / jquery
/3.3.1/ jquery .min .js" ></script >
10<link href =" https :// cdnjs . cloudflare .com / ajax / libs /
normalize /8.0.1/ normalize .min.css">
11<link rel =" stylesheet " href ="inc / standard .css ">
12<script src =" setari_proiect .js" ></script >
13<script src =" dictionar .js" ></script >
14<link rel =" stylesheet " href =" proiect .css ">
15<script src =" proiect .js" ></script >
16</head >
17<body >
18
19<div class =" cont ">
20<div class =" head ">
21<div class =" block " style =" padding -top : 79 px;">
22</div >
23</div >
24<div class ="block -790 ">
25<div class =" slab fo -2" style ="text – align : center ;">
26<h><b>
27Motor de cautare demonstrativ
28</b ></h>
29</div >
30</div >
31
32<div class ="block -978 " style =" padding – bottom : 59 px;">
33<div style =" padding -top : 10 px;" ><h2 ></h2 ></div >
34<div class ="fo -3" style =" padding -top : 17 px;">
35Cauta dupa un anumit cuvant
36</div >
37<div style =" padding -top : 36 px;">
38<form >
39<div class =" project_search_group ">
40<input type =" text " name ="q" id=" project_search_input "
pattern =".{3 ,}" title ="Cel putin 3 caractere "
41required >
42<button type =" submit " class =" project_search_button ">
43<div class =" project_search_icon " >&#9906; </ div >

Capitolul 2. Aplicat ie 22
44</button >
45</div >
46</form >
47<div id=" project_search_content " ></div >
48</div >
49</div >
50</div >
51<footer class =" footer ">
52<h4 > Proiect licenta </h4 >
53<h4 > Sesiunea Iulie , 2019 </ h4 >
54<h4 > Student : Cosuta Irina </h4 >
55</footer >
56</body >
57</html >
Toat a funct ionalitatea este ^ n butonul de c autare, care ruleaz a scriptul prezentat
mai jos. Observat i c a primul lucru pe care scriptul ^ l face este s a testeze textul de
c autare. C autarea va difuzat a numai atunci c^ and textul de c autare nu este gol.
Urm atoarea parte a scriptului folose ste locat ia  sierului curent pentru a determina
calea complet a la  sierele index, exact aceea si con gurare ca ^ n scriptul precedent.
^In nal, este apelat a interogarea de c autare.
^In urma c aut arii, pentru caseta de tip input care trimite informat ia sunt folosite o
serie de funct ii care parseaz a  si trimit ^ n index. Exist a o funct ie de pornire a c aut arii
 si, atunci c^ and este nalizat a, rezultatele sunt a  sate utilizatorului.
1<script >
2$( document ). ready ( function () {
3$('# project_search_input '). project ();
4});
5</script >
Pentru a face funct ionabil acest script, am creat o funt ie care …
1( function ($) {
2
3// instantiem proiectul
4$.fn. project = function ( optiuni ) {
5

Capitolul 2. Aplicat ie 23
6var setari = $. extend ({
7' bufferulContextului ': 60,
8' lungimeaContextului ': 60,
9' startulContextului ': 90,
10'arataScor ': true ,
11' cuvinteDescriptive ': 25,
12' paginiSubsol ': 3,
13' ingrosareTermeniCautati ': true ,
14'zoomImagine ': true ,
15' lungimeCautareMinima ': 3,
16' fereastraNoua ': true ,
17'show ': 10,
18' arataContextulCautarii ': true ,
19' arataAsocieri ': true ,
20' arataTimpDeCautare ': true ,
21' arataNumarulDeRezultate ': true ,
22'arataURL ': true ,
23' cautaDupaMaiMulteCuvinte ': true
24}, optiuni );
25
26return this . each ( function () {
27
28var dictionarNrTotalCautari = 0;
29
30var afisareInFereastraNoua = '';
31if ( setari . fereastraNoua ) {
32afisareInFereastraNoua = ' target =" _blank "';
33}
34
35function parsareURL ( nume ) {
36var cautare = location . search ;
37var cuvinteDespartite = (new RegExp ('[?|&] ' + nume + '=' +
'([^&;]+?) (&|#|;| $)'). exec ( cautare ) || [, ""]);
38var cuvintePentruCautare = cuvinteDespartite [1]. replace
(/\+/g, '%20 ');
39try {
40cuvintePentruCautare = decodeURIComponent (
cuvintePentruCautare );

Capitolul 2. Aplicat ie 24
41} catch (e) {
42cuvintePentruCautare = unescape ( cuvintePentruCautare );
43}
44return cuvintePentruCautare || null ;
45}
46
47if ( parsareURL ('q')) {
48$('# project_search_input ').val( parsareURL ('q'));
49cautaRezultate (0, true );
50}
51
52$( this ). keyup ( function ( event ) {
53if ( event . keyCode == '13 ') {
54cautaRezultate (0, true );
55}
56});
57
58
59function cautaRezultate (start , replace ) {
60window . scrollTo (0, 0);
61
62var rezultat = '';
63var arata_inlocuire = false ;
64var ignoraCuvinte = false ;
65var standard = true ;
66var nrRezultateGasite = 0;
67var rezultateGasite = [];
68
69var cuvantCautat = $('# project_search_input ').val ();
70cuvantCautat = cuvantCautat . replace (/\+/g, ' '). replace (/\
s\s+/g, ' ');
71
72cuvantCautat = $. trim ( cuvantCautat );
73var cuvantCautatLitereMici = cuvantCautat . toLowerCase ();
74
75if (( cuvantCautatLitereMici . match ("^\" ") &&
cuvantCautatLitereMici . match ("\"$")) || (
cuvantCautatLitereMici . match ("^'") &&

Capitolul 2. Aplicat ie 25
cuvantCautatLitereMici . match ("'$"))) {
76standard = false ;
77}
78
79var d_w = cuvantCautatLitereMici . split (' ');
80
81if ( standard ) {
82cuvantCautatLitereMici = '';
83for (var i = 0; i < d_w. length ; i++) {
84var a_w = true ;
85for (var f = 0; f < cuvinteDupaCareNuSeFaceCautarea . length
; f++) {
86if (d_w [i] == cuvinteDupaCareNuSeFaceCautarea [f]) {
87a_w = false ;
88ignoraCuvinte = true ;
89}
90}
91if (a_w ) {
92cuvantCautatLitereMici = cuvantCautatLitereMici + ' ' +
d_w[i];
93}
94}
95cuvantCautatLitereMici = $. trim ( cuvantCautatLitereMici );
96d_w = cuvantCautatLitereMici . split (' ');
97} else {
98cuvantCautatLitereMici = cuvantCautatLitereMici . substring
(1, cuvantCautatLitereMici . length – 1);
99}
100
101if ( cuvantCautatLitereMici . length >= setari .
lungimeCautareMinima ) {
102if ( standard ) {
103if ( replace ) {
104var d_r = cuvantCautatLitereMici ;
105for (var i = 0; i < d_w. length ; i++) {
106for (var f = 0; f < cuvinteInlocuire . cuvinte . length ; f++)
{
107if (d_w [i] == cuvinteInlocuire . cuvinte [f]. cuvant ) {

Capitolul 2. Aplicat ie 26
108cuvantCautatLitereMici = cuvantCautatLitereMici . replace (
d_w[i], cuvinteInlocuire . cuvinte [f]. inlocuire_cu );
109arata_inlocuire = true ;
110}
111}
112}
113d_w = cuvantCautatLitereMici . split (' ');
114}
115
116for (var i = 0; i < dictionar . pagini . length ; i++) {
117var score = 0;
118var s_t = dictionar . pagini [i]. text ;
119for (var f = 0; f < d_w. length ; f++) {
120if ( setari . cautaDupaMaiMulteCuvinte ) {
121var pat = new RegExp ('\\b' + d_w[f] + '\\b', 'gi ');
122} else {
123var pat = new RegExp (d_w[f], 'gi ');
124}
125if ( dictionar . pagini [i]. titlu . search (pat ) != -1) {
126var m_c = dictionar . pagini [i]. titlu . match (pat). length ;
127score += (20 * m_c);
128}
129if ( dictionar . pagini [i]. text . search (pat ) != -1) {
130var m_c = dictionar . pagini [i]. text . match (pat). length ;
131score += (20 * m_c);
132}
133if ( dictionar . pagini [i]. tags ) {
134if ( dictionar . pagini [i]. tags . search (pat ) != -1) {
135var m_c = dictionar . pagini [i]. tags . match (pat). length ;
136score += (10 * m_c);
137}
138}
139if ( dictionar . pagini [i]. url . search (pat ) != -1) {
140score += 20;
141}
142
143if ( score != 0) {
144for (var e = 0; e < ponderi . pondere . length ; e++) {

Capitolul 2. Aplicat ie 27
145if ( dictionar . pagini [i]. url == ponderi . pondere [e]. url ) {
146score += ponderi . pondere [e]. scor ;
147}
148}
149}
150
151if (d_w [f]. match ('^-')) {
152pat = new RegExp (d_w[f]. substring (1) , 'i');
153if ( dictionar . pagini [i]. titlu . search (pat ) != -1 ||
dictionar . pagini [i]. text . search (pat) != -1 || dictionar
. pagini [i]. tags . search (pat) != -1) {
154score = 0;
155}
156}
157}
158
159if ( score != 0) {
160rezultateGasite . push (
161{
162" score ": score ,
163" titlu ": dictionar . pagini [i]. titlu ,
164" desc ": s_t ,
165"img": dictionar . pagini [i]. img ,
166"url": dictionar . pagini [i]. url ,
167" note ": dictionar . pagini [i]. note
168});
169nrRezultateGasite ++;
170}
171}
172} else {
173for (var i = 0; i < dictionar . pagini . length ; i++) {
174var score = 0;
175var s_t = dictionar . pagini [i]. text ;
176var pat = new RegExp ( cuvantCautatLitereMici , 'gi ');
177if ( dictionar . pagini [i]. titlu . search (pat ) !== -1) {
178var m_c = dictionar . pagini [i]. titlu . match (pat). length ;
179score += (20 * m_c);
180}

Capitolul 2. Aplicat ie 28
181if ( dictionar . pagini [i]. text . search (pat ) !== -1) {
182var m_c = dictionar . pagini [i]. text . match (pat). length ;
183score += (20 * m_c);
184}
185if ( dictionar . pagini [i]. tags ) {
186if ( dictionar . pagini [i]. tags . search (pat ) !== -1) {
187var m_c = dictionar . pagini [i]. tags . match (pat). length ;
188score += (10 * m_c);
189}
190}
191if ( dictionar . pagini [i]. url . search (pat ) !== -1) {
192score += 20;
193}
194
195if ( score !== 0) {
196for (var e = 0; e < ponderi . pondere . length ; e++) {
197if ( dictionar . pagini [i]. url === ponderi . pondere [e]. url ) {
198score += ponderi . pondere [e]. scor ;
199}
200}
201}
202
203if ( score !== 0) {
204rezultateGasite . push (
205{
206" score ": score ,
207" titlu ": dictionar . pagini [i]. titlu ,
208" desc ": s_t ,
209"img": dictionar . pagini [i]. img ,
210"url": dictionar . pagini [i]. url ,
211" note ": dictionar . pagini [i]. note
212});
213nrRezultateGasite ++;
214}
215}
216}
217
218if ( nrRezultateGasite !== 0) {

Capitolul 2. Aplicat ie 29
219if ( setari . arataNumarulDeRezultate &&
dictionarNrTotalCautari === 0) {
220var titlu = document . title ;
221document . title = '(' + nrRezultateGasite + ') ' + titlu ;
222dictionarNrTotalCautari ++;
223}
224
225if ( nrRezultateGasite === 1) {
226rezultat += '<div id =" project_search_results_count ">1
rezulat ';
227} else {
228var nrRezultate = nrRezultateGasite . toString (). replace (/\B
(?=(\ d {3}) +(?!\ d))/g, ",");
229rezultat += '<div id =" project_search_results_count ">' +
nrRezultate + ' rezultate ';
230}
231if ( setari . arataTimpDeCautare ) {
232var timpFinal = new Date (). getTime ();
233var timpTotal = ( timpFinal – timpStart ) / 1000;
234rezultat += ' (' + timpTotal . toFixed (2) + ' secunde )';
235setari . arataTimpDeCautare = false ;
236}
237rezultat += ' </div >';
238
239if ( setari . arataAsocieri && standard ) {
240var ront = '';
241f = 0;
242for (var i = 0; i < cuvinteAsociate . asocieri . length ; i++)
{
243if ( cuvantCautatLitereMici === cuvinteAsociate . asocieri [i
]. cuvantCautat ) {
244if (!f) {
245rezultat += '<div class =" project_search_related "> Vezi si:
';
246}
247if ( arata_inlocuire ) {
248cuvantCautat = d;
249}

Capitolul 2. Aplicat ie 30
250
251if ( cuvinteAsociate . asocieri [i]. include ) {
252var r_d = cuvantCautat + ' ' + cuvinteAsociate . asocieri [i
]. asociatCu ;
253} else {
254var r_d = cuvinteAsociate . asocieri [i]. asociatCu ;
255}
256
257ront += '<a class =" project_search_related_btn " id =" ' + r_d
+ '">' + cuvinteAsociate . asocieri [i]. asociatCu + ' </a
>, ';
258f++;
259}
260}
261if (f) {
262ront = ront . slice (0, -2);
263ront += '.</div >';
264rezultat += ront ;
265}
266}
267
268if ( arata_inlocuire ) {
269rezultat += '<div id =" project_search_replace ">Se afiseaza
rezultatele pentru : ' + cuvantCautatLitereMici + '.
Cautati pentru : <a id =" project_search_replaced ">' + d_r
+ ' </a ></div >';
270}
271
272rezultateGasite . sort ( function (a, b) {
273return b. score – a. score
274});
275
276var l_o = 0;
277
278if ( setari . zoomImagine ) {
279rezultat += '<div id =" project_search_image_modal "><div
class =" project_search_image_close " >&#10005; </ div ><div
class =" project_search_image_block "><a id ="

Capitolul 2. Aplicat ie 31
project_search_zoom_url "><img id ="
project_search_zoom_img "></a><div id ="
project_search_zoom_text "></div ></div ></div >';
280}
281
282for (var i = 0; i < rezultateGasite . length ; i++) {
283if (l_o >= start && l_o < setari . show + start ) {
284rezultat += '<div class =" project_search_result ">';
285
286rezultat += '<div class =" project_search_content_title "><a
href =" ' + rezultateGasite [i]. url + '"' +
afisareInFereastraNoua + '>' + rezultateGasite [i]. titlu
+ ' </a ></div >';
287
288if ( setari . arataScor ) {
289rezultat += '<div class =" project_search_content_debug ">
Scorul cautarii : ' + rezultateGasite [i]. score + ' </div >
';
290}
291
292if ( setari . arataURL ) {
293var s_u = rezultateGasite [i]. url. toLowerCase ();
294if (s_u . indexOf ('http :// ') == 0) {
295s_u = s_u . slice (7);
296}
297rezultat += '<div class =" project_search_content_url "><a
href =" ' + rezultateGasite [i]. url + '"' +
afisareInFereastraNoua + '>' + s_u + ' </a ></div >';
298}
299
300if ( rezultateGasite [i]. img ) {
301if ( setari . zoomImagine ) {
302rezultat += '<div class =" project_search_image ">< img class
=" project_search_img project_search_image_zoom " src =" '
+ rezultateGasite [i]. img + '" alt =" ' + rezultateGasite [
i]. titlu + '" data -url =" ' + rezultateGasite [i]. url + '
"></div >';
303} else {

Capitolul 2. Aplicat ie 32
304rezultat += '<div class =" project_search_image "><a href =" '
+ rezultateGasite [i]. url + '"' + afisareInFereastraNoua
+ '><img class =" project_search_img " src =" ' +
rezultateGasite [i]. img + '" alt =" ' + rezultateGasite [i
]. titlu + '"></a ></div >';
305}
306}
307
308if ( rezultateGasite [i]. desc ) {
309var t = rezultateGasite [i]. desc ;
310
311if ( setari . arataContextulCautarii ) {
312d_w = cuvantCautatLitereMici . split (' ');
313var s_1 = rezultateGasite [i]. desc . toLowerCase (). indexOf (
d_w [0]) ;
314if (s_1 > setari . startulContextului ) {
315var t_1 = t. substr (s_1 – setari . bufferulContextului );
316var s_2 = t_1 . indexOf (' ');
317t_1 = t. substr (s_1 – setari . bufferulContextului + s_2);
318t_1 = $. trim (t_1);
319
320if (t_1 . length > setari . lungimeaContextului ) {
321t = '… ' + t_1;
322}
323}
324}
325
326if ( standard ) {
327d_w = cuvantCautatLitereMici . split (' ');
328for (var f = 0; f < d_w. length ; f++) {
329if ( setari . ingrosareTermeniCautati ) {
330var patr = new RegExp ('(' + d_w[f] + ')', 'gi ');
331t = t. replace (patr , "<h0011 >$1 <h0012 >");
332}
333}
334} else if ( setari . ingrosareTermeniCautati ) {
335var patr = new RegExp ('(' + cuvantCautatLitereMici + ')',
'gi ');

Capitolul 2. Aplicat ie 33
336t = t. replace (patr , "<span class =\"
project_search_content_bold \">$1 </ span >");
337}
338
339var t_d = '';
340var t_w = t. split (' ');
341if (t_w . length < setari . cuvinteDescriptive ) {
342t_d = t;
343} else {
344for (var f = 0; f < setari . cuvinteDescriptive ; f++) {
345t_d += t_w [f] + ' ';
346}
347}
348t_d = $. trim (t_d);
349if (t_d . charAt (t_d . length – 1) != '.') {
350t_d += ' … ';
351}
352
353t_d = t_d . replace (/ h0011 /g, 'span class =\"
project_search_content_bold \" ');
354t_d = t_d . replace (/ h0012 /g, '/ span ');
355
356rezultat += '<div class =" project_search_content_text ">' +
t_d + ' </div >';
357}
358
359if ( rezultateGasite [i]. note ) {
360rezultat += '<div class =" project_search_note ">' +
rezultateGasite [i]. note + ' </div >';
361}
362
363rezultat += ' </div >';
364}
365l_o ++;
366}
367
368if ( nrRezultateGasite > setari . show ) {
369var pagini = Math . ceil ( nrRezultateGasite / setari . show );

Capitolul 2. Aplicat ie 34
370var page = ( start / setari . show );
371if ( setari . paginiSubsol < 3) {
372setari . paginiSubsol = 3;
373}
374
375rezultat += '<div id =" project_search_foot "><ul id ="
project_search_foot_boxes ">';
376
377if ( start > 0) {
378rezultat += '<li role =" navigation "><a class ="
project_search_foot_box " accesskey ="b" id =" ' + ( start –
setari . show ) + '_' + replace + '">' + '<' + ' </a ></li >
';
379}
380
381if ( page <= 2) {
382var p_b = pagini ;
383if ( pagini > setari . paginiSubsol ) {
384p_b = setari . paginiSubsol ;
385}
386for (var f = 0; f < p_b; f++) {
387if (f == page ) {
388rezultat += '<li class =" current " role =" navigation ">' + (f
+ 1) + ' </li >';
389} else {
390rezultat += '<li role =" navigation "><a class ="
project_search_foot_box " id =" ' + (f * setari . show ) + '_
' + replace + '">' + (f + 1) + ' </a ></li >';
391}
392}
393} else {
394var p_b = page + setari . paginiSubsol – 1;
395if (p_b > pagini ) {
396p_b = pagini ;
397}
398for (var f = page – 1; f < p_b; f++) {
399if (f == page ) {
400rezultat += '<li class =" current " role =" navigation ">' + (f

Capitolul 2. Aplicat ie 35
+ 1) + ' </li >';
401} else {
402rezultat += '<li role =" navigation "><a class ="
project_search_foot_box " id =" ' + (f * setari . show ) + '_
' + replace + '">' + (f + 1) + ' </a ></li >';
403}
404}
405}
406
407if ( page + 1 != pagini ) {
408rezultat += '<li role =" navigation "><a class ="
project_search_foot_box " accesskey ="m" id =" ' + ( start +
setari . show ) + '_' + replace + '">' + '>' + ' </a ></li >
';
409}
410
411rezultat += ' </ul ></div >';
412}
413
414} else {
415rezultat += '<div id =" project_search_error "> Niciun
rezultat .</div >';
416}
417} else {
418if ( ignoraCuvinte ) {
419rezultat += '<div id =" project_search_error "> Niciun
rezultat – cuvintele sunt ignorate .</div >';
420} else {
421if ( setari . lungimeCautareMinima == 1) {
422rezultat += '<div id =" project_search_error "> Minim 3
caractere .</div >';
423} else {
424rezultat += '<div id =" project_search_error "> Cautarea ar
trebui sa aiba ' + setari . lungimeCautareMinima + '
caractere sau mai mult .</div >';
425}
426}
427}

Capitolul 2. Aplicat ie 36
428
429$('# project_search_content '). hide (). html ( rezultat ).
slideDown (200) ;
430
431$('# project_search_replaced '). click ( function () {
432cautaRezultate (0, false );
433});
434
435$('. project_search_related_btn '). click ( function () {
436$('# project_search_input ').val($( this ). attr ('id '));
437cautaRezultate (0, true );
438});
439
440$('. project_search_image_zoom '). click ( function () {
441$('# project_search_image_modal '). fadeIn (300) ;
442$('# project_search_zoom_img '). attr ('src ', this .src);
443
444var z_u = $( this ). attr ('data -url ');
445$('# project_search_zoom_url '). attr ('href ', z_u);
446
447var z_o = this .alt + '<div class ="
project_search_zoom_options "><a href =" ' + this . src + '"
target =" _blank "> Deschide imaginea </a >& nbsp ; <a href =" '
+ z_u + '" target =" _blank "> Mergi la </a ></div >';
448
449$('# project_search_zoom_text '). html (z_o);
450});
451
452$('. project_search_image_close '). click ( function () {
453$('# project_search_image_modal '). fadeOut (300) ;
454});
455
456$('. project_search_foot_box '). click ( function () {
457var id_v = $( this ). attr ('id ');
458var id_a = id_v . split ('_');
459
460cautaRezultate ( parseInt ( id_a [0]) , id_a [1]) ;
461});

Capitolul 2. Aplicat ie 37
462}
463});
464};
465})( jQuery );
Urm atorul pas pe care trebuie s a^ l facem este s a analiz am cont inutul de pe ecare
link al Facult at ii de Matematic a  si s a lu am doar cont inutul util de pe ecare link
^ n parte (titluri, heading-uri, paragrafe etc). Pentru a face acest lucru, va trebui s a
folosim un crawler.
Un crawler porne ste ^ mpreuna cu un URL, exploreaz a toate hyperlink-urile din
acea pagin a web, viziteaz a aceste pagini  si le descarc a cont inutul. Aceste pagini
downloadate sunt indexare  si folosite pentru motoarele de c autare. Un motor de
c autare este evaluat ^ n funct ie de performant ele sale, de calitatea rezultatelor  si de
abilitarea de a c auta e cient date pe web. Principalele cerint e de la un web crawler
sunt:
Desc arcarea paginilor web;
C autarea  si identi carea tuturor hyperlink-urilor din pagin a;
Pentru ecare link identi cat, se va repeta procesul.
Odat a ce un s-a identi cat URL-ul, crawler-ul urm are ste toate link-urile pe care
le g ase ste ^ n pagin a  si le parcurge dup a un anumit algoritm p^ an a ce epuizeaz a lista
de link-uri  si se ^ nregistreaz a un mesaj de oprire.
Vom crea un  sier (crawler.php) care, atunci c^ and este rulat, caut a informat ii
^ n paginile web, le descarc a, le indexeaz a  si le stocheaz a ^ n baza de date cu scopul
de a le indexa dup a cont inut. Obiectivul este de a salva c^ at mai rapid  si e cient
informat iile paginilor web accesate.
C^ and un utilizator efectueaz a o c autare, acesta interogheaz a baza de date  si
returneaz a paginile web relevante pentru cuv^ antul/cuvintele cheie folosite. Acest tip
de program robot ruleaz a continu pe internet ^ ntret in^ and baza de date.
1<?php
2$mysql_host = '127.0.0.1 ';
3$mysql_username = 'root ';
4$mysql_password = '';
5$mysql_database = 'crawler ';
6$mysql_conn = mysqli_connect ( $mysql_host , $mysql_username ,
$mysql_password , $mysql_database );

Capitolul 2. Aplicat ie 38
7if (! $mysql_conn ) {
8 echo " Error : Unable to connect to MySQL ." . PHP_EOL ;
9 echo " Debugging errno : " . mysqli_connect_errno () .
PHP_EOL ;
10 echo " Debugging error : " . mysqli_connect_error () .
PHP_EOL ;
11 exit ;
12}
13mysqli_set_charset ( $mysql_conn , 'utf8 ');
14
15function getContent ( $target , $referer )
16{
17 // Initialize Handle
18 $handle = curl_init ();
19
20 // Define Settings
21 curl_setopt ( $handle , CURLOPT_HTTPGET , true );
22 curl_setopt ( $handle , CURLOPT_HEADER , true );
23 curl_setopt ( $handle , CURLOPT_COOKIEJAR , " cookie_jar . txt"
);
24 curl_setopt ( $handle , CURLOPT_COOKIEFILE , " cookies . txt");
25 curl_setopt ( $handle , CURLOPT_USERAGENT , "web – crawler –
tutorial – test ");
26 curl_setopt ( $handle , CURLOPT_URL , $target );
27 curl_setopt ( $handle , CURLOPT_REFERER , $referer );
28 curl_setopt ( $handle , CURLOPT_FOLLOWLOCATION , true );
29 curl_setopt ( $handle , CURLOPT_MAXREDIRS , 4);
30 curl_setopt ( $handle , CURLOPT_RETURNTRANSFER , true );
31
32 // Execute Request
33 $output = curl_exec ( $handle );
34
35 // Close cURL handle
36 curl_close ( $handle );
37
38 // Separate Header and Body
39 $separator = "\r\n\r\n";
40 $header = substr ( $output , 0, strpos ( $output , $separator )

Capitolul 2. Aplicat ie 39
);
41 $body_start = strlen ( $header ) + strlen ( $separator );
42 $body = substr ( $output , $body_start , strlen ( $output ) –
$body_start );
43
44 // Parse Headers
45 $header_array = Array ();
46 foreach ( explode ("\r\n", $header ) as $i => $line ) {
47 if ($i === 0) {
48 $header_array ['http_code '] = $line ;
49 $status_info = explode (" ", $line );
50 $header_array [' status_info '] = $status_info ;
51 } else {
52 list ($key , $value ) = explode (': ', $line );
53 $header_array [ $key ] = $value ;
54 }
55 }
56
57 // Form Return Structure
58 $ret = Array (" headers " => $header_array , " body " => $body
);
59 return $ret ;
60}
61
62function parsePage ( $target , $referer , $mainUrl )
63{
64 global $mysql_conn ;
65
66 // Get content
67 echo " Downloading : $target " . '<br >';
68 $contents = getContent ( $target , $referer );
69
70 // Check Status
71 if ( $contents && $contents ['body ']) {
72 // Parse Contents
73 $doc = new DOMDocument ();
74 libxml_use_internal_errors ( true );
75 $doc -> loadHTML ( $contents ['body ']);

Capitolul 2. Aplicat ie 40
76
77 if ( $docContent = $doc -> getElementById ('continut ')) {
78
79 // Get paragraphs
80 $p = '';
81 $p_tags = $docContent -> getElementsByTagName ('p');
82 foreach ( $p_tags as $p_tag ) {
83 $temp = trim ( mysqli_real_escape_string ( $mysql_conn
, $p_tag -> textContent ));
84 // check for romanian characters && numbers
85 if ( preg_match ('/([\ pL -]+) ?\s ?\[?\(?:([a-zA -Z0
-9\ -\_]+) \) ?\]?/ u', $temp )) {
86 $p .= ' ' . $temp ;
87 }
88 }
89
90 if ( strlen ($p) < 1) {
91 return false ;
92 }
93
94 // Get title
95 $title = '';
96 $titleTags = $docContent -> getElementsByTagName ('
title ');
97 if ( count ( $titleTags ) > 0) {
98 $title = mysqli_real_escape_string ( $mysql_conn ,
trim ( $titleTags [0]-> nodeValue ));
99 }
100
101 // Get first h1
102 $h1 = '';
103 $h1Tags = $docContent -> getElementsByTagName ('h1 ');
104 if ( count ( $h1Tags ) > 0) {
105 $h1 = mysqli_real_escape_string ( $mysql_conn , trim (
$h1Tags [0]- > nodeValue ));
106 }
107
108 // Get title

Capitolul 2. Aplicat ie 41
109 $titleFromThePage = '';
110 $titleFromThePageId = $doc -> getElementById ('
titlu_continut ');
111 if ( $titleFromThePageId && count ( $titleFromThePageId
) > 0) {
112 $titleFromThePage = mysqli_real_escape_string (
$mysql_conn , trim ( $titleFromThePageId [0]- > nodeValue ));
113 }
114
115 $title = $titleFromThePage ?: $h1 ?: $title ?: '
Facultatea de Matematica ';
116
117 // Get first img
118 $img = '';
119 $entirePage = $doc -> getElementById ('continut ');
120 $imgTags = $entirePage -> getElementsByTagName ('img ');
121 if ( count ( $imgTags ) > 0) {
122 $img = $mainUrl . mysqli_real_escape_string (
$mysql_conn , trim ( $imgTags [0]- > getAttribute ('src ')));
123 }
124 $entirePage = null ;
125
126 // Insert / Update Page Data
127 if ( strlen ($p) > 0) {
128 $query = " INSERT INTO content (title , text , url ,
date_created , img ) VALUES (\" " .
mysqli_real_escape_string ( $mysql_conn , $title ) . "\",
\" $p \", \" $target \", NOW () , \" $img \") ";
129 if (! mysqli_query ( $mysql_conn , $query )) {
130 echo " Error : Unable to insert into database : " .
$target . '<br >';
131 }
132 echo " Done : " . $target . "<br >";
133 } else {
134 echo "No data for : " . $target . "<br >";
135 }
136
137 } else {

Capitolul 2. Aplicat ie 42
138 echo "No data for : " . $target . "<br >";
139 }
140 }
141 return true ;
142}
143
144$mainUrl = 'https :// www. math . uaic .ro/';
145
146$urls = [
147" https :// www. math . uaic .ro/",
148" https :// www. math . uaic .ro/ index .php?id =50",
149" https :// www. math . uaic .ro/ index .php?id =206 ",
150" https :// www. math . uaic .ro/rss/",
151" https :// www. math . uaic .ro/ index .php?lb =0& id =1& cod =0& tip =&
an =& cat =& subcat =",
152" https :// www. math . uaic .ro/ index .php?lb =1& id =1& cod =0& tip =&
an =& cat =& subcat =",
153" https :// www. math . uaic .ro/ index .php?lb =2& id =1& cod =0& tip =&
an =& cat =& subcat =",
154" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =0",
155" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =2",
156" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =201 ",
157" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =202 ",
158" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =204 ",
159" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =205 ",
160" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =207 ",
161" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =206 ",
162" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =3",
163" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =309 ",
164" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =3010 ",
165" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =302 ",
166" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =306 ",
167" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =308 ",
168" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =303 ",
169" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =301 ",
170" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =307 ",
171" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =4",
172" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =402 ",

Capitolul 2. Aplicat ie 43
173" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =401 ",
174" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =403 ",
175" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =405 ",
176" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =404 ",
177" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =406 ",
178" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =407 ",
179" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =408 ",
180" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =5",
181" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =501 ",
182" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =502 ",
183" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =503 ",
184" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =509 ",
185" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =504 ",
186" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =505 ",
187" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =506 ",
188" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =6",
189" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =601 ",
190" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =604 ",
191" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =605 ",
192" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =607 ",
193" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =606 ",
194" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =602 ",
195" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =7",
196" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =701 ",
197" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =702 ",
198" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =715 ",
199" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =703 ",
200" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =704 ",
201" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =705 ",
202" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =706 ",
203" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =707 ",
204" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =710 ",
205" https :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =711 ",
206" https :// www. math . uaic .ro/ index .php?lb =0& cod =& id =101 ",
207" https :// www. math . uaic .ro/ index .php?lb =0& cod =& id =102 ",
208" https :// www. math . uaic .ro/ index .php?cod =0& id =402 ",
209" https :// www. math . uaic .ro/ index .php?cod =0& id =4021 ",
210" https :// www. math . uaic .ro/ index .php?cod =0& id =4022 ",

Capitolul 2. Aplicat ie 44
211" https :// www. math . uaic .ro/ index .php?lb =0& cod =& id =107 ",
212" https :// www. math . uaic .ro/ index .php?lb =0& cod =& id =1071 ",
213" https :// www. math . uaic .ro/ index .php?lb =0& cod =& id =1072 ",
214" https :// www. math . uaic .ro/ index .php?lb =0& cod =& id =1073 ",
215" https :// www. math . uaic .ro/ index .php?lb =0& cod =& id =1074 ",
216" https :// www. math . uaic .ro/ index .php?cod =0& id =6011 ",
217" https :// www. math . uaic .ro/ index .php?cod =0& id =6012 ",
218" https :// www. math . uaic .ro/ index .php?id =711 ",
219" https :// www. math . uaic .ro/ index .php?cod =0& id =201 ",
220" https :// www. math . uaic .ro/ index .php?cod =0& id =206 ",
221" https :// www. math . uaic .ro/ index .php?id =702& cod =0",
222" https :// www. math . uaic .ro/ index .php?id =702& cod =0& user =
math_ROSE ",
223" https :// www. math . uaic .ro/ index .php?id =80& cod =0",
224" https :// www. math . uaic .ro/ index .php?id =70& cod =0",
225" https :// www. math . uaic .ro/ index .php?id =40",
226" https :// www. math . uaic .ro/ index .php?id =507 ",
227" http :// www. math . uaic .ro /~ sm/",
228" http :// www. math . uaic .ro /~ annalsmath /",
229" https :// www. math . uaic .ro/ index .php?cod =0& id =20",
230" https :// www. math . uaic .ro/ index .php?cod =0& id =30",
231" https :// www. math . uaic .ro/ continut / download / download .php?
cod_file =469 ",
232" https :// www. math . uaic .ro/ continut / download / download .php?
cod_file =463 ",
233" https :// www. math . uaic .ro/ PortiDeschise ",
234" https :// www. math . uaic .ro/ continut / download / download .php?
cod_file =462 ",
235" https :// www. math . uaic .ro/ continut / download / download .php?
cod_file =474 ",
236" http :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =711 ",
237" https :// www. math . uaic .ro/ index .php?id =601 ",
238" https :// www. math . uaic .ro/ index .php?id =604 ",
239" https :// www. math . uaic .ro/ index .php?id =606 ",
240" https :// www. math . uaic .ro/ continut / download / download .php?
cod_file =454 ",
241" https :// www. math . uaic .ro/ index .php?id =714 ",
242" https :// www. math . uaic .ro/ continut / download / download .php?

Capitolul 2. Aplicat ie 45
cod_file =436 ",
243" https :// www. math . uaic .ro/ continut / download / download .php?
cod_file =433 ",
244" http :// www. math . uaic .ro /~ sncssm /",
245" http :// www. math . uaic .ro/ index .php?lb =0& cod =0& id =209 ",
246" https :// www. math . uaic .ro/ index .php?id =209 "
247];
248
249foreach ( $urls as $url ) {
250 $components = parse_url ( $url );
251
252 if ( $components === false ) {
253 echo 'Unable to Seed Parse URL ' . $url . '<br >';
254 } else {
255 // Parse page and get content
256 parsePage ($url , "", $mainUrl );
257 }
258}
Apoi trebuie s a salv am toate link-urile pe care le g asim ^ ntr-un  sier index. Tre-
cem prin ^ ntreaga structur a de dict ionare care cont ine toate paginile  si creem un
index al ^ ntregului cont inut (dictionar.js), unde se vor stoca informat iile utile pe care
le obt inem ^ n urma rul arii crawler-ului. Indexul va cont ine:
titlul;
cont inutul ec arei pagini;
imaginea;
URL-ul.
Pentru a face aceast a stocare ^ n mod automat, trebuie s a creem un  sier (actu-
alizare.php) care, atunci c^ and va rulat, va actualiza dict ionarul cu paginile care
sunt …
1<? php
2$mysqli = new mysqli (" 127.0.0.1 ", " root ", "", " crawler ");
3
4mysqli_set_charset ( $mysqli , 'utf8 ');
5

Capitolul 2. Aplicat ie 46
6$ok = false ;
7
8// selectam doar ceea ce este distinct din tabela content
9$rezultate = $mysqli -> query (" Select * from content GROUP
BY text ;");
10
11// daca exista rezultate , actualizam dictionarul
12if ( $rezultate ) {
13// initializam dictionarul
14$dictionar = '
15var dictionar = {
16" pagini ": [
17';
18// parcurgem rezultatele si le punem in dictionar
19foreach ( $rezultate as $rezultat ) {
20$dictionar .= '{" titlu ": `' . strval ( $rezultat ['title '])
. '`,';
21$dictionar .= '" text ": `' . strval ( $rezultat ['text ']) . '
`,';
22$dictionar .= '"img ": `' . strval ( $rezultat ['img ']) . '`,
';
23$dictionar .= '"url ": `' . strval ( $rezultat ['url ']) . '`'
;
24$dictionar .= '},';
25
26}
27
28// Aici se termina dictionarul
29$dictionar .= ']}; ';
30
31// definim calea catre fisierul dictionar .js
32$filePath = dirname ( __DIR__ , 1) . DIRECTORY_SEPARATOR . '
proiect ' . DIRECTORY_SEPARATOR . " dictionar .js";
33
34// deschidem fisierul dictionar .js
35$fp = fopen ( $filePath , "w");
36// scriem in fisierul dictionar .js
37fwrite ($fp , $dictionar );

Capitolul 2. Aplicat ie 47
38fclose ($fp );
39$ok = true ;
40}
41?>
42
43<! DOCTYPE html >
44<html >
45<head >
46<meta name =" viewport " content =" width =device -width ,
initial – scale =1">
47<style >
48. alert {
49padding : 20 px;
50background – color : # f44336 ;
51color : white ;
52opacity : 1;
53transition : opacity 0.6s;
54margin – bottom : 15 px;
55}
56. alert . success {
57background – color : #4 CAF50 ;
58}
59</style >
60</head >
61<body >
62
63<? php if ( $ok ) : ?>
64<div class =" alert success ">
65<strong > Dictionarul a fost actualizat cu success !</ strong
>
66</div >
67<? php else : ?>
68<div class =" alert ">
69<strong >A aparut o eroare in timpul actualizarii .
Incercati din nou .</ strong >
70</div >
71<? php endif ; ?>
72</body >

Capitolul 2. Aplicat ie 48
73</html >
74

Bibliogra e
[1] M. Levene. An Introduction to Search Engines and Web Navigation . A John
Wiley&sons, Inc. Publication, 2010.
[2] G. Meghabghab, A. Kandel. Search Engines, Link Analysis, and User's Web
Behavior . Sprinter, 2008.
[3] B. Clay, S. Esparza. Search Engine Optimization all-in-all for Dummies . Wiley
Publishing, Inc., 2009.
[4] P. Kent. Search Engine Optimization all-in-all for Dummies 3rd Edition . Wiley
Publishing, Inc., 2008.
[5] M. W. Berry, M. Browne. Understanding Search Engines. Mathematical Mode-
ling and Text Retrieval. Second Edition . Siam, 2005.
49

Similar Posts