Sunteți pe pagina 1din 26

Evaluarea similarității site-urilor web

într-un sistem distribuit

Slabu Florin
2023

1
Cuprins

Cuprins........................................................................................................................................2
Capitolul 1. Introducere..............................................................................................................3
1.1 Big Data............................................................................................................................3
1.2 Cloud computing...............................................................................................................5
1.3 Hadoop - Un framework pentru calcule distribuite..........................................................7
1.4 MapReduce.....................................................................................................................10

Capitolul 2. Algoritmi pentru calculul indexului Jaccard.........................................................13


2.1 Introducere......................................................................................................................13
2.2 Măsura de similitudinea Jaccard.....................................................................................14
2.3 Descrierea algoritmului de calcul...................................................................................16
2.4 Rezultate experimentale..................................................................................................21
2.5Concluzii..........................................................................................................................23

Bibliografie...............................................................................................................................24

2
Capitolul 1. Introducere

1.1 Big Data

Exploatarea seturilor mari de date sau analiza seturilor mari de date sunt două subiecte
frecvent întâlnite în ultima decadă. De exemplu, există multe conferințe, prezentări, demo-uri
etc. toate având drept subiect central metode și algoritmi matematici pentru rezolvarea noilor
probleme apărute din analiza cantităţilor mari de date.
Aceste subiecte acoperă procesul de analiză a unor cantități foarte mari de date cu accent
pe metodele de extragere a datelor și de învățare automată. Mulţimile mari de date nu au
apărut din senin în ultimii ani, companiile colectând de ceva vreme datele strategice într-un
fel sau altul: de exemplu companiile farmaceutice au colectat cantități uriașe de informații în
timpul cercetărilor lor, date care sunt disponibile în rețelele private ale acestora prin
intermediul unor depozite locale de date. Camerele de supraveghere, RFID, tot felul de
senzori folosiți în cadrul sistemelor de securitate, toate au produs date care ar putea și sunt
stocate.
Termenul de Big data descrie seturi de date care cresc foarte repede şi devin atât de mari
încât devine ineficientă procesarea acestora cu instrumente tradiționale precum sisteme de
gestiune a bazelor de date, sisteme de gestiune a conținutului sau vreun software avansat de
analiză statistică.
Astăzi, în fiecare domeniu, se găsesc cantități foarte mari de date, cum ar fi datele
rezultate din diverse procese precum tranzacțiile de comerț electronic, tranzacțiile bancare sau
tranzacțiile cu cardurile de credit, navigarea pe web concretizată în jurnalele site-urilor web.
Trebuie să menționăm cantitatea uriașă de date (personale) păstrate de către rețelele sociale
precum Facebook1 sau Linkedin2.
Problema cu aceste date de dimensiuni mari nu este atât complexitatea proceselor
implicate, cât mai degrabă cantitatea de date și rata de colectare a datelor noi.
În prezent, majoritatea companiilor din domeniu trebuie să gestioneze o cantitate
semnificativă de date, pe care trebuie să le prelucreze în timpul activităților lor zilnice.
Primele afaceri, care au fost afectate de creșterea exponențială a datelor au fost motoarele de
1
http://www.facebook.com/
2
https://www.linkedin.com/
3
căutare precum Yahoo și Google şi rețelele sociale precum Facebook sau Twitter. De
exemplu, multe date sunt generate regulat pe Facebook: foarte mulţi dintre utilizatorii activi
încarcă o mulțime de imagini și videoclipuri sau partajează conținuturi precum link-uri web,
postări de blog, fotografii, note etc. În 2009 cantitatea de videoclipuri și fotografii încărcate pe
Facebook era de peste 1 miliard în fiecare lună.
Câteva informaţii statistice despre datele generate de Facebook:
 peste 1,96 miliarde de utilizatori activi zilnic în medie(iunie 2022)3;
 300 de milioane de utilizatori folosesc Facebook Stories zilnic față de 500 de milioane
care folosesc Instagram Stories în fiecare zi (ianuarie 2019);
 numărul total de conexiuni ale prietenilor pe Facebook a fost de peste 150 de miliarde
(februarie 2013)4;
 numărul total de fotografii încărcate a depășit în septembrie 2013 valoarea de 250 de
miliarde5;
 media fotografiilor încărcate zilnic a fost de peste 350 de milioane (februarie 2013);
 există mai mult de 300 PB de date despre utilizator (noiembrie 2013).
Prelucrarea cantităţilor mari de date nu poate fi efectuată de oameni sau prin instrumentele
existente concepute pentru a prelucra seturi mici de date, deoarece nu mai sunt eficiente în
cazul în care cantitatea de date depășește o anumită limită. Sistemele de gestiune a bazelor de
date clasice sunt utile în special pentru date de tip structurat, în timp ce big data nu înseamnă
doar date structurate, cât și semi-structurate sau date nestructurate. Cantitatea de date
nestructurate este într-o creștere mai rapidă decât cantitatea de date structurate, aproximativ
80% din date publice dovedindu-se a fi date nestructurate.
 colecta peste 150 de miliarde de înregistrări noi pe zi, rezultând o rată de creştere ce
depăşea 50 TB / zi6.
 În 2008, Google prelucra aproximativ 20 PB de date pe zi.
Necesitatea dezvoltării unor algoritmi specializaţi, ce pot prelucra o cantitate
semnificativă de date, devine mai presantă având în vedere epoca activităţilor intens digitale
în care trăim [7]. Efortul pentru implementarea unor astfel de algoritmi a primit o mână de
ajutor odată cu apariţia tehnologiilor de de cloud computing.
Capacitatea de a stoca, agrega, combina datele și apoi de a folosi rezultatele acestor
prelucrări pentru a efectua o analiză profundă a datelor a devenit acum mai accesibilă, datorită
unor tendințe precum Legea lui Moore pentru procesoare, sau echivalentul acesteia în stocarea

3
https://www.oberlo.com/blog/facebook-statistics
4
https://expandedramblings.com/index.php/by-the-numbers-17-amazing-facebook-stats/
5
https://www.omnicoreagency.com/facebook-statistics/
6
http://www.dbms2.com/2009/04/30/ebays-two-enormous-data-warehouses/
4
digitală și cloud computing, ce continuă să scadă costurile și să depăşească alte bariere
tehnologice [8].
Deși conceptul de „cloud computing” este vechi, definiția acestui termen datează din
1997, când a fost enuntata pentru prima oară de profesorul Ramnath Chellappa în articolul său
intitulat „Intermediaries in Cloud-Computing: A New Computing Paradigm” [9].

1.2 Cloud computing


Calculul în cloud este, potrivit unui document special publicat sub auspiciile Institutul
Național de Știință și Tehnologie7, "un model care să permită accesul în reţea pretutindeni,
convenabil și la cerere la un grup comun de resurse de calcul configurabile (de exemplu,
rețele, servere, unităţi de stocare, aplicații și servicii) care poate fi furnizat rapid și eliberat
cu un efort minim de gestionare sau interacţiune cu furnizorul de servicii" [2].
O altă definiție poate fi întâlnită într-un document oficial realizat de către un grup de
experţi în cloud computing al Comisiei UE din ianuarie 2010, "The future of Cloud
Computing" [3]:un „nor” este un mediu de execuție elastic a resurselor care implică mai multe părți
interesate și oferă un serviciu contorizat la mai multe granularități pentru un nivel specific de calitate
(al serviciului)8.
În concluzie, cloud computing-ul poate fi privit ca o nouă abordare în utilizarea serviciilor
IT ce prezintă avantajul accesării acestora cu costuri mai mici și fiind mult mai simplu de
utilizat, menținând în același timp un nivel ridicat de scalabilitate și fiabilitate. În figura 1 este
prezentată arhitectura cloud computing din punct de vedere logic9.

7
NIST http://www.nist.gov/index.html
8
a 'cloud' is an elastic execution environment of resources involving multiple stakeholders and providing a
metered service at multiple granularities for a specified level of quality (of service).
9
http://en.wikipedia.org/wiki/Cloud_computing
5
Figura 1 Arhitectura cloud computing

Din punctul de vedere al unui client, cel mai bun comportament al unui serviciu este un
serviciu de cloud computing ce oferă acces la resurse (hardware și software), sub impresia că
sunt nelimitate. Aceasta necesită alocarea și managementul automat al resurselor pentru a
prelucra eficient toate cererile. O soluție care se scalează bine pentru această problemă, este
virtualizarea. De asemenea, virtualizarea are avantaje certe din punct de vedere al securităţii.
La rularea mai multor mașini virtuale într-un mediu de tip cloud, procesoarele, memoria
principală, plăcile de rețea și hard disk-urile trebuie să fie partajate de maşinile virtuale
lansate pe același server fizic. Deși procesoarele și memoria principală pot fi partajate,
blocajele apar la nivelul operaţiilor de I/O de rețea și disc. Îmbunătățirea virtualizărilor
întreruperilor și a canalelor de I/O se poate face cu ajutorul inginerilor proiectanţi de hardware
şi a programatorilor ce lucrează la dezvoltarea sistemelor de operare.
Principalele modele de implementare pentru sistemele de cloud sunt:
 Public cloud - în acest model de implementare, resursele cloud sunt puse la dispoziția
publicului larg;
 Community cloud - cloud-ul este operat de o comunitate care permite organizațiilor
membre să partajeze infrastructura. Organizațiile membre au în comun aceleași
interese, obiective, obiective.
 Cloud hibrid - este un model intermediar de la public cloud la private cloud;
 Private cloud - serviciul este disponibil numai pentru o singură entitate, fiind dezvoltat
și întreținut de același actor.
Infrastructura cloud se bazează pe trei modele de servicii:

6
 Infrastructura ca serviciu (IaaS) - furnizorii de cloud oferă infrastructura pentru
utilizatorii de cloud, de obicei ca mașină virtuală [3] (de exemplu Amazon S310, SQL
Azure11, Amazon EC212);
 Platforma ca serviciu (PaaS) - furnizorii de cloud oferă utilizatorilor de cloud o
întreagă platformă de dezvoltare şi mai mult, compusă din sistem de operare, mediu de
programare, bază de date, server web (de exemplu Google App Engine13, Windows
Azure14);
 Software as a Service (SaaS) - furnizorii de cloud oferă implementări pentru diferite
aplicații software destinate utilizatorilor de cloud (de exemplu Google Docs15,
Microsoft Office 36516).
Unii cercetători susțin [1] că deşi preţul serviciului pay-as-you-go este mai mare decât
costul de amortizare al unui server într-o anumită perioadă de timp, beneficiile sunt oferite
prin transferul riscului (supra-aprovizionare sau subprovizionare) și proprietatea elasticității
serviciului.
Caracteristicile care fac cloud computing atât de atractiv sunt utilizarea pe termen scurt,
fără costuri ridicate și capacitatea infinită la cerere [1].

1.3 Hadoop - Un framework pentru calcule distribuite


Apache Hadoop este un proiect Apache Software Foundation, care constă din mai multe
sub-proiecte, oferind un cadru pentru dezvoltarea aplicațiilor distribuite. Este unul dintre cele
mai populare framework-uri open-source care oferă un API Java, şi care poate fi utilizat
pentru a dezvolta aplicații bazate pe paradigma MapReduce.
Framework-ul Hadoop ascunde detaliile procesării job-urilor, lăsând dezvoltatorilor
libertatea de a se concentra asupra logicii aplicațiilor. Hadoop are câteva trăsături
caracteristice:
1. accesibil - poate fi rulat pe clustere mari sau în servicii de cloud computing;
2. robust - a fost proiectat pentru a rula pe orice hardware obişnuit în producţie, un
aspect major avut în vedere în timpul dezvoltării sale fiind toleranța la defecțiunile și
blocările frecvente ale hardware-ului;

10
http://aws.amazon.com/s3/
11
https://azure.microsoft.com/en-us/services/sql-database/
12
https://aws.amazon.com/ec2/
13
https://cloud.google.com/appengine/docs
14
https://azure.microsoft.com/en-us/
15
https://docs.google.com/
16
http://www.microsoft.com/office365/
7
3. scalabil – gestionează cu ușurință procesarea unor cantități mari de date prin
adăugarea la cluster, în mod transparent, a unor noduri noi;
4. simplu - permite dezvoltatorilor să scrie într-un timp scurt cod specific.
Hadoop prezintă un domeniu destul de mare de aplicații specifice. Câteva exemple includ
aplicațiile de comerț electronic online pentru furnizarea de recomandări mai bune clienților
interesaţi de anumite produse sau aplicații financiare pentru analiza și evaluarea riscurilor ce
folosesc modele de calcul sofisticate ale căror rezultate nu pot fi stocate într-o bază de date.
Hadoop a câștigat o popularitate foarte mare, companii precum Yahoo! [6], New York
Times, IBM, Facebook, Hulu etc. folosindu-l în activitatea zilnică. Un factor ce a contribuit la
adoptarea sa se referă la faptul că aplicațiile bazate pe Hadoop pot fi executate pe toate
sistemele de operare: Windows, Linux, Unix și Mac OS, chiar dacă Linux este platforma sa
oficială.
Framework-ul de bază Hadoop este compus din următoarele module:
 Hadoop Common - conține biblioteci și utilitare necesare altor module Hadoop.
 Sistemul de fișiere distribuit Hadoop (HDFS) - un sistem de fișiere distribuit ce
pastrează datele pe calculatoare obişnuite, oferind o lățime de bandă agregată foarte
mare pentru întregul cluster.
 Hadoop YARN - o platformă de gestionare a resurselor, adăugată începând cu Hadoop
2.0, responsabilă pentru gestionarea resurselor de calcul din clustere și utilizarea
acestora pentru programarea aplicațiilor utilizatorilor.
 Hadoop MapReduce - un model de programare pentru prelucrarea datelor pe scară
largă.
Hadoop implementează o arhitectură master-slave folosită atât pentru stocarea distribuită
a datelor, cât și pentru calcule distribuite.

Figura 2 Arhitectura Hadoop


8
Atunci cand rulează pe un cluster complet configurat Hadoop este compus dintr-un set de
daemoni sau module interne executate pe diverse mașini din cadrul clusterului. Aceşti
daemoni au sarcini specifice, unii dintre ei rulând doar pe o singură mașină, alţii având mai
multe instanţe ce rulează pe mai multe mașini (calculatoare). Daemonii Hadoop sunt:
 NameNode - este cel mai important demon. Daemonul NameNode reprezintă
managerul principal al HDFS, coordonând daemoni DataNode pentru efectuarea
operațiunilor de I/O. Acesta este singurul punct critic din cluster, funcţionarea
defectuoasă a acestuia ducând la blocarea clusterului;
 DataNode - fiecare maşină slave din cluster va găzdui un daemon DataNode ce citeşte
și scrie blocuri HDFS din fișierele stocate în sistemul de fișiere local;
 NameNode secundar - SNN - are rolul de a monitoriza starea de sănătate a clusterului
HDFS. Fiecare cluster are un NameNode principal și un NameNode secundar ce
rulează pe mașini separate, principala diferență dintre cei doi daemoni fiind că cel de-
al doilea nu primește în timp real modificările din interiorul HDFS;
 JobTracker - asigură sincronizarea între aplicație și Hadoop. JobTracker stabilește
planul de execuție în concordanță cu fișierele ce vor fi procesate, alocă noduri fiecărui
task și monitorizează toate task-urile aflate în execuţie. Fiecare cluster Hadoop are un
singur daemon JobTracker, care rulează pe un server ca nod principal;
 TaskTracker - este responsabil de executarea sarcinilor atribuite de JobTracker.
Fiecare nod slave are un singur TaskTracker ce poate porni mai multe JVM-uri pentru
a rula în paralel mai multe sarcini.
HDFS este sistemul de stocare utilizat de aplicațiile Hadoop. HDFS decide cum și unde să
replice blocurile de date și să le distribuie între nodurile clusterului acolo unde au loc
calculele; scopul acestor operaţii este acela de a efectua calculele mai rapid și fiabil.
Un exemplu privind arhitectura unui cluster Hadoop este prezentat în figura 3. Pentru un
cluster mic, daemonul Secondary NameNode poate fi găzduit pe un nod slave, în timp ce, pe
un cluster mare, se obişnuieşte să se separe daemonii NameNode și JobTracker pe mașini
diferite. În figura 3, avem un nod master (principal) ce rulează daemonii NameNode și
JobTracker și un nod independent care găzduiește demonul Secondary NameNode, utilizat în
cazul nefuncţionării nodului principal.
Fiecare mașină slave găzduiește doi daemoni, un DataNode și un TaskTracker, cu scopul
de a realiza sarcinile de calcul pe același nod unde sunt stocate şi datele de intrare.

9
Figura 3 Arhitectura unui cluster Hadoop

1.4 MapReduce
Modelul de programare MapReduce a fost descris pentru prima dată de către cercetătorii
Jeffrey Dean și Sanjay Ghemawat în lucrarea publicată în 2004, intitulată MapReduce:
Simplified Data Processing on Large Clusters [10]. Acest model de programare fusese
proiectat și introdus în producţie de ceva devreme de către cercetătorii de la Google, dar
implementarea sa nu a fost făcută publică. Schema de procesare a datelor a devenit curând
foarte populară, la adoptarea sa pe scară largă contribuind şi framework-ul open-source
Hadoop, apărut în 2005. Un job în cadrul modelului de programare MapReduce împarte
mulţimea datelor de intrare în mai multe blocuri independente de date şi care sunt procesate în
paralel.
Se cuvine să amintim două idei de bază ce pot fi întâlnite în MapReduce:
 Există o strategie binecunoscută în informatică pentru rezolvarea problemelor, o
metodă generală pentru elaborarea algoritmilor, denumită divide-et-impera: când
trebuie să rezolvăm o problemă a cărei soluție generală este necunoscută, atunci
problema este descompusă în subprobleme mai mici, aplicăm aceeași strategie pentru
fiecare din acestea și combinăm rezultatele / soluțiile parțiale corespunzătoare fiecărei
subprobleme într-o soluție generală. Procesul de descompunere continuă până când
dimensiunea subproblemei este suficient de mică pentru a fi gestionată individual.
 Metoda generală de calcul se bazează pe două structuri de date, perechea (cheie,
valoare) și lista. Proiectarea algoritmilor MapReduce implică utilizarea perechilor
(cheie, valoare) peste mulţimi de date oarecare.

10
Conceptele Map și Reduce au fost inspirate din programarea funcțională, Lisp având două
funcții cu semnificație similară, map și fold. Operațiile funcționale au proprietatea de a păstra
structurile de date astfel încât datele originale să rămână nemodificate și să fie create noi
structuri de date.
Funcția map are drept argumente o funcție f și o listă, aplică funcția f fiecărui element al
listei de intrare, rezultând o listă nouă de ieșire.
Funcția fold prezintă un argument suplimentar în comparație cu argumentele funcţiei map:
pe lângă funcția f și lista de intrare, avem un acumulator. Funcția f este aplicată fiecărui
element al listei de intrare, rezultatul este adăugat la acumulatorul anterior obținându-se
valoarea acumulatorului pentru pasul următor.
Detaliile de implementare ale unei abordări divide-et-impera nu sunt aşa de simple, deși
ideea pare a fi foarte simplă,. Există multe elemente particulare de care trebuie să se ocupe un
programator:
 descompunerea problemei și alocarea subproblemelor către workeri;
 sincronizarea între workeri;
 comunicarea rezultatelor parțiale și combinarea acestora pentru a obţine soluții locale;
 gestionarea defecțiunilor software / hardware;
 gestionarea eșecurilor workerilor.
MapReduce a fost proiectat în jurul a două concepte importante, mapper și reducer, în
timp ce comunicarea între procese se realizează pe baza unor liste de perechi de tip cheie-
valoare. Mapper și reducer au fost concepute ca două funcții ce trebuie să fie implementate de
către utilizator cu următoarele semnături:
 ,

 .

Funcția map se aplică fiecărei perechi de date de intrare generând o listă de


perechi la ieșire, care, la rândul lor, reprezintă datele de intrare pentru reducer.
Între cele două task-uri se efectuează o operație de grupare, astfel încât datele de ieşire de la
primul task ajung la cel de-al doilea task ordonate și grupate după o cheie. De obicei, un
reducer primește date de la mai mulți mapperi, conducând astfel la un numărul de reduceri
mai mic decât numărul de mapperi.
Funcția reduce primește o pereche , unde este o listă ce conține toate
valorile intermediare asociate cu aceeași cheie intermediară , le agregă și produce o listă
de perechi . Instanțele map și reduce sunt distribuite pe mai multe mașini din

11
cluster, pentru a putea fi procesate (rulate) în paralel. Cheile și valorile pot fi de orice tip,
definite sau nu de către utilizator.
Există o singură regulă care se aplică pentru datele de ieșire ale mapperului și pentru
datele de intrare ale reducerului: tipul cheilor și al valorilor din datele de ieşire ale mapperului
trebuie să se potrivească cu tipul cheilor și al valorilor din datele de intrare ale reducerului,
figura 4.
Iată câteva exemple de algoritmi dezvoltați utilizând tehnica MapReduce: pi, distribuited
grep, index inversat, calculul frecvențelor numărului de adrese URL etc. [11], [12], [13], [14].
Pentru a reduce traficul de rețea încărcat de schimbul de date între nodurile mapper și
nodurile reducer implicate în aceeași lucrare MapReduce, se poate introduce un task
combiner. Un combiner poate fi văzut ca un task „mini-reducer”, care funcționează numai pe
datele generate de o mașină.

Figura 4 Modelul MapReduce

12
Capitolul 2. Algoritmi pentru calculul indexului Jaccard

2.1 Introducere
La ora actuala structurile de date de tip graf, începând cu rețelele sociale precum
Facebook, MySpace, NetFlix și terminând cu rute de transport sau arhitectura infrastructurii
Internet. Aceste grafuri continuă să crească în dimensiuni și există o mulțime de date noi pe
care oamenii ar dori să le deducă din numeroasele fațete ale informațiilor stocate în aceste
structuri de date.
Grafurile pot avea miliarde de vârfuri și muchii. Graful citarilor, graful afilierilor, graful
de convorbirilor de mesagerie instant, graful apelurilor telefonice fac parte din așa-numita
analiză a rețelelor sociale. În lucrarea [24] este arătat că, în ciuda presupunerii ca aceste
grafuri sunt grafuri rare, densitatea acestora crește în timp.
Dezvoltarea și implementarea unor algoritmi capabili de a prelucra cantități uriașe de date
a devenit mai accesibilă datorită cloud-computing [1] și modelului de programare MapReduce
[15], care a permis dezvoltarea unor framework-uri open-source, cum ar fi Apache Hadoop.
Un rol foarte important în evoluția cloud computing îl joacă Amazon, care oferă cea mai
utilizata bibliotecă online din întreaga lume. Această companie a introdus două servicii de
cloud computing, destinate inițial doar pentru utilizarea internă și care, în timp, au devenit
foarte populare în cadrul comunității IT datorită proiectării inteligente, ceea ce a condus la o
utilizare facilă pentru programatori: EC217 - pentru calcule și S3e18 - pentru depozitarea și
gestionarea resurselor.
Aplicațiile MapReduce sunt extrem de largi, fiind întâlnit de exemplu la framework-uri de
calcul distribuit cu aplicații în securitatea sistemelor informatice, cum ar fi detectarea botnet-
ilor şi clasificarea spamului [16] sau detectarea spamului [17]. Autorii ultimei lucrări au
utilizat setul de date WEBSPAM-UK2007 pentru verificarea experimentala a algoritmilor
propusi, set de date pe care l-am utilizat pentru validarea rezultatelor prezentate in acest
capitol.

17
Amazon Elastic Compute Cloud - http://aws.amazon.com/ec2/
18
Amazon Simple Storage Service - http://aws.amazon.com/s3/
13
În [18] autorii analizează corpusul relațiilor cu utilizatorii al site-ului de știri de tehnologie
Slashdot. Lucrarea explorează, printre alte elemente caracteristice, caracteristicile la nivel de
legătură, cum ar fi distanțe și măsuri de similaritate.
De-a lungul timpului au fost definite și studiate mai multe măsuri de similaritate. Datorită
diverselor studii comparative efectuate, cercetătorii au ajuns să cunoască avantajele și
dezavantajele acestora [13]. Una dintre aceste măsuri, indicele de similaritate Jaccard, are
diverse aplicații [19], [20], [21].
În [22] coeficientul Jaccard a fost ales dintre diferite măsuri de similaritate pentru
evaluarea algoritmului de localizare propus Rank Based Fingerprinting (RBF). Într-o altă
lucrare, Leydesdorff [23] prezintă rezultatele unei comparații empirice a mai multor măsuri de
similaritate directe și indirecte: corelațiile de rang Spearman între puterea de asociere
(denumită afinitatea probabilistică sau indicele de activitate), cosinusul și indicele Jaccard.
Măsurile sunt aplicate unui set de date de intrare mai mic decât cel luat în considerare în acest
capitol, format din frecvențele de co-citare a 24 de autori.
Implementarea prezentată în continuare pentru calculul indicelui de similaritate Jaccard
este inspirată din [19].

2.2 Măsura de similaritate Jaccard

Din punct de vedere simplu, măsurile de similaritate denotă apropierea dintre două sau
mai multe obiecte. O clasă importantă de măsuri de similaritate este reprezentată de funcţiile
de distanță. Fie A o mulțime de elemente, numit spațiu. Fie o funcție ,
având ca argument o pereche de elemente din , fiind un număr real. A se
numeşte spaţiu metric dacă există o funcție , ce satisface următoarele
patru proprietăţi:
[1] (distanţa dintre două elemente este întotdeauna un număr pozitiv). d este
pozitiv definită.
[2] .
[3] (d este simetrică).
[4] (inegalitatea triunghiului).
O funcție d cu proprietățile de mai sus se numește funcție distanță sau metrică.
Noțiunea de similaritate este foarte flexibilă, existând mai multe funcţii de distanță:
distanța Euclidiană, distanța Jaccard, distanța cosinus, distanța de editare, distanța Tanimoto
etc. [13].
14
Una dintre cele mai populare metrici utilizate pentru a evalua gradul de similaritate dintre
două seturi de date este indicele Jaccard (sau coeficientul de similaritate Jaccard) definit ca
raportul dintre cardinalul intersecției a două mulţimi și cardinalul reuniunii acelorași două
mulţimi de date

(1)

Indicele de similaritate Jaccard nu este o funcţie distanță și poate fi aplicat la obiecte care
au atribute binare.
Funcția definită ca diferența dintre 1 și indicele Jaccard este o funcţie distanță (metrică)
cunoscută sub numele de distanţă Jaccard. Măsoară gradul de disimilaritate între două
muțimi de date, definite drept complementul coeficientului Jaccard:

(2)

Exemplu [27]:
Să considerăm două site-uri web notate cu A și B. Dorim să evaluăm gradul de
asemănare pentru aceste două site-uri web, influențat de faptul că partajează aceleași link-
uri (către alte site-uri) în paginile lor web. Vom lua în considerare numai numele site-ului
prezent în URL-ul unui link dintr-o pagină web.
Să presupunem că Host1, Host2, Host3, Host4 sunt toate nume de site-uri la care fac
referire linkurile URL din paginile web de pe cele două site-uri web. Tabelul următor
prezintă legăturile enumerate în paginile web de pe site-urile A și B.
Site Host1 Host2 Host3 Host4
A Da Da Da Da
B Nu Da Nu Nu
Tabelul 1 Distribuţia legăturiloe pentru site-urile A şi B

Site-ul A are mulţimea vecinilor iar site-ul B are


mulţimea vecinilor . Atunci

Fie două obiecte, A și B, descrise de n atribute binare. Indicele Jaccard măsoară, în acest
caz, gradul de similaritate între A și B din punctul de vedere al atributelor. Să considerăm
următoarele variabile:
 - numărul total de atribute din A și B având aceleași valori 1;
15
 - numărul total de atribute având valoarea 0 pentru obiectul A și având
valoarea 1 pentru obiectul B;
 - numărul total de atribute având valoarea 1 pentru obiectul A și având
valoarea 0 pentru obiectul B;
 - numărul total de atribute din A și B având aceleași valori 0.
Formula pentru indicele Jaccard (coeficientul de similaritate Jaccard) devine:

(3)

Câteva exemple referitoare la situaţii în care poate fi utilizat coeficientul de similaritate


Jaccard: similaritatea documentelor, cumpărături online, ratingurile filmelor, similaritatea
utilizatorilor din rețelele sociale etc.

2.3 Descrierea algoritmului de calcul


În această secțiune, vom descrie pașii algoritmului de calcul pentru calculul valorii
măsurii de similaritate Jaccard, având ca punct de pornire [19].

Prima parte este reprezentată de calculul indicelui Jaccard între oricare două noduri ale
grafului de intrare. Acest proces poate fi descompus în trei etape:

1. În prima etapă, datele de intrare sunt citite dintr-un fișier: fiecare linie reprezintă o
muchie a grafului descrisă de cele două vârfuri ale sale. Avem următoarele notaţii
speciale: primul nod reprezintă cheia k, în timp ce al doilea nod reprezintă valoarea v.
Functia map a primul job (a se vedea Algoritmul 1) trebuie doar să analizeze fiecare
linie a fișierului de intrare și să emită perechi .
Algoritmul 1 XYMapper
INPUT:
k - id nodului curent
v – informația nodului
1: class Mapper
2: method Map( , )
3: Emit(k, v) // emite actualizări pentru nodul curent
4: end method
5: end class

CountCardinalReducer (a se vedea Algoritmul 2) calculează pentru fiecare


cheie de intrare k cardinalul mulţimii de valori corespunzătoare. Mulțimea L (
) reprezintă mulţimea de vecini a vârfului de intrare (a cărui valoare

16
este păstrată de cheia k). Pentru fiecare pereche se emite o nouă pereche
, unde reprezintă un vârf din lista de vecini ai vârfului k și va fi
utilizat în continuare pentru intersecția listelor de vecini ale oricăror două vârfuri ale
grafului.
Algoritmul 2 CountCardinalReducer
INPUT:
k - id nodului curent
L – lista vecinilor nodului k
1: class Reducer
2: method Reduce( , )

3: for all do
4: Emit(k, {v, size(L)})
5: end for
6: end method
7: end class

2. În a doua etapă, funcţia map a celui de-al doilea job (a se vedea Algoritmul 3)
primește ca date de intrare valorile calculate de functia reduce a
primului job. Pozițiile vârfurilor în cadrul datelor de intrare sunt interschimbate:
functia map va genera o pereche nouă cheie-valoare de forma
unde v este nodul conținut în partea de valoare procesată de catre functia reduce
de la pasul anterior, în timp ce "valoarea" din această pereche nouă (valoarea
) este compusă din "cheia" k a perechii de intrare și valoarea
cardinalului mulţimii, count.

Algoritmul 3 FromXYToYXMapper
INPUT:
k - id nodului curent
v - un nod din multimea vecinilor nodului curent
count – cardinalul multimii vecinilor nodului
1: class Mapper
2: method Map( , )
3: Emit(v, {k, count})
4: end method
5: end class

A doua functie reduce (a se vedea Algoritmul 4) primește ca date de intrare un vârf al


grafului drept cheie și o listă de perechi ce conțin noduri și dimensiuni ale unor mulţimi. Un
număr maxim de valori sunt grupate împreună într-un șir de caractere. Pentru fiecare șir de

17
caractere, fie având dimensiunea maximă, fie cu valorile rămase, funcţia reduce emite o
pereche constând din șirul vid drept cheie, şi șirul construit drept valoare.
Algoritmul 4 SplitReducer
INPUT:
k – id-ul nodului curent
L – informatia din lista nodurilor
1: class Reducer
2: method Reduce( , )

3:

4: for all do

5:
6: end for
7:
8:
9: Emit(newKey, newValue)
10: end method
11: end class

3. Ultima sarcină din această parte de procesare calculează indicele Jaccard pentru
fiecare pereche de vârfuri.

Metoda map primește un șir vid drept cheie și un șir de caractere str ca valoare (a se
vedea Algoritmul 5) [27]. Elementele din șirul str sunt extrase și păstrate într-o listă
L. Mai departe, se vor construi toate perechile , din fiecare element al listei L,
și fiecare alt element al listei L, , . Metoda emite perechi având drept
cheie o pereche de noduri ale grafului și ca valoare, suma cardinalelor
mulțimilor vecine .

Algoritmul 5 CollectAllPairsMapper
INPUT:
k – id-ul nodului curent
str – sir de caractere
1: class Mapper
2: method Map( , )
3:
4: while (str.hasMoreTokens()) do
5: x parse(str.nextToken())

18
6: c parse(str.nextToken())
7:
8: end while
9: while ( ) do
10:
11:
12: if ( ) then
13: Emit({x, y}, n + m)
14: else
15: Emit({y, x}, n + m)
16: end if
17: end while
18: end method
19: end class
Vom parsa şirul de caractere str, descompunându-l în cuvinte (token-uri). Funcţia
(metoda) hasMoreTokens() întoarce valoarea true dacă şirul str mai are cuvinte
neprocesate. Metoda nextToken() returnează următorul cuvânt din şirul de caractere
str. Metoda parse() transformă un şir de caractere în valoarea numerică asociată.

Ultimul reducer (Algoritmul 6) primește o cheie alcătuită dintr-o pereche de noduri ale
grafului , ale căror liste de vecinătate au intersecția nevidă și o listă de valori,
fiecare valoare reprezentând suma cardinalelor mulțimilor de vecini ai nodurilor :
. Se calculează cardinalul listei L - această valoare reprezintă cardinalul
mulțimii obținute din intersecția dintre mulţimea vecinilor vârfului u și mulţimea vecinilor
vârfului v (numărul de noduri care sunt vecini atât nodului u cât şi nodului v). Indicele
Jaccard al perechii este raportul dintre cardinalul listei L și diferența dintre suma
cardinalelor mulțimilor de vecini și cardinalul intersecției.
Algoritmul 6 ComputeJaccardReducer
INPUT:
{u, v} – o pereche cu două vârfuri
L - lista cu valorile reprezentând suma cardinalelor multimilor de vecini
1: class Reducer
2: method Reduce( , )
3:
4: Emit({u, v}, n/(m-n))
5: end method
6: end class

19
A doua parte este reprezentată de un algoritm ce calculează frecvența valorilor indicelui
Jaccard pentru un graf dat. Algoritmul constă dintr-o singură etapă de procesare MapReduce.
Funcţia map (a se vedea Algoritmul 7) își obține datele din fișierul de intrare, sub formă
de perechi (cheie, valoare), unde fiecare linie din fișierul de intrare este trimisă prin
elementul valoare al perechii și conține valorile corespunzătoare id-urilor a două vârfuri și
valoarea indicelui Jaccard corespunzător lor, u v r. Metoda emite o pereche
unde k reprezintă valoarea indicelui Jaccard asociată perechilor de vârfuri u v, iar
newValue este un șir format din cele două noduri, separate printr-o virgulă.

Algoritmul 7 NodesToJaccardMapper
INPUT:
k - cheia
txt - textul de intrare
1: class Mapper

2: method Map( , )

3: u parse(txt.nextToken())
4: v parse(txt.nextToken())
5: r parse(txt.nextToken())
6: Emit(r, u + ”,” + v)
7: end method
8: end class

Functia reducer (a se vedea Algoritmul 8) primește pentru o valoare a cheii k,lista tuturor
perechilor de noduri care au aceeași valoare pentru indicele Jaccard. Numără elementele din
lista de intrare și emite o pereche , unde k conține valoarea indicelui Jaccard și

reprezintă cardinalul listei de intrare.

Algoritmul 8 CountJaccardValuesReducer
INPUT:
k – valoarea indicelui Jaccard
L– lista de siruri de caractere
1: class Reducer
2: method Reduce ( , )

3:
4: Emit(k, count)
5: end method
6: end class.

20
2.4 Rezultate experimentale

Pentru a testa algoritmul propus am realizat o serie de experimente pe pe un set mare de


date numit WEBSPAM-UK2007 [28]. Din acest set de date am folosit fişierul hostgraph,
ce reprezintă o colecție foarte mare de site-uri adnotate ca spam/non-spam, conținând 114,529
de site-uri, numerotarea nodurilor începând de la 0. Fișierul de intrare pentru implementarea
algoritmului MapReduce conține graful ale cărui noduri sunt site-uri. Un arc între două noduri
ale grafului indică existența a cel puțin unei legături între paginile din primul site către
paginile celui de-al doilea. O linie din fișierul de intrare are următorul format:
dest_1:nlinks_1, dest_2:nlinks_2,…, dest_k:nlinks_k
unde dest_i reprezintă site-ul destinație, iar nlinks_i reprezintă numărul de legături
pagină la pagină dintre site-ul curent având id-ul egal cu numărul de linie şi site-ul dest_i.
Când un site nu are nicio legătură către un alt site, linia sa corespunzătoare este goală.
Am procesat fişierul specificat pentru a obține un nou fișier care să conțină listele de
adiacență ale nodurilor din graful site-urilor. Fiecare linie din fișierul original este parsată
obţinând ca rezultat o secvenţă de linii noi, fiecare având o structură de forma [site curent
- fiecare site de pe linia initială].

Indicele
Node1 Node2
Jaccard
100012 100002 0.016528925
100021 100002 0.002851711
100024 100012 0.023121387
100024 100021 0.018365473
100059 100007 0.1
100059 100012 0.006264462
100061 100024 0.012987013
100062 100010 0.03125
100062 100018 0.045454547
100064 100021 0.001897533
100083 100077 0.33333334
100088 100010 0.03448276
100107 100104 0.25

Tabelul 2. Valorile indicelui Jaccard pentru un eșantion de perechi de noduri din graful Webspam-
Uk2007.

Aplicația a fost rulată pe un cluster virtual, format din șase mașini virtuale. Mașina
principală a găzduit daemoni pentru NameNode, Secondary NameNode și JobTracker, în timp
ce daemoni DataNode și TaskTracker au rulat pe celelalte cinci mașini din cluster (slaves).

21
Fiecare mașină virtuală avea 1 GB RAM, un procesor dual corel de 1.99 GHz și un
hard disk cu o capacitate de 25 GB. Mașinile virtuale au fost lansate și gestionate folosind
VMWareESX 5.019. Versiunea Hadoop instalată pe aceste mașini a fost Hadoop 0.18.0 [25],
[26].Mărimea fișierului de intrare pentru aplicație a fost de 16 MB, în timp ce dimensiunea
fișierului rezultat a fost de peste 2 GB. Câteva linii din fișierul de ieșire sunt listate în tabelul
2.
Histograma indicelui Jaccard este reprezentată în figura 4 [26], unde se poate vedea că
majoritatea nodurilor din graful considerat au coeficientul de similaritate Jaccard inclus în
intervalul [0.0, 0.1). Acest interval conține peste 70000000 de valori ale indicilor, astfel
majoritatea nodurilor din graful nostru sunt complet diferite (din punct de vedere al
asemănării). În ceea ce privește nodurile identice din punct de vedere al similitudinii, există
mai mult de 150000 de indici având valoarea 1, în timp ce peste 50 000 sunt aproape identici,
având valoarea coeficientul Jaccard aparţinând intervalului [0.9, 1.0). Pentru a examina
în continuare intervalul [0.0, 0.1), a fost împărțit în intervale mai mici, rezultatele fiind
afișate în figura 5 [27].

Figura 4. Histograma indicelui Jaccard pentru setul de date WEBSPAM-UK2007

19
http://www.vmware.com/products/esxi-and-esx/
22
Figura 5. Distribuția valorilor indicelui Jaccard pe intervalul [0.0, 0.3) pentru setul de date
WEBSPAM – UK2007

Din această figură, se poate observa că cele mai multe site-uri din setul de date ales au una
sau două legături comune pentru fiecare 100 de site-uri adiacente. Distribuția indicelui
Jaccard este foarte eterogenă din cauza setului de date ales. Valori mai mici sunt obținute în
functie de numărul de site-uri care au valori ale coeficientului de similaritate Jaccard de la
0.13-0.14 (pentru site-urile care au 13-14 legături comune la fiecare 100 de vecini).

2.5 Concluzii
În ceea ce privește mulţimea de date WEBSPAM-UK2007, să luăm în considerare două
site-uri diferite și . Să notăm cu A mulțimea de site-uri vecine cu (site-uri care au
cel puțin o pagină web indicată de către un link conţinut de o pagină web din ) și B
mulțimea de site-uri vecine cu . Indicele Jaccard pentru și reprezintă reprezintă
măsura suprapunerii mulțimilor A și B. Cu alte cuvinte, această valoare reprezintă numărul de
site-uri vecine simultan cu cele două site-uri și raportat la numărul total de site-uri
care sunt vecine cu cel puţin unul dintre cele două site-uri considerate.
Dacă două site-uri și au indicele Jaccard ≈ 1, atunci:
1) putem concluziona că gradul lor de hub este similar luând în considerare doar numărul
de site-uri la care se referă (considerăm noțiunea de hub așa cum a fost introdusă pentru
algoritmul HITS [29]);
2) ar putea fi o măsură bună pentru clasificarea site-urilor ca fiind spam / non-spam (dacă
un site a fost deja clasificat ca fiind spam, atunci toate site-urile care au indicele Jaccard ≈ 1,
sunt candidați buni pentru aceeași etichetare);

23
3) cele două site-uri sunt conectate din punct de vedere semantic (dacă au în comun o
mulțime de site-uri învecinate, atunci informațiile pe care le găzduiesc sunt similare).
Pe de altă parte, un indice Jaccard ≈ 0 înseamnă că cele două site-uri au mai puține
trăsături caracteristice comune din punct de vedere semantic.
Scopul principal a fost dezvoltarea unei aplicații distribuite pentru a calcula una dintre
cele mai populare măsuri de similaritate, coeficientul Jaccard, și utilizarea aplicației pentru
evaluarea gradului de similaritate sau disimilaritate pentru nodurile din grafuri foarte mari.
Am ilustrat modul în care framework-ul Apache Hadoop și modelul de programare
MapReduce pot fi utilizate pentru un volum mare de calcule. Aplicația a fost implementată
într-un cluster Hadoop unde s-au efectuat experimente folosind un set de date din lumea reală,
în timp ce rezultatele au fost analizate și interpretate.

Bibliografie

[1]M. Armbrust, A. Fox, R. Griffith, A. Joseph, R. Katz, A. Konwinski, G. Lee, D.


Patterson, A. Rabkin, I. Stoica, D. Zaharia, A view of cloud computing, Communication of
the ACM, 53(4), 50–58, 2010.
[2]P. Mell, T. Grance, The NIST Definition of Cloud Computing, National Institute of
Science and Technology, September 2011.
[3]European Commission Expert Group Report, The Future of Cloud Computing, January,
2010. http://ec.europa.eu/information_society/newsroom/cf//document.cfm?doc_id=1175
[4] J. E. Smith, R. Nair, The Architecture of Virtual Machines, Computer, vol. 38, issue 5,
2005, pp. 32-38, http://dx.doi.org/10.1109/MC.2005.173
[5] J. Sugerman, G. Venkitachalam, B.-H. Lim, Virtualizing I/O Devices on VMware
Workstation's Hosted Virtual Machine Monitor, Proceedings of the General Track: 2002
USENIX Annual Technical Conference, 2001, pp. 1-14.
http://dl.acm.org/citation.cfm?id=647055.715774
[6] B. Irving, Big data and the power of Hadoop, Yahoo! Hadoop Summit, 2010.
[7] T. White, Hadoop: The Definitive Guide. Storage and Analysis at Internet Scale, 3rd
Edition, O’Reilly Media / Yahoo Press, 2012.
[8]McKinsey Global Institute. Big data: The next frontier for innovation, competition, and
productivity, 2011.
[9] R. Chellappa, Intermediaries in cloud-computing: A new computing paradigm, in
INFORMS Dallas 1997 Cluster: Electronic Commerce, Dallas, Texas, 1997.
24
[10] J. Dean, S. Ghemawat, MapReduce: simplified data processing on large clusters. in
Proceedings of the 6th Conference on Symposium on Operating Systems Design &
Implementation (OSDI04), vol. 6, pp. 137–150, 2004.
[11] D. Borthakur, Hadoop architecture and its usage at Facebook,
http://borthakur.com/ftp/hadoopmicrosoft.pdf, 2009.
[12] J. Lin, C. Dyer, Data-intensive text processing with MapReduce, Morgan&Claypool
Publishers, 2010.
[13] J. Leskovec, A. Rajaraman and J. D. Ullman, Mining of Massive Datasets, 2nd
edition, Cambridge University Press, 2014.
[14] T. White, Hadoop: The Definitive Guide, 4th edition, O'Reilly Media, 2015.
[15] J. Zhao, J. Pjesivac-Grbovic, MapReduce – The Programming Model and Practice,
Sigmod 2009 Tutorial, 2009.
http://static.googleusercontent.com/media/research.google.com/en//archive/papers/
mapreduce-sigmetrics09-tutorial.pdf
[16] G. Caruana, M. Li, and M. Qi, A MapReduce based parallel SVM for large scale
spam filtering, in 8th International Conference on Fuzzy Systems and Knowledge
Discovery (FSKD), vol. 4, IEEE, pp. 2659-2662, 2011.
[17] W. Indyk, T. Kajdanowicz, P. Kazienko, and S. Plamowski, Web Spam Detection
Using MapReduce Approach to Collective Classification, in International Joint
Conference CISIS/ICEUTE/SOCO Special Sessions, Springer, 189:197-206, 2013.
[18] J. Kunegis, A. Lommatzsch, and C. Bauckhag, The Slashdot Zoo: Mining a Social
Network with Negative Edges, in Procedings of World Wide Web Conference, pp. 741-
750, 2009.
[19] J. Bank, and B. Cole, Calculating the Jaccard Similarity Coefficient with Map Reduce
for Entity Pairs in Wikipedia, 2008.
[20] S. Engen, V. Grøtan, and B.-E. Sæther, Estimating similarity of communities: a
parametric approach to spatio-temporal analysis of species diversity, Ecography, 34:220-
231, 2011.
[21] C. M. Mulqueen, T. A. Stetz, J. M. Beaubien, and B. J. O’Connell, Developing
Dynamic Work Roles Using Jaccard Similarity Indices of Employee Competency Data,
Ergometrika, 2:26-37, 2001.

25
[22] J. Machaj, R. Pich, and P. Brida, Rank Based Fingerprinting Algorithm for Indoor
Positioning, International Conference on Indoor Positioning and Indoor Navigation
(IPIN), pp. 1-6, 2011.
[23] L. Leydesdorff, On the Normalization and Visualization of Author Co-Citation Data:
Saltons Cosine versus the Jaccard Index, Journal of the American Society for Information
Science and Technology, 59(1): 77-85, 2008.
[24] J. Leskovec, J. Kleinberg, and C. Faloutsos, Graphs over time: Densification laws,
shrinking diameters and possible explanations, in Proceedings of the eleventh ACM
SIGKDD International Conference on Knowledge Discovery in Data Mining (KDD’05),
ACM, pp. 177–187, 2005.
[25] M. Cosulschi, M. Gabroveanu, A. Sbircea, Running Hadoop applications in
virtualization environment, Annals of the University of Craiova, Mathematics and
Computer Science Series, 39(2), pp. 322-333, 2012.
[26] M. Cosulschi, M. Gabroveanu, F. Slabu, A. Sbircea, Experiments with computing
similarity coefficient over big data, 2nd Intelligent Data Analysis with Applications in
Information Retrieval and Machine Learning, 2014, in The 5th International Conference
on Information, Intelligence, Systems and Applications (IISA 2014), IEEE, ISBN 978-1-
4799-6171-9, pp. 112-117, 2014.
[27] M. Cosulschi, M. Gabroveanu, F. Slabu, A. Sbircea, Scaling up a distributed
computing of similarity coefficient with MapReduce, Special Issue of the International
Journal of Computer Science & Applications (IJCSA2015), ISSN 0972-9038, vol.12(2),
pp. 81-98, 2015.
[28]“Web Spam Collections”, Crawled by the Laboratory of Web Algorithmics,
University of Milan, http://chato.cl/webspam/datasets/ [Online; accessed 15-June-2020].
[29] J. Kleinberg, Authoritative sources in a hyperlinked environment, Journal of the
ACM, 46(5), pp. 604-632, 1999.

26

S-ar putea să vă placă și