Proiect Disertatie Automatica Mocanu T Mihai [623143]

Universitatea POLITEHNICA București
Facultatea Automatică și Calculatoare
Departamentul Automatică și Informatică Industrială

LUCRARE DE DIZERTAȚIE
Proces ări Hadoop folosind multiple tipuri de
informație

Coordonator Student: [anonimizat]

2017

1

CUPRINS
1. INTRODUCERE ………………………….. ………………………….. ………………………….. ………………………….. ………. 3
2. SCOPUL LUCRĂRII ………………………….. ………………………….. ………………………….. ………………………….. ….. 4
3. MOTIVARE ………………………….. ………………………….. ………………………….. ………………………….. ……………. 4
4. OBIECTIVE ………………………….. ………………………….. ………………………….. ………………………….. …………….. 6
5. MONGODB ………………………….. ………………………….. ………………………….. ………………………….. …………… 6
6. ANALIZA SENTIMEN TALĂ SI SUBIECTIVITA TEA ………………………….. ………………………….. …………………… 8
6.1 PROBLEMA ANALIZEI SE NTIMENTULUI ………………………….. ………………………….. ……………………. 9
6.2 EVALUAREA SENTIMENTU LUI ȘI A SUBIECTIVIT ĂȚII ………………………….. ………………………….. … 10
6.3 ANALIZA SENTIMENTULU I BAZATĂ PE ELEMENTE ………………………….. ………………………….. …… 10
6.4 ANALIZA SENTIMENTULU I PROPOZIȚIILOR COMP ARATIVE ………………………….. …………………… 10
7. SISTEME DE RECOMANDA RE ………………………….. ………………………….. ………………………….. …………….. 11
8. ALGORITMI DE CLU STERIZARE – ÎNVĂȚAREA NESUPERVIZ ATĂ ………………………….. ………………………… 14
9. RECOMANDĂRI AMAZON.C OM: ITEM -TO-ITEM COLLABORATIVE F ILTERING ………………………….. ……. 20
10. IMPORTANȚA COMENTARI ILOR ASUPRA PRODUSEL OR ………………………….. ………………………….. …… 24
11. DESCRIEREA APLICAȚIEI ………………………….. ………………………….. ………………………….. …………………… 25
CONCLUZII ………………………….. ………………………….. ………………………….. ………………………….. ………………. 32
BIBLIOGRAFIE ………………………….. ………………………….. ………………………….. ………………………….. ………….. 33
ANEXE ………………………….. ………………………….. ………………………….. ………………………….. …………………….. 35

2
LISTĂ DE FIGURI

Figura 1 – Tipuri de baze de date ………………………….. ………………………….. ………………………….. ……………… 4
Figura 2 – Exemplu vizualizare colectie Mongo ………………………….. ………………………….. ……………………….. 8
Figura 3 – Fenomenul cozii lungi ………………………….. ………………………….. ………………………….. …………….. 11
Figura 4 – Stumble Up on ………………………….. ………………………….. ………………………….. ……………………….. 13
Figura 5 – Exemplu review ………………………….. ………………………….. ………………………….. ……………………… 25
Figura 6 – Metoda salvare review ………………………….. ………………………….. ………………………….. …………… 26
Figura 7 – Review în baza de date ………………………….. ………………………….. ………………………….. …………… 26
Figura 8 – Folder review ………………………….. ………………………….. ………………………….. ………………………… 27
Figura 9 – Continut review ………………………….. ………………………….. ………………………….. ……………………… 27
Figura 10 – Datanode Information ………………………….. ………………………….. ………………………….. ………….. 28
Figura 11 – Output job ………………………….. ………………………….. ………………………….. ………………………….. . 29
Figura 12 – Search page ………………………….. ………………………….. ………………………….. …………………………. 31
Figura 13 – Rezultate ………………………….. ………………………….. ………………………….. ………………………….. … 31

3
1. INTRODUCERE

Bazele de d ate relaționale sau RDMBS (Relațional database management systems) fac
parte din tehnologia predominantă care este folosită la ora actuală pentru a stoca și păstra date
atât pentru aplicațiile web cât și pentru aplicațiile din companii. Chiar dacă pe parcu rsul timpului
s-a mai încercat adoptarea unor alte tehnologii cum ar fi baze de date bazate pe obiecte sau
stocarea sub formă de XML nu au reușit să fie atât de populare ca bazele de date relaționale,
acestea chiar fiind absorbite ajungându -se să se poată stoca direct un XML și apoi să fie folosit
pentru indexare de text.
Recent conceptul de a avea o singură bază de date care poate acoperi absolut orice nevoie de
stocare a început să fie analizat de către cei care lucrează în domeniu și astfel s -au lovit d e
probleme de eficiență și consistență a datelor lucru ce a făcut posibilă apariția unei varietăți mari
de alternative ale bazelor de date relaționale.
Acest lucru a dus la apariția de baze de date numite NOSQL (not only SQL), utilizat pentru a
specifica creșterea bazelor de date non relaționale care devin din ce în ce mai folosite de către
dezvoltatorii Web.
Conceptele de bază, tehnicile și modelele de programare folosite la implementarea
bazelor de date NoSql sunt următoarele: Consistența datelor care s pune dacă un sistem de date
este consistent sau nu după execuția unor operații. Se poate spune că într -un sistem distribuit de
obicei atunci când cineva efectuează o operație de scriere în baza de date, toți ceilalți clienți care
vor să efectueze o operați e de citire trebuie să aibă disponibile toate datele care au fost scrise
anterior.
Disponibilitatea datelor înseamnă că datele trebuie să fie stocate într -un sistem care
permite citirea și scrierea continuă chiar și atunci când unul dintre computerele di n sistemul
distribuit are o problemă hardware sau software. Toleranța la partiții se referă la faptul că atunci
când comunicația se face în rețea, datele trebuie să fie disponibile chiar dacă între două noduri
din rețea nu se poate realiza o conexiune la m omentul în care se face cererea. Astfel sistemul
trebuie să reușească să gestioneze acest tip de problemă iar una din rezolvări ar fi multiplicarea
datelor astfel încât atunci când un nod nu este disponibil, datele necesare să fie accesate dintr -o
altă loc ație.
Stocarea datelor se realizează sub formă de cheie -valoare, având un model simplu în
comun: un dicționar, o mapare care ajută clienții să pună sau să extragă valori pentru diferite
chei. Pe lângă faptul că ne oferă un API (interfețe ce pot fi impleme ntate în funcție de nevoia de
business), stocările moderne sub formă de cheie valoare favorizează scalabilitatea crescută și
consistentă iar multe dintre ele omit cererile ad -hoc și în special join -urile și operațiile agregate.
De obicei lungimea cheilor s tocare are o dimensiune limitată la un număr de octeți pe când la
valoare sunt mai puține limitări de dimensiune pentru date.

4

Figura 1 – Tipuri de baze de date

Cum se poate vedea în figura 1 sunt patru tipuri de baze de date.
Pentru fiecare tip, se va alege o bază de date și va fi analizată pentru a putea stabili cum se
comportă fiecare bază de date atunci când este vorba de o cantitate mare de informație.
2. SCOPUL LUCR ĂRII

Cercetarea se bazează pe folosirea de multiple baze de date, în vederea alegerii celei mai
potrivite pentru proiectul actual. Se vor studia timpii de răspuns de scriere și citire dar și
stabilitatea de care dau dovadă. De asemenea este foarte importantă utilizarea lor în rețea pentru
a putea fi distribuite pe întreg cluster -ul de computere. Obiectivul general este de a crea o
aplicație cu ajutorul căreia firmele de Business Intelligence (BI) care vor analiza datele provenite
dintr -un lanț de magazine de tip supermarket să poată scoate rapoarte în ceea ce pri vește
vânzările acestora. De asemenea vor putea să precizeze care vor fi vânzările în anumite zile cheie
și cu ce anume trebuie să alimenteze stocul de produse într -un mod eficient. Un obiectiv
secundar al proiectului este învățarea de tehnologii noi și im plementarea lor în aplicații care vor
putea fi folosite pe piață pentru a ușura munca oamenilor.

3. MOTIVARE

Având la bază un sistem de analiză a facturilor și crearea de statistici pe baza rapoartelor
și datorită creșterii cu o viteză foarte mare a d atelor efectuate de către utilizator îmi doresc a crea
un sistem de recomandare pe baza review -urilor date de către utilizator pentru a putea sugera
produce ce pot fi cumpărate în viitor de către utilizator, sau pentru a -l oferi o mai bună
perspectivă asup ra varietății produselor din cadrul unui magazin online.
Web Mining este extragerea de modele interesante și potențial utile și informații implicite din
artefacte sau activități legate de World Wide Web. Există aproximativ trei domenii de
descoperire a cu noștințelor care aparțin domeniului extracției web: Web Content Mining, Web

5
Structure Mining și Web Usage Mining. Extracția de conținut web este procesul de extragere a
cunoștințelor din conținutul documentelor sau din descrierile acestora. Extinderea text ului
documentului web, descoperirea resurselor bazate pe indexarea conceptelor sau tehnologia
bazată pe agenți poate, de asemenea, să aparțină aceastei categorii. Extracția structurilor web este
procesul de deducere a cunoștințelor de la organizația World Wide Web și legăturile dintre
referințe și referințe pe Web. În cele din urmă, extinderea utilizării web, cunoscută și sub numele
de Web Log Mining, este procesul de extragere a modelelor interesante din jurnalele de acces
web.
Exploatarea conținutului web (Web Content Mining) este un proces automat care depășește
extracția cuvintelor cheie. Deoarece conținutul unui document text nu prezintă semantică care
poate fi citită de mașină iar unele abordări au sugerat restructurarea conținutului documentului
într-o reprezentare care ar putea fi exploatată de mașini. Metoda obișnuită de a exploata structura
cunoscută în documente este de a utiliza wrappers pentru a cartografia documentele la un anumit
model de date. Există două grupuri de strategii de extracție a co nținutului web: acelea care cauta
direct în conținutul documentelor și cele care se îmbunătățesc după căutarea de conținut a altor
instrumente, cum ar fi motoarele de căutare.
World Wide Web poate dezvălui mai multe informații decât informațiile conținute în documente.
De exemplu, link -urile către un document indică popularitatea documentului, în timp ce link –
urile care apar într -un document indică bogăția sau, probabil, varietatea de subiecte acoperite în
document. Acest lucru poate fi comparat cu bibliogr afia sau referințe bibliografice. Atunci când
o lucrare este citată frecvent, ar trebui să fie importantă. Metodele PageRank și CLEVER profită
de aceste informații primite de la link -urile pe care le găsim pentru a afișa paginile web
relevante.
Serverele web înregistrează și acumulează date despre interacțiunile utilizatorilor ori de câte ori
sunt primite cereri de resurse. Analizând jurnalele de acces web ale diferitelor site -uri web, puteți
ajuta la înțelegerea comportamentului utilizatorilor și a struct urii web, îmbunătățind astfel
designul acestei colecții colosale de resurse. Există două tendințe principale în Web Usage
Mining, determinat de aplicațiile descoperirilor:
Urmărirea generală a modelelor de acces și urmărirea personalizată a utilizării.
Urmărirea generală a tipului de acces ce analizează jurnalele web pentru a înțelege modelele și
tendințele de acces. Aceste analize pot pune în lumină structura mai bună și gruparea furnizorilor
de resurse. Există multe instrumente de analiză web, dar sunt li mitate și, de obicei,
nesatisfăcătoare.

6
4. OBIECTIVE

Obiectivul general al acestei cercetări este acela de a îmbunătăți sistemul de recomandare a
produselor încercând astfel folosirea datelor primite ca și feedback de la utilizator și nu doar
descrier ea produsului dar și luarea în condiserare a factorului uman cum ar fi “ironia” sau
“entuziasmul” din momentul adăugării evaluării. Se va încerca descărcarea unui dump de baza
de date de pe Amazon și analizarea acestor date în vederea creării unui sistem d e recomandare.
Se vor folosi următoarele tehnici de învățare:

 învățarea supervizată (clasificarea datelor și păstrarea elementelor esențiale) și
clusterizarea (învățarea nesupervizată)
 tehnicilor de bază pentru modelarea termenilor, documentelor și inter ogărilor web, dar și
calcularea relevantei acestora;

5. MONGODB

MongoDB este o bază de date opensource care folosește un model de date ce vizează
documentele. Aceasta este unul dintre tipurile de baze de date care au avut o ascensiune la
mijlocul anil or 2000 sub bannerul NoSQL. MongoDB este construit pe baza unei arhitecturi a
colecțiilor și a documentelor, nefiind folosite tabele și rânduri că în bazele de date relaționale.
Documentele cuprind seturi de perechi cheie -valoare și sunt unitatea de baza de date în
MongoDB. Colecțiile conțin seturi de documente și funcționează ca echivalentul tabelelor de
baze de date relaționale.
Ca și alte baze de date NoSQL, MongoDB susține designul dinamic al
schemelor,permițând documentelor dintr -o colecție să aibă câ mpuri și structuri diferite. Baza de
date folosește un format de stocare a documentelor și de schimb de date numit BSON, care
furnizează o reprezentare binară a documentelor de tipul JSON. Împărțirea automată permite
distribuirea datelor dintr -o colecție p e mai multe sisteme pentru scalabilitate orizontală, pe
măsură ce volumul de date crește.
Acest tip de baze de date accepta câmpuri, interogări de intercal precum și căutări ale
expresiilor regulate. Interogările pot returna câmpuri specifice ale documente lor și de asemenea
include funcții JavaScript definite de către utilizator. De asemenea, interogările pot fi
configurate să returneze o monstră aleatorie de rezultate dintr -o anumită dimensiune. Câmpurile
dintr -un document MongoDB pot fi indexate cu indic i primari și secundari.
MongoDB conferă disponibilitate ridicată cu seturi de replici. Un set de replici constă din
două sau mai multe copii ale datelor. Fiecare membru al setului de replici poate acționa în rolul
replicii primare sau secundare în orice mo ment. Toate scrierile și citirile sunt realizate în replică
primară în mod implicit. Replicile secundare pot conține o copie a datelor primare folosind
replicare încorporate. Atunci când o replică primară eșuează, setul de replică conduce automat un
proce ss de alegere pentru a determina ce secundară trebuie să devină primară. Secundarele pot

7
servi opțional operații de citire, dar acea informație este în cele din urmă consistente în mod
implicit.
MapReduce este un model de programare și o implementare asoci ată pentru procesarea și
generarea seturilor mari de date cu un algoritm paralel, distribuit pe un cluster. Acesta poate fi
folosit pentru pentru procesarea în serie a operațiunilor de date și agregare. Cadrul de agregare
permite utilizatorilor să obțină t ipul de rezultate pentru care clauza SQL GROUP BY este
folosită. Operatorii de agregare pot fi strânși împreună pentru a forma o conductă – analog cu
țevile Unix. Cadrul de agregare include operatorul $lookup care poate uni documente din mai
multe document e, precum și operatori de statistică, cum ar fi abaterea standard.
MongoDB scalează orizontal folosind împărțirea datelor. O împărțire a bazei de date este
o partiție orizonatala a datelor într -o bază de date sau un motor de căutare. Fiecare partiție
individuală este denumită un shard (împărțire) sau un shard de baza de date. Acesta este pe o
instanță separată a serverului, pentru a distribui sarcinile.Utilizatorul alege o cheie shard(de
împărțire) ce determina modul în care datele dintr -o colecție vor fi distribuite. Datele sunt
împărțite în interval (bazate pe cheia shard) și distribuite pe mai multe fragmente. MongoDB
poate rula pe mai multe severe, echilibrând datele de încărcare sau duplicare pentru a menține
sistemul în funcțiune în cazul unei def ecțiuni hardware.
Atunci când vine vorba de arhitecura, MongoDB conferă driver oficiale pentru o varietate
de limbaje de programare populare și medii de dezvoltare. De asemenea, există un număr mare
de drivere neoficiale sau încurajate de către comunitate și pentru cadre sau alte limbaje de
programare.

Instalarea bazei de date Mongo:

1. Descărcarea ultimei versiuni de bază de date accesând:
https://www.mongodb.org/downloads#production
2. Crearea locației de stocare a bazei de date ( pentru windows locația prestabilită este
C:\data\db
3. Pornirea procesului mongod.exe
4. Accesarea bazei de date folosind Robomongo, utilitar de management al bazei de date
(portul pe care este pornită baza de date este 27017 inițial)

8

Figura 2 – Exemplu vizualizare colect ie Mongo
Pentru pornirea securizată a bazei de date se folosesc următorii pași:

1. Se deschide Shell -ul folosind mongo.exe
2. Se folosește comanda : use admin pentru a accesa baza de date cu configurări
3. Se adaugă un utiliz ator cu acces de root
db.createUser(
{
user: "accountUser",
pwd: "password",
roles: [ "readWrite", "dbAdmin" ]
}
)
Pentru a face un user să fie root este nevoie ca el să fie în următoarele grupuri :
readWriteAnyDatabase,
dbAdminAnyDat abase,
userAdminAnyDatabase
4. Se pornește procesul mongod.exe cu comanda –auth sau se adaugă următoarea linie în
fișierul config.properties “auth=true”

6. ANALIZA SENTIMENTALĂ SI SUBIECTIVITATEA

Informațiile textuale din lume pot fi în mare parte clas ificate în două tipuri principale:
fapte și opinii. Faptele sunt expresii obiective despre entități, evenimente și proprietățile lor.
Opiniile sunt de obicei expresii subiective care descriu sentimentele, aprecierile sau sentimentele
oamenilor față de enti tăți, evenimente și proprietățile lor. Conceptul de opinie este foarte larg. În
cele ce urmează, ne concentrăm doar pe expresiile de opinie care transmit sentimentele pozitive

9
sau negative ale oamenilor. O mare parte din cercetările existente asupra textul ui și procesarea
informațiilor a fost axată pe extragerea și regăsirea informațiilor factuale, de exemplu informații.
Regăsirea, căutarea pe Web, clasificarea textului, gruparea de texte și multe alte analize de text și
limbajul natural. S -au făcut prea pu ține lucruri cu privire la procesarea opiniilor decât până de
curând. Opiniile sunt atât de importante încât ori de câte ori avem nevoie să luăm o decizie,
dorim să auzim opiniile altora. Acest lucru nu este valabil numai pentru indivizi, ci și pentru
organizații.
Unul dintre principalele motive ale lipsei studiului asupra opiniei este faptul că nu exista
un text avizat disponibil înainte de World Wide Web. Înainte de Web, când o persoană trebuia să
ia o decizie, cerea în mod tipic opinii de la prieteni și familii. Când o organizație dorea să
găsească opinii sau sentimente ale utilizatiorilor despre produsele și serviciile sale, realiza
sondaje de opinie. Cu toate acestea, cu Web -ul, în special cu creșterea explozivă a datelor
generate de către utilizatori, lumea a fost transformată.
Web -ul a schimbat în mod dramatic modul în care oamenii își exprimă opiniile. Acum utilizatorii
pot crea recenzii de produse la site -urile comercianților și să -și exprime opiniile despre aproape
orice în forumurile de pe Internet . Grupuri de discuții și bloguri, denumite colectiv conținutul
generat de utilizatori. Acestea reprezintă surse noi și măsurabile de informații cu multe aplicații
practice. Acum, dacă cineva dorește să cumpere un produs, el nu se mai limitează la a -și într eba
prietenii deoarece există multe recenzii despre produse pe Web care oferă opinii ale utilizatorilor
existenți ai produsului. Pentru o companie, nu mai este necesar să se efectueze sondaje, să
angajeze consultanți externi pentru a găsi opinii ale consum atorilor cu privire la produsele sale,
deoarece conținutul generat de utilizatori de pe Web le poate oferi deja astfel de informații.
Cu toate acestea, găsirea surselor de opinie și monitorizarea acestora pe Web poate fi încă o
sarcină destul de grea deoar ece există un număr mare de surse diverse și fiecare sursă poate avea,
de asemenea, un volum imens de opinii. În multe cazuri, opiniile sunt ascunse în posturile și
blogurile pe forumuri lungi.Este dificil pentru cititorul uman să găsească surse relevante, să
extragă propoziții înrudite cu opinii, să citească să le facă un rezumat și să le organizeze în forme
utile. Astfel, pentru descoperirea automată a opiniei sunt necesare sisteme de sumare. Analiza
sentimentului este o problemă dificilă de prelucrare a limbajului natural sau de analiză a textului.
Datorită valorii sale extraordinare pentru aplicații practice, a existat o creștere explozivă a
ambelor cercetări în mediul academic și universitar. Există acum cel puțin 20 -30 de companii
care oferă servicii d e analiză a sentimentului
Numai în SUA acest domeniu de cercetare se concentrează pe următoarele subiecte:
6.1 PROBLEMA ANALIZEI SE NTIMENTULUI
Ca orice problemă științifică, înainte de a o rezolva, trebuie să o definim pentru a forma
problema. Formularea v a introduce definițiile de bază, conceptele de bază și problemele, sub –
problemele și obiectivele -țintă. De asemenea, servește ca un cadru comun pentru unificarea
diferitelor direcțiile de cercetare. Din punct de vedere al aplicației, acesta spune practican ților
care sunt sarcinile principale, intrările și ieșirile acestora și modul în care rezultatele pot fi
utilizate în practică.

10
6.2 EVALUAREA SENTIMENTU LUI ȘI A SUBIECTIVIT ĂȚII
Aceasta este zonă care a fost studiată cel mai mult inmediul academic. Tratează analiza
sentimentului că o problemă de clasificare a textului.
Primul subiect, cunoscut sub numele de clasificarea sentimentului sau clasificarea sentimentului
la nivel de document, își propune să găsească sentimentul general al autorului într -un text avi zat.
De exemplu, pentru un produs, determină dacă recenzorul este pozitiv sau negativ cu privire la
produs. Al doilea subiect merge la propoziții individuale pentru a determina dacă o propoziție
exprimă o opinie sau nu (deseori numită subiectivitate) și, d acă da, dacă opinia este pozitivă sau
negativă (numită nivel de propoziție sentiment).
6.3 ANALIZA SENTIMENTULU I BAZATĂ PE ELEMENTE
Acest model descoperă mai întâi obiectivele pe care au opiniile au fost exprimate într -o
propoziție și apoi determină dacă o piniile sunt pozitive, negative sau negative neutru. Obiectivele
sunt obiecte și componentele, atributele și caracteristicile acestora. Un obiect poate fi un produs,
serviciu, individ, organizație, eveniment, subiect, etc. De exemplu, într -o propoziție de revizuire
a produsului, se identifică caracteristicile produsului care au fost comentate de către recenzor și
se determină dacă comentariile sunt pozitive sau negative. De exemplu, "Durata de viață a
bateriei este prea scurtă ", comentariul se referă la" d urata de viață a bateriei " a camerei și opinia
este negativă. Multe exemple ale vieți reale solicită acest nivel de analiză detaliată, deoarece
pentru a face îmbunătățiri ale produselor trebuie să știm ce componente și / sau caracteristici ale
produsului sunt plăcute sau nu de către consumatori. Aceste informații nu sunt descoperite prin
clasificarea sentimentului și subiectivității

6.4 ANALIZA SENTIMENTULU I PROPOZIȚIILOR COMP ARATIVE

Evaluarea unui obiect se poate face în două moduri principale, evaluar ea directă și
compararea. Aprecierea directă, numită opinie directă, dă rezultate pozitive sau negative și o
opinie despre obiect fără a menționa alte obiecte similare. Compararea înseamnă a compara
obiectul cu alte obiecte similare (de exemplu, produse co ncurente). De exemplu, "Calitatea
imaginii acestei camere este slabă ", exprimă o opinie directă, în timp ce" Calitatea imaginii
acestei camere este mai bună decât cea a aparatului Camera -x ", exprimă o comparație. În mod
evident, este util să identificăm astfel de fraze, extrage opiniile comparative exprimate în ele și
determină ce obiecte sunt preferate.

11
7. SISTEME DE RECOMANDA RE

Sistemele de recomandare utilizează o serie de tehnologii diferite. Aceste sisteme se pot
clasifica în două grupuri:
• Siste mele bazate pe conținut ce examinează proprietățile elementelor recomandate. Exemplu:
dacă un utilizator Netflix a vizionat multe filme de groază, atunci vă recomandă un film clasificat
în baza de date ca având genul "groaza".
• Sistemele de filtrare cola borative recomandă elemente bazate pe măsuri de similaritate intre
utilizatori și / sau elemente. Elementele recomandate unui utilizator sunt cele preferate de
utilizatori similari. Cu toate acestea, aceste tehnologii în sine nu sunt suficiente și există n iște
algoritmi noi care s -au dovedit eficienți pentru sistemele de recomandare.

Înainte de a discuta principalele aplicații ale sistemelor de recomandare, să analizăm
fenomenul cotidian care face ca sistemele de recomandare să fie necesare. Sistemele de l ivrare
fizică se caracterizează printr -o lipsă de resurse. Magazinele de cărămidă au un spațiu de
depozitare limitat și pot arăta clientului doar o mică parte din toate alegerile care există. Pe de
altă parte, magazinele on -line pot face ca orice client să poate vedea ce este disponibil. Astfel, o
librărie fizică poate avea câteva mii de cărți pe rafturile sale, dar Amazon oferă milioane de cărți.
Un ziar fizic poate imprima câteva zeci de articole pe zi, în timp ce serviciile de știri on -line
oferă mii pe zi.
Recomandarea în lumea fizică este destul de simplă. În primul rând, nu exista
posibilitatea de a adapta magazinul la fiecare client individual. Astfel, alegerea ce este pusă la
dispoziție este guvernată numai de numerele agregate. De obicei, librăria v a afișa numai cărțile
cele mai populare și un ziar va tipări doar articolele despre care crede că vor fi cele mai multe
persoane interesate.
În primul caz, cifrele de vânzări guvernează alegerile, în al doilea caz, alegerile celor din
conducere primează.
A fost numită distincția dintre lumea fizică și on -line “fenomenul cozii lungi” (the long tail
phenomenon”).

Figura 3 – Fenomenul cozii lungi

12
Axa verticală reprezintă popularitatea (de câte ori este ales un element). Eleme ntele sunt
ordonate pe axa orizontală în funcție de popularitatea lor. Instituțiile fizice oferă doar cele mai
populare elemente din stânga liniei verticale, în timp ce instituțiile corespunzătoare on -line oferă
întreaga gamă de elemente: coada, precum și articolele populare. Fenomenul coadă lungă
forțează instituțiile on -line să recomande pentru utilizatorii individuali. Nu este posibilă
prezentarea tuturor elementelor disponibile utilizatorului în modul în care instituțiile fizice pot.
Nici nu putem aște pta ca utilizatorii să fi auzit despre fiecare dintre elementele pe care le -ar
putea dori.

Aplicații ale sistemelor de recomandare:

Am menționat câteva aplicații importante ale sistemelor de recomandare, și voi prezenta mai jos
câteva exemple:

1. Recomandările produsului: Poate că utilizarea cea mai importantă a sistemelor de
recomandare este la comercianții on -line. Am remarcat modul în care Amazon sau vânzătorii on –
line similari se străduiesc să prezinte fiecărui utilizator care se întoarce câteva sugestii despre
produsele pe care le -ar putea dori să le cumpere. Aceste sugestii nu sunt aleatoare, ci se bazează
pe deciziile de cumpărare făcute de clienți similari sau pe alte tehnici pe care le vom discuta în
continuare.

2. Recomandări de filme: Net flix oferă clienților săi recomandări de filme pe care le -ar
putea dori. Aceste recomandări se bazează pe evaluările oferite de utilizatori, la fel ca evaluările
sugerate în matricea de utilitate. Importanța prognozării cu exactitate a ratingurilor este at ât de
mare încât Netflix a oferit un premiu de un milion de dolari pentru primul algoritm care ar putea
învinge propriul sistem de recomandări cu 10% . Premiul a fost în cele din urmă câștigat în 2009
de către o echipă de cercetători numită " Bellkor Pragm atic Haos ", după peste trei ani de
competiție.

3. Articole de știri: Serviciile de știri au încercat să identifice articole de interes pentru
cititori, pe baza articolelor pe care le -au citit în trecut. Similitudinea se poate baza pe
similitudinea cuvin telor importante din documente sau pe articolele citite de oameni cu gusturi
de citire similare. Aceleași principii se aplică și recomandării blogurilor din rândul a milioane de
bloguri disponibile, videoclipurilor de pe YouTube sau altor site -uri în care conținutul este
furnizat în mod regulat.

Matricea de utilitate

Fără o matrice de utilitate, este aproape imposibil să recomandăm articole. Cu toate
acestea, dobândirea datelor din care să se construiască o matrice de utilitate este adesea dificilă.
Există două abordări generale pentru a descoperi valoarea pe care utilizatorii o plasează pe
elemente.

1. Putem cere utilizatorilor să evalueze articolele. Evaluările filmelor sunt obținute în general în
acest fel, iar unele magazine online încearcă să obțină ratinguri de la cumpărătorii lor. Site -urile

13
care furnizează conținut, cum ar fi unele site -uri de știri sau YouTube, solicită, de asemenea,
utilizatorilor să evalueze articolele. Această abordare este limitată în ceea ce privește eficacitatea
acesteia, d eoarece, în general, utilizatorii nu sunt dispuși să ofere răspunsuri, iar informațiile de
la cei care fac acest lucru pot fi părtinitoare chiar de faptul că provine de la persoane care doresc
să ofere ratinguri.

2. Putem face deducții din comportamentul utilizatorilor. Cel mai evident, dacă un utilizator
cumpără un produs de la Amazon, urmărește un film pe YouTube sau citește un articol de știri,
atunci se poate spune că "îi place" acest articol. Rețineți că acest tip de sistem de rating are într –
adevăr o singură valoare: 1 înseamnă că utilizatorul îi place elementul. Adesea, găsim o matrice
de utilități cu astfel de date afișate mai degrabă cu 0, decât cu semnele în care utilizatorul nu a
cumpărat sau nu a vizualizat elementul. Cu toate acestea, în acest caz 0 nu este un rating mai mic
decât 1; Nu există nicio evaluare. În general, se poate deduce interesul față de alte
comportamente decât cumpărarea. De exemplu, dacă un client Amazon vizualizează informații
despre un articol, putem deduce că este interesa t de element, chiar dacă nu îl cumpără.

Exemplu sistem de recomandare:

StumbleUpon
• comunitate Web
• facilitează descoperirea de site -uri
• sistem de recomandare bazat pe utilizator
• peers (utilizatori cu "gusturi" s imilare)
• friends (aleși de utilizator)
• filtrare colaborativă (eng. "colaborative filtering")
• automatizează "word of mouth"
Principiile sistemului

Figura 4 – Stumble Upon

14
8. ALGORITMI DE CLUST ERIZARE – ÎNVĂȚAREA NESUPERVIZ ATĂ

Analiza clustering a reprezentat o problemă de cercetare în creștere în domeniul exploatării
datelor, datorită varietății sale de aplicații. Odată cu apariția a numeroși algoritmi de clustering
de date în ultimii ani, ut ilizarea lor extensivă în aplicații variate, inclusiv prelucrarea imaginilor,
biologie computațională, comunicare mobilă, medicină și economie, a dus la popularitatea
acestor algoritmi. Problema principală cu algoritmii de grupare a datelor este că nu poat e fi
standardizată. Algoritmul dezvoltat poate da cel mai bun rezultat cu un tip de set de date, dar
poate eșua sau da rezultate slabe cu un set de date de alte tipuri. Deși au existat multe încercări
de standardizare a algoritmilor care pot funcționa bine în toate cazurile de scenarii, dar până
acum nu să realizat o realizare majoră. Mulți algoritmi de grupare au fost propuși până acum. Cu
toate acestea, fiecare algoritm are propriile sale merite și dezavantaje și nu poate funcționa
pentru toate situațiile reale. Înainte de a explora în detaliu diferite algoritmi de grupare, să vedem
o scurtă trecere în revistă a clusterizării.
Clustering -ul este un proces care împarte un set de date dat în grupuri omogene pe baza unor
caracteristici date, astfel încât obie cte similare sunt păstrate într -un grup, în timp ce obiecte
diferite sunt în grupuri diferite. Este cea mai importantă problemă de învățare nesupervizata. Se
ocupă cu găsirea unei structuri într -o colecție de date neetichetate.
Pentru ca algoritmul de grup are să fie avantajos și benefic, unele dintre condiții trebuie
îndeplinite.
1) Scalabilitate – Datele trebuie să fie scalabile, altfel putem obține rezultate greșite
2) Algoritmul de grupare trebuie să poată trata diferite tipuri de atribute.
3) Algoritmul de grupare trebuie să poată găsi date clusterate cu forma arbitrară.
4) Algoritmul de grupare trebuie să fie insensibil la zgomot și la valori excepționale.
5) Abilitatea de interpretare și utilitatea – Rezultatul obținut trebuie să fie interpretabil și u șor de
utilizat, astfel încât cunoștințe maxime despre parametrii de intrare pot fi obținute.
6) Algoritmul de grupare trebuie să fie capabil să se ocupe de setul de date de dimensiuni mari.

Algoritmii de clustering pot fi clasificați în două categorii:
1) Algoritmi de clusterizare liniară nesupravegheată
2) Algoritmi de clusterizare nelinializați nesupravegheați
8.1 ALGORITMI LINIARI NE SUPERVIZATI:
1. Algoritmul k -means
K-means este unul dintre cei mai simpli algoritmi de învățare nesupravegheați care rezolvă
problema bine cunoscută de grupare. Procedura urmărește o modalitate simplă și ușoară de a
clasifica un anumit set de date printr -un anumit număr de clustere (presupune clustere k) fixate

15
apriori. Ideea principală este de a defini centrele k, câte unul pentru fiecare cluster. Aceste centre
ar trebui să fie plasate într -un mod inteligent, din cauza locului diferit, care cauzează rezultate
diferite. Deci, alegerea mai bună este să le plasați cât mai departe unul de celălalt. Următorul pas
este să luaț i fiecare punct care aparține unui set de date dat și să îl asociați cu cel mai apropiat
centru. Când nu este în așteptare niciun punct, primul pas este finalizat. În acest moment trebuie
să recalculăm k noi centroizi cu centrul clusterelor care rezultă di n pasul anterior. După ce avem
aceste k centroizi noi, trebuie făcută o nouă legare între aceleași puncte de setare și cel mai
apropiat centru nou. A fost generată o buclă. Ca rezultat al acestei bucle se poate observa că
centrele k își schimbă locația pas cu pas până când nu se mai fac schimbări sau cu alte cuvinte
centrele nu se mai mișcă.
Avantaje
1) Rapid, robust și ușor de înțeles.
2) Relativ eficient
3) Oferă cel mai bun rezultat atunci când setul de date este diferit sau bine separat unul de altul.

Dezavantaje
1) Algoritmul de învățare necesită specificarea apriori a numărului de centre de cluster.
2) Utilizarea Exclusive Assignment – Dacă există două date care se suprapun foarte mult, atunci
k-means nu va fi capabil să rezolve faptul că există dou ă clustere.
3) Algoritmul de învățare nu este invariabil pentru transformările neliniare, adică cu
reprezentarea diferită a datelor obținute.
4) Măsurile de distanțe euclidane pot afecta în mod inegal factorii subiacenți.
5) Alegerea aleatorie a centrului de cluster nu ne poate conduce la rezultatul fructuos.
6) Aplicabil numai când este definit mediul, adică eșuează pentru datele categorice.
7) Imposibil de manipulat date zgomotoase.
8) Algoritmul nu reușește pentru setul de date neliniar.
2. Algoritmul i erarhic de clusterizare

Algoritmul ierarhic de clusterizare este de două tipuri:

i) algoritmul de grupare ierarhică aglomerată sau AGNES

îi) Algoritmul divizional de grupare ierarhică sau DIANA (analiză divizivă).

Clasificarea ierarhică aglomerată – Acest algoritm funcționează prin gruparea datelor unul
câte unul pe baza celei mai apropiate măsuri de distanță a tuturor distanțelor perechii dintre

16
punctul de date. Din nou, distanța dintre punctul de date este recalculată, dar care este distanța de
luat în considerare când grupurile au fost formate. Pentru aceasta există multe metode
disponibile. Unele dintre ele sunt:

1) distanța unică cea mai apropiată sau o singură legătură.

2) distanța maximă completă sau legătura completă.

3) distanța medie sau m edie.

4) distanță centroidă.

5) metoda secției – suma distanței pătrate eclideene este minimizată.

În acest fel continuăm să grupăm datele până când se formează un grup. Acum, pe baza
graficului de dendograme putem calcula numărul de grupuri care ar tre bui să fie efectiv prezente.

Avantaje

1) Nu există informații apriori cu privire la numărul de grupuri necesare.

2) Ușor de implementat și oferă cel mai bun rezultat în unele cazuri.

Dezavantaje

1) Algoritmul nu poate anula niciodată ceea ce să făcut anterior.

2) Este necesară o complexitate de timp de cel puțin O (n2 log n), unde 'n' este numărul de
puncte de date.

3) Pe baza tipului de matrice de distanță ales pentru fuzionarea diferitilo algoritmi pot suferi una
sau mai multe dintre următoarele:

i) Sensibilitatea la zgomot și la valori excepționale

îi) Spargerea clusterelor mari

iii) Dificultatea manipulării clusterelor de dimensiuni diferite

4) Nici o funcție obiectivă nu este direct minimizată

5) Uneori este dificil să se ident ifice numărul corect de clustere de către dendogramă.

17
8.2 ALGORITMI NELINIARI NESUPERVIZATI

1. Algoritmul de clustering MST

Ideea de bază a algoritmului de grupare pe bază de MST este următoarea:

Se construiește mai întâi MST (arbore minim de spanning ) utilizând algoritmul Kruskal și apoi
se setează o valoare de prag și dimensiunea pasului. Apoi, eliminăm acele margini din MST, ale
căror lungimi sunt mai mari decât valoarea de prag. Apoi calculam raportul dintre distanța între
clustere și distanța într e clustere și înregistrăm raportul, precum și pragul. Actualizăm valoarea
pragului prin creșterea dimensiunii pasului. De fiecare dată când obținem noua valoare de prag
(actualizată), repetăm procedura de mai sus. Oprim repetarea când întâlnim o situație în care
valoarea pragului este maximă și astfel nu se pot elimina marginile MST. În această situație,
toate punctele de date aparțin unui singur cluster. În cele din urmă, obținem valoarea minimă a
raportului înregistrat și formează clusterele corespunzăt oare valorii pragului stocat. Algoritmul
de mai sus are două cazuri extreme:

1) Cu valoarea pragului zero, fiecare punct rămâne în cadrul unui singur grup.
2) Cu valoarea maximă de prag, toate punctele se află într -un singur grup.

Prin urmare, algoritmul propus caută acea valoare optimă a pragului pentru care raportul de
distanță “Intra -Inter” este minimă. Trebuie să menționăm că această valoare optimă a pragului
trebuie să se situeze între aceste două valori extreme ale pragului. Cu toate acestea, pentru a
reduce numărul de iterații, nu am setat valoarea pragului inițial la zero.

Avantaje
1) Performanță comparativă mai bună decât algoritmul k -mean.

Dezavantaje
1) Valoarea pragului și mărimea treptei trebuie să fie definite apriori.

8.3 APLICAȚII ALE A LGORITMILOR DE CLUST ERING

1) Algoritmul de grupare în identificarea datelor asupra cancerului

Algoritmul de grupare poate fi utilizat în identificarea setului de date referitoare la
cancer. Inițial luăm eșantioane cunoscute de date canceroase și non -canceroase. Etichetați atât
setul de date pentru eșantioane. Apoi, amestecăm întâmplător ambele eșantioane și aplicăm
algoritmi de grupare diferite în setul de date mixte (aceasta este cunoscută sub denumirea de fază
de învățare a algoritmului de grupare) și, prin urmare, verificăm rezultatul pentru câte seturi de
date obținem rezultatele corecte) și, prin urmare, putem calcula procentajul rezultatelor obținute
corect. Acum, pentru un anumit set de date arbitrare, dacă aplicăm același algoritm, ne putem
aștept a ca rezultatul să fie același procentaj corect ca în timpul fazei de învățare a algoritmului

18
particular. Pe această bază, putem căuta cel mai bun algoritm de grupare adecvat pentru mostrele
noastre de date.

S-a constatat prin experimente că setul de da te referitoare la cancer dă cele mai bune
rezultate cu algoritmii de grupare non -liniară nesupravegheați și, prin urmare, putem concluziona
natura neliniară a setului de date la cancer.1

2) Algoritmul de grupare în motoarele de căutare

Algoritmul de clasificare este coloana vertebrală din spatele motoarelor de căutare. Motoarele de
căutare încearcă să grupeze obiecte asemănătoare într -un singur grup.. Oferă rezultate pentru
datele căutate în funcție de cel mai apropiat obiect similar care sunt grupat e în jurul datelor care
trebuie căutate. Cu cât algoritmul de grupare utilizat este mai bun, mai mari sunt șansele de a
obține rezultatul dorit pe prima pagină. Prin urmare, definiția obiectului similar joacă un rol
crucial în obținerea rezultatelor căută rii, mai bine definirea obiectului similar mai bine rezultatul
este.2

Majoritatea activităților de brainstorming trebuie făcute pentru definirea criteriilor care trebuie
utilizate pentru obiectul similar.

3) Algoritmul de grupare a datelor academice

Abilitatea de a monitoriza progresul performanței academice a studenților a fost problemă critică
pentru comunitatea academică a învățământului superior. Algoritmul de grupare poate fi folosit
pentru a monitoriza performanța academică a studenților. Pe baza punctajului elevilor, acestea
sunt grupate în clustere diferite (folosind k -means, fuzzy c -means etc), unde fiecare grupare
denotă nivelul diferit de performanță. Cunoscând numărul de elevi din fiecare grupare, putem
cunoaște performanța medie a unei cla se ca întreg.3

4) Algoritmul de grupare în aplicația bazată pe Wireless Sensor Network

Algoritmul de alocare poate fi folosit eficient în aplicația Wireless Sensor Network. O aplicație
în care poate fi utilizată este detectarea minei de teren. Algoritmu l de alocare joacă rolul de a
găsi capetele Cluster (sau centrul de cluster) care colectează toate datele din cluster -ul respectiv.4

1 A Comparison of Fuzzy and Non -Fuzzy clustering Techniques in Cancer Diagnosis by X.Y. Wang and J.M. Garibaldi.
Probability Density Estimation from Optimally Condensed Data Samples by Mark Girolami and Chao He.
2 Clustering Billions of Images with Large Scale Nearest Neighbor Search by Ting Liu, Charles Rosenberg and H.A.
Rowley.
Probability Density Estimation from Optimally Condensed Data Samples by Mark Girolami and Chao He.
3 Application of k -means clustering algorithm for prediction of students' academic performance by O.J. Oyelade,
O.O. Oladipupo and I.C. Obagbuwa.
4 Clustering o f wireless sensor and actor networks based on sensor distribution and connectivity by Kemal Akkaya,
Fatih Senel and Brian McLaughlan.

19
5) Algoritmul de grupare în predicția activității de droguri

Măsuri ale distanței

Pentru a putea stii daca o multime d e puncte sunt apropiate si pentru a fi considerate ca facand
parte din acelasi cluster este nevoie de calcularea distantei dintre cele doua D(x,y), pentru a putea
spune cat de apropiate sunt punctele.
Precum vedem in cursul urmator avem (http://cifr.cs.pub.ro/ullman/cluster1 -ro.pdf) :

“Axiomele uzuale pentru o măsură a distanței D:

1. D(x, x) = 0. Un punct este la distanță 0 de el însuși.

2. D(x, y) = D(y, x). Distanța e simetrică.

3. D(x, y) ≤ D(x, z) + D(z, y). Inegalitatea triunghiului.

Deseori punctele pot fi percepute ca existând într -un spațiu euclidian k -dimensional și distanța
între orice două puncte, x = [x1, x2, …, xk] și y = [y1, y2, …, yk] este dată într -una din
manierele uzuale:
1. Distanța comună ("norma L2 "):
2. Distanța Manhattan ("norma L1"):
3. Maximul pe o dimensiune ("norma L∞"):

Unde nu există un spațiu euclidian în care să plasăm punctele gruparea devine mult mai
dificilă. Iată câteva exemple în care are sens o măsură a distanței în lipsa un ui spațiu euclidian.
Exemplul : Putem privi paginile web ca puncte într -un spațiu generic 108 -dimensional
unde fiecare dimensiune corespunde unui cuvânt. Totuși, calcularea distanțelor ar fi prohibitivă
într-un spațiu atât de mare. O abordare mai bună est e să legăm distanța D(x, y) de produsul
scalar al vectorilor corespunzând lui x și y, din moment ce apoi vom lucra doar cu cuvinte care
se află atât în x cât și în y.

Trebuie să calculăm lungimile vectorilor implicați și acesta sunt egale cu rădăcinile pă trate ale
sumelor pătratelor numerelor de apariție ale fiecărui cuvânt. Suma produselor numerelor de
apariție ale fiecărui cuvânt în fiecare document se împarte la produsul lungimilor pentru a
obține un produs scalar normalizat. Scădem această cantitate di n 1 pentru a afla distanța dintre
x și y.
De exemplu, să presupunem că sunt doar patru cuvinte de interes și vectorii x = [2, 0, 3, 1] și y
= [5, 3, 2, 0] reprezintă numărul de apariții al acestora în două documente.

Wireless Sensor Network based Adaptive Landmine Detection Algorithm by Abhishek Saurabh and Azad Naik.

20
Produsul scalar este 2×5 + 0x3 + 3×2 + 1x 0 = 16, lungimea primului vector este , iar
lungimea celui de -al doilea este.
Astfel,

Asta înseamnă că x și y sunt esențialmente același document; în mod sigur sunt despre
același subiect și vor fi grupate în același cluster.”

Astfel voi folosi for mula de mai sus pentru a putea calcula distantele dintre textele comentariilor
produselor de pe Amazon si de a realiza o statistica de recomandare.
9. RECOMANDĂRI AMAZON.C OM: ITEM -TO-ITEM COLLABORATIVE
FILTERING

Sistemele de recomandare sunt cel mai întâl nite pentru scopul lor în cadrul site -urilor de
e-commerce, unde sunt introduse date despre interesele clienților pentru a genera o listă de
produse recomandate.

Algoritmii de recomandare E -commerce operează de cele mai multe ori în medii dificile.
De ex emplu:
• O companie de vânzări este posibil să aibă o cantitate uriașă de date, zeci
demilioane de clienți și milioane de produse din categorii diferite.
• Multe aplicații necesita că rezultatele să fie returnate în timp real, în nu mai mult
de jumătat e de secundă, cu recomandări la cel mai înalt nivel
• Clienții noi au de obicei informații extrem de limitate, bazate numai pe câteva
cumpărări sau rating -uri de produse
• Clienții mai vechi pot avea o supraabundență de informații, bazate pe mii de
cumpărări și rating -uri
• Datele clienților sunt volatile : Fiecare intractiune produce date folositoare legate
de client, și algoritmul trebuie să răspundă imediat acestor noi informații
În acest moment, există trei modalități pentru a rezolva problema rec omandărilor :
tradițional collaborative filtering, cluster models, și metode search -based. Diferită este însă
soluția celor de la Amazon care propun algoritmul item -to-item collaborative filtering. Spre
deosebire de metodele tradiționale, calculele online ale algoritmului lor scalează independent de
numarulde clienți și de numărul de produse regăsite în catalog. Acest algoritm produce
recomandări de o calitate superioară în timp real, fiind eficient chiar și pentru seturi de date
masive.
Algoritmi de Recom andare
Majoritatea algoritmilor de recomandare încep prin a găsi un set de clienți ale căror
produse cumpărate sau clasificate coincid cu produsele cumpărate sau clasificate ale
utilizatorului. Algoritmul agrega produsele de la acești clienți similari, e limina produsele deja
cumpărate sau clasificate și recomandă produsele rămase utilizatorului. Două verssiuni populare
ale acestor algoritmi sunt collaborative filtering și cluster models. Alți algoritmi – inclusive

21
metodele search -based și item -to-item co llaborative filtering – se axează pe găsirea produselor
similar, nu a clienților similari. Pentru fiecare produs cumpărat sau clasificat al utilizatorului,
algoritmul încearcă să găsească produse similar. Apoi acesta agrega produsele similare și le
recomand a.
Tradițional Collaborative Filtering
Un algoritm de Tradițional Collaborative Filtering reprezintă un client ca un vector N –
dimensional de produse, unde N este numărul de produse distincte din calatog. Componentele
vectorului sunt pozitive pentru cumpăr are sau produse clasificate pozitiv și negativ pentru
produsele clasificate negativ. Pentru a compensa pentru produsele cele mai vândute, algortimul
tipic multiplica componentele vectorului cu inversă frecvenței (inversul numărului de clienți care
au cumpă rat sau clasificat un produs), făcând astfel produsele mai puțin cunoscute mult mai
relevante. Pentru aproape toți clienții acest vector este extrem de rar. Algoritmul genereaz
recomandări bazate pe câțiva clienți care sunt similari cu utilizatorul. Poate să măsoare
similaritatea dintre doi clienți, A și B, pe diferite căi : o metodă des întâlnită este aceea de a
măsura cosinusul unghiului dintre doi vectori :
Algoritmul poate selecta recomandări de la produsele similare ale clienților folosind
metode de a semenea, o tehnică des întâlnită este aceea de a clasifica fiecare produs în funcție de
câți clienți similari l -au achiziționat.
Folosirea collaborative filtering pentru a genera recomandări este scump computațional.
Valoarea este de O(MN) în cel mai rău c az, unde M este numărul de clienți iar N este numărul
produselor din catalog , din moment ce examinează M clienți și până la N produse pentru fiecare
cumpărător. Cu toate acestea, deoarece vectorul clientului mediu este extrem de rar, performanta
algoritmu lui tinde să fie mai apropiată de O(M + N). Scanarea fiecărui client este aproximativ
O(M), nu O(MN), deoarece aproape toți vectorii de client conțin un număr mic de produse,
indiferent de mărimea catalgului. Dar există clienți care au achiziționat și clas ificat un procent
semnificativ din catalog, necesitând un timp de procesare de O(N). Prin urmare, performanta
finală a algoritmului este aproximativ O(M + N). Chiar și așa, pentru seturi de date foare mari
precum cele su 10 milionae sau chiar mai mulți cl ienți și 1 million sau mai multe produse din
catalog – algoritmul întâmpina probelme severe de performanță și scalabilitate.
Este posibil să rezolvăm parțial aceste probleme de scalabilitate prin reducerea mărimea
datelor. Este posibilă reducerea valorări i M prin selectarea aleatorie a clienților sau eliminarea
clienților ce prezintă doar câteva achiziții și reducerea valorii N prin eliminarea produselor foarte
sau deloc populare. Este de asemenea posibilă reducerea numărului de produse analizate de un
mic, constant factor prin partiționarea spațiului produsului bazat pe categroria produsului său
clasificarea subiectului. Tehnicile de reducere dimensională precum clustering și analiza
componentelor principale pot reduce M sau N cu un factor mare.
Din păcat e, toate aceste metode reduc de asemena calitatea recoamndarilor din mai multe
privințe. În primul rând, dacă algoritmul examinează doar un mic eșantion de clienți, clienții
selectați vor fi mai puțin similari utilizatorului. În al doilea rând, partiționar ea produs -spatiu
restictioneaza recomandările către o arie de produs sau subiect specifică. În al treilea rând, dacă
algoritmul elimina cele mai populare sau deloc populare produse, acestea nu vor apărea niciodată
că recomandări iar clienții ce au cumpărat doar acele produse nu vor primi recomandări.
Tehnicile de reducere dimensională aplicate spațiului produsului tind să aibă același efect prin

22
eliminarea produselor cu frecvența redusă. Reducerea dimensională aplicată spațiului clientului
grupează eficient clienți similari în clusters, care pot de asemea degrada calitatea recomandărilor.
Modele Cluster
Pentru a găsi clienți care sunt asemenatori utilizatorului, modelele cluster divid baza
clienților în multe segmente și tratează sarcina că o problemă de cla sificare. Scopul algoritmului
este acela de a atribui utilizatorul segmentului care conține clienții cei mai similari. Apoi acesta
folosește cumpărăturile și clasificările clienților prezente în segment pentru a genera
recomandări.
Segmentele în general su nt create folosind o grupare sau alți algoritmi de învățare nesupervizata,
deși unele aplicații folosesc segmente determinate manual. Folosind un metric de similaritate, un
algoritm de clustering grupează cei mai similari clienți împreună pentru a forma cl usters sau
segmente. Deoarece gruparea optimă pe seturi de date mari este nepractică, majoritatea
aplicațiilor folosesc variate forme de generare de grupare greedy.
Acești algoritmi pornesc de obicei cu un set inițial de segemnte, care de cele mai multe
ori conțin un client selectat aleatoriu fiecare. Apoi aceștia potrivesc clienții în mod repetat cu
segmentele existente, de obicei cu ceva prevedere pentru crearea unor noi segmente sau
îmbinarea unor segmente existente. Pentru seturi de date foarte mari – în special acelea cu
dimensiune mare – eșantionarea sau reducerea dimensională este de asemenea necesară. Odată
ce algoritmul generează segmentele, acesta calculează similaritatea clientului cu vectorii care
rezuma fiecare segment, apoi alege segmentul cu cea mai mare similaritate și clasifică
utilizatorul în consecință. Unii algoritmi clasifica utilizatorii în segmente multiple și descrie
puterea fiecărei relații.
Modelele cluster au o mai bună scalabiliate și performanță online față de collaborative
filtering deoarece acestea compara utilizatorul cu un număr controlat de segmente decât cu o
întreagă bază de clienți. Gruparea computațională complexă și scumpă este rulata offline. Cu
toate acestea, calitatea recomandărilor este joasă.
Modelele cluster gru pează numeroși clienți împreună într -un segment, potrivesc un
utilizator cu un segment, și apoi considera toți clienții aflați în segmentul clienților similari cu
scopul de a face recomandări. Deoarece clienții similari pe care modelele cluster le găsesc n u
sunt cei mai similari clienți, recomandările pe care le produc sunt mai puțin relevante.
Este posibil să se mărească calitatea prin folosirea a numeroase segmente cu granulație
fină, dar apoi clasificare online utilizator – segment devine aproape la fel de scumpă ca găsirea
clienților similari folosinnd collaborative filtering.
Metode Search -Based
Metodele Search – sau content -based tratează problema recomandărilor că o căutare
pentru produsele înrudite. Fiind date produsele cumpărate de către client și clasificate de acesta,
algoritmul construiește o interogare de căutare pentru a găsi alte produse populare de la același
autor, artist, sau regizor, sau cu subiecte sau cuvinte -cheie similare. Dacă un client cumpăra, spre
exemplu collectia de DVD -uri ale f ilmului Godfather, sistemul s -ar putea să recomande alte
titluri de film din categoria de crima -drama, alte filme în care apare Marlon Brando, sau alte
filme regizate de către Francis Ford Coppola.
Dacă utilizatorul are câteva achiziții sau clasificări, al goritmii search -based de
recomandare scalează și execută bine. Pentru utilizatorii cu mii de achiziții, pe de altă parte, nu
este practic să se bazeze o interogare pe toate articolele. Algoritmul trebuie să folosească un
subset sau rezumat al datelor, redu când calitatea. În toate cazurile, calitatea recomandărilor este
relativ slabă. Recomandările sunt adeseori prea generale (precum cele mai bine vândute titluri ale

23
DVD -urilor din categoria dramă) sau prea înguste(precum toate cărțile scrise de același auto r).
Recomandările ar trebui să ajute un client să găsească și să descopere produse noi, relevante și
nu în ultimul rând interesante. Produsele populare aparținând aceluiași autor sau în aceleiași
categorii nu reușesc să îndeplinească acest scop.
Item-to-Item Collaborative Filtering
Spre deosebire de alte site -uri, Amazon.com folosește recomandările ca un instrument
ținta de marketing în multe campanii de e -mail și pe majoritatea paginilor site -urilor ale sale,
inclusiv pagina de pornire cu trafic intens Ama zon.com. Compania utilizează extensiv algoritmi
de recomandare în vederea personalizării web site -ul sau pentru interesele fiecărui client.
Deoarece algoritmii de recomandare existenți nu pot fi aplicate pentru zecile de milioane de
clienți și produse, ace știa și -au dezvoltat propriul algoritm. Acesta, denumit item -to-item
collaborative filtering, scalează seturi de date masive și produce recomandări de o calitate
superioară în timp real.În continuare vom vorbi despre cum funcționează acesta: în loc să
potrivească utilizatorul cu diferiți clienți similari, filtrarea colaborativa item -to-item potrivește
fiecare dintre achizițiile și produsele clasificate cu produse similare, apoi combina acele produse
similare într -o listă de recomandare. Pentru a determina ce mai similară potrivire pentru un
produs dat, algoritmul construiește un tabel cu produse similare prin folosirea produselor pe care
clienții tind să le achiziționeze împreună. Am putea construi a matrice de product -to-product
iterând prin toate perechil e de produse și computând un metric de similaritate pentru fiecare
pereche. Cu toate acestea, multe perechi de produse nu au niciun client comun, și prin urmare
această abordare este ineficientă din punct de vedere al timpului de procesare și folosire a
memoriei. Următorul algoritm iterativ furnizează o mai bună abordare prin calcularea
similarității dintre un singur produs s toate produsele înrudite:

Este posibil să se calculeze similaritatea dintre două produse în variate cai, dar o metodă des
folosită e ste aceea de a folosi măsură cosinusul, în care fiecare vector corespunde unui produs,
mai degrabă decât unui client, iar dimensiunile M ale vectorului corespund cu clienții care au
achiziționat acel produs.
Aceasta computație offline a tabelului cu produs e similare este extrem de intensiv, avem
valoarea de O(N2M) că cel mai rău caz. În practică însă, este mai aproape de O(NM), din
moment ce majoritatea clienților au doar câteva achiziții. Eșantionarea clienților care
achiziționează titlurile cel mai bine v ândute reduce timpul de exectuie chiar mai mult, cu doar
puțină reducere a calității. Fiind dat un tabel cu produse similare, algoritmul găsește produse
similare cu fiecare dintre achizițiile și clasificările utilizatorului, agrega acele produse, și apoi
recomanda cele mai populare și corelate produse. Aceasta computație este foare
rapidă,depinzând numai de numărul de produse pe care utilizatorul l -a achiziționat sau clasificat.
Pentru seturi de date foarte mari, un algoritm de recomandare scalabil trebuie să
efectueze cele mai solicitante calculte offline. După cum arată o scurtă comparație, metodele
existente sunt insuficiente:
• Tradițional collaborative filtering realizează computație offline puțină sau chiar
deloc, iar computația online sclaeaza cu num ărul de clienți și produsele din catalog. Algoritmul
este nepractic atunci când vine vorba de seturi de date mari, doar dacă acesta nu folosește
reducere dimensională, eșalonare sau partiționare – toate care reduc din calitatea recomandării
• Modelele clu ster pot efectua o mare parte din calcul offline, dar calitatea
recomandării este relativ săraca. Pentru a o imbuntatii, este posibil să se crească numărul de
segmente, dar asta face ca și clasificarea utilizator -segment să fie scumpă

24
• Modelele search -based creează cuvinte -cheie, categorii și indexele autorilor
offline, dar nu reușește să furnizeze recomandări cu titluri vizate, interesante. Acestea de
asemenea scalează slab pentru clienții cu achiziții și clasificări numeroase.
Cheia către scalabilitatea și performanță filtrării colaborativa item -to-item este că
generează tabelul articolelor scumpe similare offline. Componenta online a algoritmului –
căutarea produselor similare pentru achizițiile și ratingurile clientului – scalează independent de
mărimea catalogului sau de numărul total de client; este dependenta numai de numărul de titluri
pe care utilizatorul le -a achiziționat sau clasificat. Prin urmare, algoritmul este rapid chiar și
pentru seturi de date extrem de mari. Deoarece algoritmul recoma nda produse similare extrem de
corelate, calitatea recoandarilor este excelentă. Spre deosebire de tradițional collaborative
filtering, algoritmul de asemenea se comporta bine cu date limitate legate de utilizator,
producând recomandări de o calitate super ioară bazate doar pe câteva elemente, mergând până la
două sau trei produse.
În concluzie, algoritmii de recomandare furnizează o formă eficientă de marketing
orientat prin crearea unei experiențe de cumpărături personalizata pentru fiecare client. Pentru
marii comercianți precum Amazon.com, un bun algoritm de recomandare este scalabil pentru
baze de clienți și cataloage de produse foarte mari , necesita numai timp de procesare secundară
pentru generarea recomandărilor online, este capabil să reacționeze im ediat la modificări legate
de datele unui utilizator și realizează recomandări convingătoare pentru toți utilizatorii indiferent
de numărul de achiziții și ratinguri. Spre deosebire de alți algoritmi, filtrarea colaborativa item –
to-item este capabilă să f acă față acestei provocări.
În viitor este așteptat ca industria de retail să folosească în mare algoritmi de
recomandare pentru marketing orientat, atât online cât și offline. În timp ce întreprinderile de e –
commerce au cele mai ușoare vehicule pentru pe rsonalizare , ratele de conversie crescute ale
tehnologiei comparată cu abordările tradiționale pe scară largă va face de asemenea
convingătoare pentru comercianții offline folosirea în trimiterile poștale, cupoane și alte forme
de comunicare cu clienții.

10. IMPORTANȚA COMENTARIILOR ASUPRA PRODUSELOR

Comentariile și evaluările produselor sunt instrumente populare pentru a sprijini deciziile de
cumpărare ale consumatorilor. Aceste instrumente sunt, de asemenea, valoroase pentru comercianții
online, care folosesc sisteme de rating pentru a construi încrederea și reputația pe piața online. Multe
magazine online au ratinguri cantitative, recenzii textuale sau o combinație a celor două.
În prezent, din ce în ce mai multe platforme de comerț electronic oferă recenzii despre produse
sau evaluări ale produselor. În literatura de specialitate, comentariile și evaluarea termenilor sunt adesea
folosite interschimbabil, dar pentru munca noastră este important să distingem acești doi termeni.
Comentariul asupra unui produs este o revizuire textuală a unui client, care descrie caracteristicile (de
exemplu, avantajele și dezavantajele) unui produs. O evaluare de produs, pe de altă parte, reprezintă
opinia clientului la o scară specificată. O schemă de rating populară în magazinele online este ratingul de
stea, în cazul în care mai multe stele indică ratinguri mai bune. Comentariile și evaluările produselor sunt

25
generate de utilizator (adică de clientul unui magazin online) și sunt publicate pe site -ul web al
comerciantu lui.
Modelele de comunicare bidirecțională sunt descrise de termenul Web 2.0 definit de O'Reilly
.Exemple populare de site -uri de cumpărături sunt Amazon și eBay. Datorită caracterului omniprezent al
comentariilor asupra produselor, o întrebare interesantă este modul în care clienții folosesc de fapt această
sursă de informații pentru decizia lor de cumpărare.
11. DESCRIEREA APLICAȚIEI

1. Descărcarea de review -uri ale produselor din Amazon

Figura 5 – Exemplu review
Rezultă un fișier text de 2 gb care conține un array de fișiere j son de lungime totală: 1.697.533.
Fiecare produs se identifică prin ASIN , iar acesta din urmă poate avea mai multe reviewerID -uri.

26
2. Inserarea înregistrărilor în baza de date:

Figura 6 – Metoda salvare review

Figura 7 – Review în baza de date

27
3. Crearea unui program care unește review -urile tuturor produselor într -un singur fișier pentru c a
acesta din urmă să poată fi analizat.

Figura 8 – Folder review

Fiecare fișier arat ă de formă:

Figura 9 – Continut review
4. Găsirea unui dicționar de cuvinte positive/negative
Pe site -ul universității University of Illinois at Chicago, College of Engineering am găsit o listă de cuvinte
positive și negative.
5. Configurare cluster hadoop pentru procesarea datelor:

28

Figura 10 – Datanode Information

6. Rulare job hadoop

29
Output job:

Figura 11 – Output job

7. Calculare lungime fiecărui fișier de output și apoi distanțele și salvarea celor mai apropiate 5 distanțe
cu fo rmula de la pagina 19.

30

8. Creare cont pe Amazon Product Advertising API pentru a primi
AWS_ACCESS_KEY_ID
AWS_SECRET_KEY
Interogarea și salvarea informațiilor despre fiecare produs:

31
9. Creare UI și afișare rezultate.

Figura 12 – Search page
Modul de c ăutare cu autocomplete.

Afișarea rezultatelor:

Figura 13 – Rezultate

32
CONCLUZII

Proiectul analizeaz ă date de la utilizatorii și astfel reu șește să ofere alte produse pe baza
datelor provenite de la utilizator. De asemenea se pot face imbunatatiri ale algoritmului de
recomandare utilizat în aplica ție pentru a lua în considerare și alte date provenite de la site, cum
ar fi genul produsului “dvd de film” sau actorii etc.
În final, se poate spune c ă toate sarcinile de analiz ă a sentimentului sunt foarte
provocatoare. Înțelegerea și cunoa șterea problemei și solu ționarea acesteia sunt încă limitate.
Motivul principal este c ă sarcina de prelucrare a limbajului natural nu are probleme u șoare. Un
alt motiv se poate datora modurilor noastre populare de a face cercetare. Probabil ne -am bazat
prea mult pe ma șină și pe algoritmi de învățare. Unii dintre cei mai eficien ți algoritmi de învățare
a ma șinilor, nu produc rezultate umane de înțeles, și, deși, ele pot ob ține o precizie îmbun ătățită,
știm pu ține despre cum și de ce. Cu toate acestea, acest lucru a f ăcut pro grese semnificative în
ultimii ani. Acest lucru este evident din num ărul mare de start -upuri ale companiilor care ofer ă
servicii de analiz ă sentimental ă sau servicii de consultan ță de analiza de text. Exist ă o nevoie
reală și imens ă în industrie pentru ast fel de servicii, deoarece fiecare companie dore ște să știe
cum își percep consumatorii produsele și serviciile dar și ale concuren ților lor. Acela și lucru se
poate spune și despre consumatori pentru c ă ori de c âte ori cineva vrea s ă cumpere ceva, vrea s ă
știe opiniile utilizatorilor existen ți. Nevoile și provoc ările tehnice vor men ține c âmpul vibrant și
plin de via ță pentru anii urm ători.

33
BIBLIOGRAFIE

http://cifr.cs.pub.ro/ullman/cluster1 -ro.pdf
http://www.ace.tuiasi.ro/users/103/2012_Agavriloaei_Ioan__PhD%20rez.pdf
http://rochi.utcluj.ro/rrioc/articole/RRIOC -8-3-Radu.pdf
https://github.com/jeffreybreen/twitter -sentiment -analysis -tutorial –
201107/tree/master/data/opinion -lexicon -English
https://github.com/jeffreybreen/twitter -sentiment -analysis -tutorial –
201107/tree/master/data/opinion -lexicon -English
http://jmcauley.ucsd.edu/data/amazon/links.html
R. He, J. McAuley. Modeling the visual evolution of fashion trends with one -class collabor ative
filtering. WWW, 2016
J. McAuley, C. Targett, J. Shi, A. van den Hengel. Image -based recommendations on styles and
substitutes. SIGIR, 2015
http://todaysoftmag.ro/article/384/neo4j -graph -database -modelarea -datelor -interconectate
http://app.robomongo. org/
https://en.wikipedia.org/wiki/MongoDB
http://db -engines.com/en/ranking
https://github.com/neo4j -examples/movies -java-spring -data-neo4j -4
http://www.tutorialspoint.com/neo4j
http://searchdatamanagement .techtarget.com/definition/MongoDB
https://en.wikipedia.org/wiki/MongoDB
https://en.wikipedia.org/wiki/Shard_(database_architecture)
https://en.wikipedia.org/wiki/MapReduce
Minqing Hu and Bing Liu. "Min ing and Summarizing Customer Reviews." Proceedings of the
ACM SIGKDD Interna tional Conference on Knowledge Discovery and Data Mining (KDD –
2004), Aug 22 -25, 2004, Seattle, Washington, USA.
Bing Liu, Minqing Hu and Junsheng Cheng. "Opinion Observer: Analyzi ng and Comparing
Opinions on the Web." Proceedings of the 14th International World Wide Web con ference
(WWW -2005), May 10 -14, 2005, Chiba, Japan.
http://www.hrpub.org/download/201307/ aeb.2013.010101.pdf

34
https://sites.google.com/site/dataclusteringalgorithms/home
http://vladestivill -castro.net/teaching/kdd.d/lect12 -new.pdf
http://infolab.stanford.edu/~ullman/m mds/ch9.pdf

35
ANEXE

//Hadoop Map Reduce

package com.licenta.com.licenta.test;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apa che.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path ;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper ;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WordCountMihai {

public static List<String> positiveWords = new ArrayList<String>();
public static final String OUTPUT = "/output_movies1000/" ;
public static final String INPUT = "/movies1000/" ;
//static int test = 0;

public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {

private static final IntWritable ONE = new IntWritable(1);
private final Text word = new Text();

@Override
public void map( final Object key, final Text value , final Context context )
throws IOException, InterruptedException {

final StringTokenizer itr = new StringTokenizer( value .toString());

while (itr.hasMoreTokens()) {
word .set(itr.nextToken());
if(Utils. getListOfPositiveWords ().contains( word .toString().trim())){
context .write( word , ONE );
}
}
}
}

public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {

private final IntWritable result = new IntWritable();

36
@Override
public void
reduce( final Text key, final Iterable<IntWritable> values , final Context context )
throws IOExce ption, InterruptedException {
int sum = 0;
for (final IntWritable val : values ) {
sum += val.get();
}

//test += sum;
result .set(sum);
context .write( key, result );

}

}

public static void main( final String[] args) throws Excep tion {

final Configuration conf = new Configuration();

conf.set("fs.default.name" , "hdfs://192.168.0.120:10001" );
conf.set("yarn.resourcemanager.resource -tracker.address" , "192.168.0.120:8025" );
conf.set("yarn.nodemanager.localizer.address" , "192.168.0.120:10200" );
conf.set("yarn.resourcemanager.scheduler.address" , "192.168.0.120:8030" );
conf.set("yarn.resourcemanager.address" , "192.168.0.120:8040" );
conf.set("mapreduce.framework.name" , "yarn" );

FileSystem fs = FileSystem. get(conf);

FileStatus[] status = fs.listStatus( new Path(INPUT ));
fs.listFiles( new Path(INPUT ), false );
System. out.println( status .length );
for (int i = 0; i < status .length ; i++) {
FileStatus fileStatus = status [i];
System. out.println( fileStatus .getPath());
System. out.println( fileStatus .getPath().getName());
runJobForEveryFile (fileStatus .getPath().getName(), fs, conf);
}
}

public static void runJobForEveryFile(String fileName , FileSystem fs, Configuration conf)
throws IllegalArgumentException, IOEx ception, ClassNotFoundException, InterruptedException{
String parts [] = fileName .split( ".txt");
fs.delete( new Path(OUTPUT + parts [0] + "/"), true);

final Job job = Job. getInstance (conf, "job");

job.setJar( "wordcount.jar" );

job.setMapper Class(TokenizerMapper. class );
job.setCombinerClass(IntSumReducer. class );
job.setReducerClass(IntSumReducer. class );
job.setOutputKeyClass(Text. class );

37
job.setOutputValueClass(IntWritable. class );
job.setJobName( "disertatie" );

FileInputFormat. addInputPath (job, new Path(INPUT + fileName ));
FileOutputFormat. setOutputPath (job, new Path(OUTPUT + parts [0] + "/"));

job.waitForCompletion( true);
}
}

// Split big file with jsons into smaller json files
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.concurrent.atomi c.AtomicInteger;
import java.util.stream.Stream;

/**
* Created by mmocanu on 6/1/2017.
*/
public class Main {
final static String location = "E:\\backup 04 \\Mihai_facultate \\master
an2\\disertatie \\amazon reviews \\reviews_Movies_and_TV_5.json \\";

public static void main(String[] args) {
JSONParser parser = new JSONParser();

AtomicInteger lineNo = new AtomicInteger();

try (Stream<String> stream = Files. lines(Paths.get(location +
"\\Movies_and_TV_5.json" ))) {
stream.forEach(line -> {
try {
Object obj = parser.parse(line);
JSONObject jsonObject = (JSONObject) obj;

String reviewText = (String) jsonObject.get( "reviewText" );
System.out.println( "reviewText: " + reviewText);
String reviewerID = (String) jsonObject.get( "reviewerID" );
System.out.println( "reviewerID: " + reviewerID);
//System.out.println(lineNo.getAn dIncrement());
writeContentToFile (reviewText, reviewerID, location );

} catch (ParseException e) {
e.printStackTrace();
}
});

} catch (IOException e) {

38
e.printStackTrace();
}
}

public static void writeContentToFile(String content, String fileName, String
location) {
BufferedWriter bw = null;
FileWriter fw = null;
try {

fw = new FileWriter(location + "\\reviewsTexts \\" + fileName + ".txt");
bw = new BufferedWriter(fw);
bw.write(content);

System.out.println( "Done");

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

if (bw != null)
bw.close();

if (fw != null)
fw.close();

} catch (IOException ex) {

ex.printStackTrace();

}

}

}
}
// Di stance calculator
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;

/**
* Created by Mihai on 6/17/2017.
*/
public class DistanceCalculator {
final static String location = "E:\\backup 04 \\Mihai_facultate \\master
an2\\disertatie \\amazon reviews \\reviews_Video_Games_5.json \\output_positive" ;
static Map<String, Float> reviewsWithLentgh = new HashMap<>();
static String review;
static float reviewLength ;

public static void main(String[] args) {
long startTime = System. currentTimeMillis ();

39

//do work
final File folder = new File(location );
listFilesForFolder (folder);
Map<String, Map<Strin g, Float>> allDistances =
calculateDistanceForEveryFile (reviewsWithLentgh );
Map<String, Map<String, Float>> firstFiveDistances =
calculateFirstFiveDistances (allDistances);

long stopTime = System. currentTimeMillis ();
long elapsedT ime = stopTime – startTime;

int seconds = ( int) (elapsedTime / 1000) % 60 ;
int minutes = ( int) ((elapsedTime / ( 1000*60)) % 60);
System.out.println( "seconds: " + seconds);
System.out.println( "minutes: " + minutes);

}

private static Map<String,Map<String,Float>>
calculateFirstFiveDistances(Map<String, Map<String, Float>> allDistances) {

Map<String,Map<String,Float>> firstFiveForAll = new HashMap<>();

for (Map.Entry<String, Map<String, Float>> en try : allDistances.entrySet()) {

//order by values
Map<String, Float> result = entry.getValue().entrySet().stream()
.sorted(Map.Entry. comparingByValue (Comparator. naturalOrder ()))
.collect(Col lectors. toMap(Map.Entry::getKey, Map.Entry::getValue,
(oldValue, newValue) -> oldValue, LinkedHashMap:: new));

//fetch first five
Map<String,Float> firstFiveForEach = new LinkedHashMap<>();
for (Map.Entry<String, Float> resultEntry : result.entrySet()) {
if(firstFiveForEach.size() < 5){
firstFiveForEach.put(resultEntry.getKey(),
resultEntry.getValue());
}else {
break;
}
}

firstFiveForAll .put(entry.getKey(), firstFiveForEach);

}

return firstFiveForAll ;

}

public static void listFilesForFolder( final File folder) {
for (final File fileEntry : folder.li stFiles()) {
if (fileEntry.isDirectory()) {
review = fileEntry.getName();
listFilesForFolder (fileEntry);
} else {
if("part-r-00000".equals(fileEntry.getName()))
reviewLength =
readFileAndCalculateLenght (fileEntry.getAbsolutePath());
reviewsWithLentgh .put(review, reviewLength );

40
}

}
}

public static float readFileAndCalculateLenght(String fileName){
float length = 0;
try (BufferedReader br = new BufferedReader( new FileReader(fileName))) {

String sCurrentLine;

while ((sCurrentLine = br.readLine()) != null) {
length += Integer. parseInt (sCurrentLine.split( "\t")[1]);
}

} catch (IOException e) {
e.printStackTrace();
}

return length;
}

public static Map<String, Integer> readFile(String filePath){
Map<String, Integer> values = new HashMap<>();
try (BufferedReader br = new BufferedReader( new FileReader(filePath))) {

String sCurrentLine;

while ((sCurrentLine = br.readLine()) != null) {
values.put(sCurrentLine.split( "\t")[0],
Integer. parseInt (sCurrentLine.split( "\t")[1]));
}

} catch (IOException e) {
e.printStackTrace();
}
return values;
}

public static Map<String, Integer> readFolder(File folder){
Map<String, Integer> values = new HashMap<>();
for (final File fileEntry : folder.listFiles()) {
if (fileEntry.isDirectory()) {
readFolder (fileEntry);
} else {
if("part-r-00000".equals(fileEntry.getName()))
values = readFile(fileEntry.getAbsolutePath());
}
}

return values;
}

public static float calculateScalarProduct(String firstFile, String secondFile){
float scalarProduct = 0;
final String locationFirst = "E:\\backup 04\\Mihai_facultate \\master
an2\\disertatie \\amazon reviews \\reviews_Video_Games_5.json \\output_positive \\" +
firstFile + "\\part-r-00000";
final String locationSecond = "E:\\backup 04 \\Mihai_facultate \\master
an2\\disertatie \\amazon reviews \\reviews_Video_Games_5.json \\output_positive \\" +
secondFile + "\\part-r-00000";

Map<String, Integer> firstFileValues = readFile (locationFirst);

41
Map<String, Integer> secondFileValues = readFile (locationSecond);

for (Map.Entry<String, Integer> entry : firstFileValues.entrySet())
{
if(secondFileValues.containsKey(entry.getKey())){
scalarProduct += (entry.getValue() *
secondFileValues.get(entry.getKey()));
}
}
return scalarProduct;
}

public static Map<String, Map<String, Float>>
calculateDistanceForEveryFile(Map<String, Float> map){
Map<String, Map<String, Float>> distanceForEveryFile = new HashMap<>();
for(Map.Entry<Strin g, Float> entry1: map.entrySet()) {
Map<String, Float> distance = new HashMap<>();
String key1 = entry1.getKey();
int hash1 = System. identityHashCode (key1);
Float value1 = entry1.getValue();
for(Map.Entry<String, Float> entry2: map.entrySet()) {
String key2 = entry2.getKey();
if (hash1 == System. identityHashCode (key2)) continue ;

Float value2 = entry2.getValue();
// compare value1 and value2;
final String locationFirst = "E:\\backup 04 \\Mihai_facultate \\master
an2\\disertatie \\amazon reviews \\reviews_Video_Games_5.json \\output_positive \\" +
key1 + "\\part-r-00000";
final String loc ationSecond = "E:\\backup 04 \\Mihai_facultate \\master
an2\\disertatie \\amazon reviews \\reviews_Video_Games_5.json \\output_positive \\" +
key2 + "\\part-r-00000";

float distanceInteger = 1;
if(calculat eScalarProduct (key1, key2) != 0){
distanceInteger = 1 – (calculateScalarProduct (key1, key2) /
(readFileAndCalculateLenght (locationFirst) *
readFileAndCalculateLenght (locationSecond)));

}
distance.put(key2, distanceInteger);

}
distanceForEveryFile.put(key1, distance);
}

return distanceForEveryFile;
}
}

Similar Posts