Sentiment Analyzeralaiba/pub/absolvire/2017... · 2017. 2. 6. · - JavaScript: este un limbaj de...
Transcript of Sentiment Analyzeralaiba/pub/absolvire/2017... · 2017. 2. 6. · - JavaScript: este un limbaj de...
1
UNIVERSITATEA „ALEXANDRU IOAN CUZA” IAŞI
Facultatea de Informatică
LUCRARE DE LICENȚĂ
Sentiment Analyzer
Propusă de
AVRĂMOAEI IOAN ALEXANDRU
Sesiunea: Februarie, 2017
Coordonator știinţific: Asistent, dr. Vasile Alaiba
2
Cuprins 1. Introducere ................................................................................................................................. 4
1.1 Motivație ............................................................................................................................... 4
1.2 Context .................................................................................................................................. 4
1.3 Cerințe funcționale ............................................................................................................... 5
1.4 Abordare tehnică .................................................................................................................. 6
2. Contribuții ................................................................................................................................... 7
3. Proiectare .................................................................................................................................... 8
3.1 Dezvoltarea interfeței, structura paginilor aplicației și funcționalitatea acestora ............... 8
3.1.1 Arhitectura aplicației ..................................................................................................... 8
3.1.2 Protocoale de comunicare client-server ...................................................................... 12
3.1.3 Intefața cu utilizatorul.................................................................................................. 12
3.2 Dezvoltarea funcției de analizare și structura dicționarului aferent .................................. 15
3.2.1 Structura dicționarului ................................................................................................. 16
3.2.2 Funcția de analizare ......................................................................................................... 17
4. Implementare ........................................................................................................................... 18
4.1 Pagina de administrare a dicționarului și funcționalitatea acesteia .................................. 18
4.1.1 Adăugarea unui termen ............................................................................................... 18
4.1.2 Filtrarea dicționarului .................................................................................................. 19
4.1.3 Editarea termenilor ...................................................................................................... 20
4.2 Funcționalitatea de analizare și încadrarea textului în clasa de sentiment identificată .... 22
4.2.1 Încărcarea dicționarului necesar ................................................................................. 22
4.2.2 Împărțirea textului în propoziții ................................................................................... 23
4.2.3 Identificarea expresiilor fixe și variabile și înlocuirea acestora în text ........................ 23
4.2.4 Împărțirea propozițiilor în cuvinte ............................................................................... 23
4.2.5 Determinarea scorului și identificarea clasei de sentiment ........................................ 23
4.3 Implementarea sistemului de notificare ............................................................................ 24
4.3.1 Partea vizuală ............................................................................................................... 24
3
4.3.2 Partea funcțională ........................................................................................................ 25
5. Manualul utilizatorului .............................................................................................................. 28
5.1 Meniul aplicației .................................................................................................................. 28
5.2 Pagina principală ................................................................................................................. 31
5.3 Pagina de administrare a dicționarului ............................................................................... 32
5.3.1 Secțiunea de adăugare a unui nou termen ................................................................. 33
5.3.2 Secțiunea de filtrare a dicționarului ............................................................................ 33
5.3.3 Secțiunea de afișare a dicționarului ............................................................................. 34
5.4 Pagina de administrare a utilizatorilor ........................................................................... 35
5.5 Pagina ultimelor rulări efectuate ................................................................................... 36
5.6 Funcționalitatea de modificare a contului ..................................................................... 37
6. Concluzii .................................................................................................................................... 39
7. Bibliografie ................................................................................................................................ 40
4
1. Introducere
1.1 Motivație
„Sentiment Analyzer” este o aplicație web ce încadrează un text în limba română sau
engleză, pe baza unui dicționar predefinit, în trei clase de sentiment: pozitiv, negativ și neutru.
În urma analizării textului se va obține sentimentul predominant al acestuia, procentul de
influență al claselor identificate și termenii ce au dus la obținerea rezultatului.
Consider importantă tema abordată deoarece tot mai multe companii se axează pe procese
automate de statistică, pe baza recenziilor obținute din partea clienților, în încercarea de a oferi
acestora un produs cât mai bun. Această aplicație reprezintă o soluție pentru realizarea acestui
lucru, oferind utilizatorului un punct de reper despre impactul emoțional transmis de datele
analizate.
Pe baza considerentelor menționate, o astfel de aplicație este utilă tuturor companiilor
interesate de serviciile oferite. Avantajele date de aplicație sunt următoarele:
- îmbunătățirea serviciilor oferite
- acumularea de informații despre publicul țintă al serviciilor oferite
- raportarea la competiție
1.2 Context
Analiza de sentiment se referă la utilizarea tehnicilor de procesare a limbajului natural
(limbajul folost de zi cu zi) și a algoritmilor computaționali în încercarea de extrage informații cu
caracter „emoțional” dintr-un material analizat. Infomațiile extrase pot sau nu să corespundă cu
intențiile transmise de autor, aici intervenind obiectivitatea și subiectivitatea. În principiu,
corectitudinea acestor informații se bazează pe interpretarea umană.
Odată cu creșterea platformelor de socializare online, precum rețele sociale și blog-uri, au
apărut tot mai multe interese în domeniu, dezvoltându-se produse, care prin aplicarea analizei
de sentiment pe recenziile utilizatorilor, oferă informații esențiale despre „calitatea produselor
oferite”.
De-a lungul timpului s-au dezvoltat și încercat mai multe procese de analizare, iar acestea
pot fi concretizate în trei categorii:
5
- procese bazate pe un set de cunoștințe deja existente
- procese bazate pe statistici
- procese hibrid
Procesele bazate pe un set de cunoștințe deja existente utilizează de obicei un set de
resurse fizice, împărțite în clase de sentiment, căutând existența acestora în materialul analizat.
Pe baza resurselor găsite în material, se realizează încadrarea în clasa de sentiment.
Procesele bazate pe statistici folosesc metode de învățare automată efectuând o analiză
mai profundă a materialului analizat. Se încearcă nu doar identificarea sentimentului existent ci
și de cine si către cine este transmis.
Procesele hibrid înglobează cele două procese descrise mai sus în încercarea de a crea
concepte. Prin concepte se înțelege identificarea de situații care au între ele o anumită
legătură. Astfel se poate găsi o situație care nu este neapărat sugestivă pentru identificarea
sentimentului însă prin conceptul acesteia se poate ajunge la una care are o importanță mai
mare.
Aplicația abordează procesele bazate pe un set de cunoștințe deja existente, înglobând
tehnici ce permit extinderea resurselor folosite pentru a acoperi cât mai multe cazuri.
1.3 Cerințe funcționale
După cum sugerează și numele aplicației, funcționalitatea principală o constituie
posibilitatea de a rula analize de sentiment. Analiza de sentiment reprezintă încadrarea unui
text în limba română sau engleză în una din cele trei clase pe care le tratează aplicația și anume:
pozitiv, negativ sau neutru.
Aplicația permite crearea unui cont. Beneficiul acestuia, la modul general, este de a păstra
ultimele rulări efectuate, putând fi accesate și rulate din nou. Pe lângă aceasta, contul oferă
acces la o serie de funcționalități utilizatorilor ce dețin drepturile necesare.
Pentru administrarea aplicației există utilizatori ce dețin cont de administrator. Aceștia pot
administra atât dicționarul folosit de aplicație pentru realizarea analizelor de sentiment, cât și
anumite aspecte pentru ceilalți utilizatori.
6
1.4 Abordare tehnică
Fiind o aplicație web, aceasta este constituită din două părți: interfața (client) și partea de
procesare (server). Pentru realizarea clientului am folosit tehnologii precum HTML, CSS și
JavaScript. Pentru realizarea funcționalității pe partea de server am folosit PHP, iar pentru
stocarea datelor, MySQL. Totodată am utilizat o serie de biblioteci cu scopul de a facilita
implementarea proiectului, de a oferi funcționalități atât pe partea de client cât și pe cea de
server, precum și un aspect dinamic ce se adaptează majorității dispozitivelor utilizate pentru
navigarea pe internet (telefoane, tablete, laptop-uri), în încercarea de a oferi utilizatorului un
mediu cât mai plăcut:
- PHP Romanian Stemmer: este o bibliotecă PHP cu suport pentru limba română, scopul
acesteia fiind de a reduce cuvintele la radăcina lor (ex.: pisicile devine pisic).
- Porter-Stemmer: este o bibliotecă PHP cu suport pentru limba engleză. Aceasta are
drept scop reducerea cuvintelor la rădăcina lor (ex.: walking devine walk).
- jQuery: este una dintre cele mai utilizate biblioteci de JavaScript, fiind disponibilă în
majoritatea browser-elor existente. Scopul acesteia este de a oferi funcționalități puternice
precum parcurgerea și modificarea arborelui DOM1, manipularea elementelor CSS sau cereri de
tip AJAX2, printr-o sintaxă cât mai simplă.
- Bootstrap: este o bibliotecă populară, open-source3, cu ajutorul căreia se poate crea
ușor interfața unei pagini web. Aceasta oferă un stil uniform pentru majoritatea elementelor de
bază din HTML asigurând astfel un aspect consistent și unitar. Pe langă stilurile oferite, conține
o serie de componente bazate atât pe CSS cât și pe JavaScript ce adaugă aspectului un plus de
funcționalitate și intuitivitate.
- DataTables: este o bilbliotecă bazată pe jQuery, flexibilă, ce oferă o serie de
funcționalități pentru orice tabel din HTML. Permite atât procesare în pagină, cât și procesare
pe partea de server, prin cereri AJAX, făcând ușor de manipulat un volum mare de date.
- Highcharts: este o bibliotecă bazată pe JavaScript ce oferă posibilitatea de reprezentare
a datelor sub forma unor grafice interactive cu numeroase funcționalități, totodată oferind un
aspect „prietenos” și dinamic pentru dispozitivul de pe care este accesată pagina ce conține
graficul.
- PHP: este unul din cele mai utilizate limbaje de programare pentru dezvoltarea paginilor
și a aplicațiilor web. Poate fi ușor incorporat în codul HTML, codul fiind interpretat de server.
Printre avantajele acestui limbaj de programare, menționez că este open-source având ediții
stabile disponibile pentru cele mai importante sisteme de operare.
1 DOM - https://www.w3.org/DOM/ 2 AJAX - https://en.wikipedia.org/wiki/Ajax_(programming) 3 Open-source - https://en.wikipedia.org/wiki/Open-source_software
7
- MySQL: este cel mai popular SGBD4 open-source, aflându-se în strânsă legătură cu PHP,
prin interfața grafică phpMyAdmin. Acesta permite stocarea persistentă a datelor, oferind
funcționalitățile de citire, scriere, ștergere și editare ale acestora. Este considerat a fi „un sistem
rapid și stabil, ce permite utilizatori și fire de execuție multiple”.
- JavaScript: este un limbaj de programare utilizat cel mai adesea pentru introducerea
unor funcționalități în paginile web. Alături de HTML si CSS reprezintă una din cele trei
tehnologii fundamentale pentru crearea paginilor web, fiind incorporat de majoritatea browser-
elor moderne.
- CSS: este un standard pentru formatarea și stilizarea etichetelor HTML, ce permite
modificarea aspectului și a așezării în pagină a acestora, prin fișiere externe numite „pagini de
stil”.
- HTML: este un limbaj de marcare utilizat pentru crearea paginilor web. Scopul său este
de prezentare al informației prin etichete sau tag-uri specifice, ce permit atât funcționalități
minore precum îngroșarea sau sublinierea unui cuvânt, cât și funcționalități avansate cum ar fi
realizarea unui formular. Pentru a fi redat, HTML utilizează un soft specializat numit „agent
utilizator HTML” ce permite interpretarea informațiilor furnizate, cel mai bun exemplu fiind
browser-ul web.
2. Contribuții
În urma unui sondaj asupra celorlalte proiecte existente ce abordează domeniul tratat, am
constatat că există numeroase astfel de produse pentru limba engleză însă nu și pentru limba
română. Astfel, pot afirma ca una din noutățile oferite de proiect o constituie analizatorul de
sentiment pentru limba română.
O altă contribuție substanțială este reprezentată de structura și modul de implementare al
aplicației. Implementarea curentă permite extinderea analizatorului pentru majoritatea limbilor
prin adăugarea dicționarului aferent.
Am decis împărțirea lucrării în două capitole, motivând deciziile luate pe parcursul
procesului de dezvoltare, oferind detalii de implementare și argumente pentru tehnicile
utilizate:
Dezvoltarea interfeței, structura paginilor aplicației și funcționalitatea acestora
Structura dicționarului aferent și funcția de analizare
Pentru dezvoltarea interfeței și a funcționalităților aferente am luat în considerare
dinamicitatea și adaptarea aspectului indiferent de dispozitivul folosit, precum și dorința
4 SGBD - https://ro.wikipedia.org/wiki/Sistem_de_gestiune_a_bazelor_de_date
8
clientului de a utiliza un produs fiabil și interactiv, ce oferă funcționalități rapide și un flux de
utilizare cât mai fluent, prin:
- implementarea unui aspect dinamic
- utilizarea de cereri asincrone pentru a realiza acțiunile în timp real
- un sistem de notificare ce înștiințează utilizatorul asupra rezultatului acțiunilor
efectuate
Pentru implementarea funcționalității de analizare, am luat în considerare utilizarea a cât
mai puține resurse și cereri, pentru a oferi server-ului un plus de eficiență. Același principiu l-am
aplicat și în stabilirea structurii dicționarului utilizat, oferind astfel un plus de eficiență pentru
diversitatea termenilor și a spațiului de stocare, prin:
- verificarea necesității retrimiterii unei cereri
- verificarea necesității de reîncărcare a dicționarului utilizat
- utilizarea librăriilor de stemming5
3. Proiectare
Această secțiune acoperă pe rând cele două capitole menționate anterior oferind detalii
despre proiectarea acestora.
3.1 Dezvoltarea interfeței, structura paginilor aplicației și funcționalitatea acestora
În acest capitol voi prezenta clientul aplicației. Clientul reprezintă un aspect important
deoarece prin intermediul acestuia, utilizatorul interacționează cu aplicația. Pe parcursul
dezvoltării am urmărit realizarea unui mediu rapid și ușor de utilizat, folosind anumite tehnici
descrise în subcapitolele următoare.
3.1.1 Arhitectura aplicației
Utilizatorul are la dispoziție o interfață grafică simplă și intuitivă, adaptabilă la dispozitivul
folosit de acesta, care utilizează pe cât posibil pictograme și elemente sugestive, pentru a face
interacțiunea cât mai ușoară. Interfața dispune de un sistem de notificare care interpretează
5 stemming - https://en.wikipedia.org/wiki/Stemming
9
atât mesajele generate de client cât și cele primite de la server, cu rolul de a înștiința utilizatorul
asupra acțiunilor efectuate.
Specific unei aplicații web, componența clientului este dată de mai multe pagini ce
îndeplinesc funcții diferite, fiind legate între ele cu ajutorul hyperlink-urilor6. Pentru navigarea
între acestea, utilizatorul dispune mereu de un meniu de navigare. Pe langă funcția de navigare,
meniul deține și funcționalitățile de autentificare, înregistrare și ieșirea din contul aplicației.
De menționat este faptul că unele pagini nu sunt accesibile tuturor utilizatorilor, acestea
necesitând drepturi de acces (de administrator).
3.1.1.1 Pagina principală
Este pagina de start a aplicației. Aici utilizatorii pot efectua analizele de sentiment prin
selectarea limbii pentru care doresc analiza și introducerea textului corespunzător. Pagina este
alcătuită din două componente: prima reprezentată de formularul necesar pentru introducerea
textului analizat, și a doua reprezentată de rezultatul primit din partea server-ului și afișat în
pagină. Pentru reprezentarea rezultatului primit am ales afișarea acestuia atât sub formă de
grafic, utilizând Highcharts, cât și sub formă tabelară, menționând termenii ce au dus la
identificarea rezultatului.
3.1.1.2 Pagina ultimelor rulări efectuate
Este o pagină accesibilă tuturor utilizatorilor. Aici cei care dețin cont își pot regăsi ultimele
rulări efectuate, rezultatele obținute și posibilitatea de a le rula din nou.
3.1.1.3 Pagina de administrare a utilizatorilor
Această pagină este accesibilă doar utilizatorilor de tip administrator. Scopul său este de a
oferi informații despre ceilalți utilizatori, totodată permițând modificarea dreptului de
administrator de către utilizatorii care dețin această permisiune. Pentru un control eficient
asupra aplicației, am implementat un administrator permanent care nu poate fi modificat.
Astfel este asigurată o politică de securitate care permite corectarea posibilelor erori cauze de
alți utilizatori. În sprijinul politicii de securitate, am decis să rețin pentru fiecare utilizator cine a
efectuat modificarea drepturilor, acest lucru fiind afișat în pagină.
6 hyperlink - https://ro.wikipedia.org/wiki/Hiperlink
10
Pentru a oferi un aspect „modern” elementului ce se ocupă de modificarea dreptului descris
anterior, am utilizat componenta Bootstrap Toggle7.
3.1.1.4 Pagina de administrare a dicționarului
Este o pagină accesibilă doar utilizatorilor cu drepturi de administrator. Aici, doar cei care
dețin acces, pot administra componența dicționarului utilizat de aplicație prin editarea,
ștergerea sau adăugarea de noi termeni. Pentru a manipula ușor volumul de date în timp real,
am folosit DataTables8 care prin intermediul cererilor de tip AJAX, permite un schimb asincron
de date cu server-ul. Utilizând aceeași bibliotecă am realizat paginația, căutarea, ordonarea și
filtrarea după anumite criterii. În urma modificărilor efectuate, pagina este actualizată imediat
fară a fi nevoie de reîncărcarea acesteia.
3.1.1.5 Funcționalitatea de autentificare
Permite utilizatorului accesul la contul acestuia în cazul in care deține unul. Pentru
autentificare nu am folosit o pagină separată ci un modal9, în ideea de a menține utilizatorul pe
pagina curentă, evitând astfel reîncărcarea paginii și a stilurilor aferente în cazul în care nu mai
dorește să efectueze autentificarea.
Pentru a finaliza procesul de autentificare utilizatorul trebuie să completeze câmpurile
modal-ului. Pentru a reduce numărul de cereri, datele sunt validate și pe partea de client, nu
doar pe partea de server, utilizând JavaScript. O tehnică aplicată aici pentru a ajuta la
minimizarea numărului de cereri este reținerea datelor introduse înainte de cerere și verificarea
dacă acestea diferă sau dacă raspunsul server-ului este unul negativ pentru datele curente,
înainte de următoarea cerere. În urma validării datelor de către server, în caz afirmativ, acesta
va seta un cookie10 de logare pentru o perioadă determinată de timp. Avantajul cookie-ului este
că permite utilizatorului să părăsească aplicația fără a fi nevoie de reautentificare la întoarcere,
dacă perioada de valabilitate a acestuia nu a expirat.
7 Bootstrap Toggle - http://www.bootstraptoggle.com/ 8 DataTables - https://datatables.net/ 9 modal - https://en.wikipedia.org/wiki/Modal_window 10 cookie - https://en.wikipedia.org/wiki/HTTP_cookie
11
3.1.1.6 Funcționalitatea de înregistrare
Permite utilizatorului crearea unui cont. Funcționalitatea și structura acesteia este similară
cu cea de autentificare, acțiunea având loc tot într-un modal și nu pe o pagină separată, din
aceleași motive menționate anterior. Principii de eficiență pentru reducerea numărului de
cereri către server, au fost aplicate și aici, prin validarea datelor trimise, și pe partea de client.
La sfârșitul procesului de înregistrare, dacă acesta s-a finalizat cu succes, utilizatorul va fi
automat autentificat în contul creat.
3.1.1.8 Modificarea contului
Pentru această funcționalitate, ca și în cazul autentificării și a înregistrării, am utilizat un
modal, ce facilitează accesul la această opțiune indiferent de pagina pe care se află utilizatorul.
Structura acestei funcționalități este alcătuită din două componente: editarea informațiilor
contului, precum nume, email sau username și modificarea parolei.
12
3.1.2 Protocoale de comunicare client-server
Pentru a realiza funționalitatea pe partea de client, acesta comunică cu server-ul prin cereri
asincron de tip AJAX. Pentru fiecare funcționalitate server-ul pune la dispoziție un API. Pentru
răspunsul server-ului am stabilit următoarele implementări:
- răspuns de tip text cu următoarea structură: {COD_RASPUNS}{SEPARATOR}{MESAJ}
- răspuns de tip obiect cu structura: { status -> ... , msg -> ... , data -> ...}
Pentru ambele forme de răspuns, clientul oferă o funție de interpretare care validează și
afișează răspunsul, utilizând astfel sistemul de notificare menționat anterior, acolo unde este
cazul.
Protocoale de comunicare 1: Comunicarea client-server
3.1.3 Intefața cu utilizatorul
În realizarea unei aplicații web unele opinii exprimă faptul că cel mai important lucru este
aspectul. Altele susțin că este timpul de procesare atunci când utilizatorul execută o acțiune.
Sunt de părere că ambele puncte de vedere sunt foarte importante și o aplicație bună le
incorporează pe amândouă, oferind utilizatorului atât un aspect plăcut cât și rapiditate în
realizarea funcționalităților.
Pentru a oferi cele menționate anterior, am utilizat Bootstrap, DataTables și Highcharts,
însoțite de cereri AJAX care fac experiența utilizatorului mai plăcută și mai interactivă.
13
Voi prezenta în cele ce urmează schițele interfeței grafice, menționând cele mai importante
aspecte, acolo unde este cazul.
Pagina principală: permite utilizatorului introducerea unui text, în câmpul destinat acestui
lucru, selecția limbii și executarea acțiunii de analiză prin apăsarea butonului corespunzător.
Rezultatul primit este afișat atât sub formă grafică cât și sub formă tabelară.
Figura 1: Schiță pentru pagina principală
Pagina de administrare a dicționarului este cea mai complexă pagină, cu cele mai multe
funcționalități:
- adăugarea unui nou termen prin utilizarea formularului aferent
- filtrarea termenilor afișați prin opțiunile corespunzătoare
- editarea și ștergerea termenilor prin opțiunile afișate în tabel
- paginația termenilor
- actualizarea modificărilor în timp real
14
Figura 2: Schiță pentru pagina de administrare a dicționarului
Pagina de administrare a utilizatorilor precum și cea a ultimelor rulări efectuate au o
structură asemănătoare, informația fiind afișată în format tabelar.
Figura 3: Schiță pentru pagina de administrare a utilizatorilor și a ultimelor rulări efectuate
15
Interfața utilizatorului este una dinamică, rearanjând elementele în pagină în funcție de
dispozitiul folosit. Pentru a ilustra acestu lucra voi prezenta schițele meniului de navigare.
Figura 4: Schița meniului de navigare pentru dispozitivele mari (laptop, PC, tabletă)
Figura 5: Schița pentru meniul de navigare pe dispozitivele mici (telefon)
Analizând cele două schițe se poate observa transformarea elementului ilustrat de la un
dispozitiv la altul.
3.2 Dezvoltarea funcției de analizare și structura dicționarului aferent
În acest capitol voi descrie structura dicționarului utilizat de aplicație, principiile utilizate
pentru stocarea acestuia și tehnicile de eficiență aplicate.
16
3.2.1 Structura dicționarului
Dicționarul utilizat de aplicație este reprezentat de un grup de cuvinte pe care am convenit
să le împart în două categorii: termeni și expresii. Acestea sunt specifice pentru fiecare limbă
disponibilă în cadrul aplicației. Atât termenii cât și expresiile dispun de unele proprietăți
comune:
- scor: rolul scorului este de a accentua impactul oferit de termen sau expresie în
identificarea sentimentului. Valorile acestuia sunt de la 1 la 5. Implicit orice termen și
expresie are scorul 1
- clasă: are rolul de a ajuta la identificarea sentimentului având valorile pozitiv, negativ
și neutru
După cum am menționat anterior, pentru eficiența spațiului de stocare și a numărului de
termeni adăugați am folost tehnici de minimizare pentru sporirea acestora, printre care și
procesul de stemming.
Stemming-ul reprezintă reducerea cuvintelor la rădăcina acestora. Astfel cuvinte precum
cărțile, lecțiilor sau lecturile sunt reduse la rădăcina lor, respectiv cart, lect și lectur.
Astfel, având în considerare cele menționate voi descrie în amănunt noțiunile de termeni și
expresii.
3.2.1.1 Termenii
Termenii sunt reprezentați printr-un singur cuvânt (ex.: bine, rău). Spre deosebire de
expresii, proprietatea clasă a acestora este extinsă prin două opțiuni suplimentare, pe care le-
am denumit:
- inițiatori de expresii negative: sunt acele cuvinte ale limbii care ajută la construirea
unui grup negativ (ex.: „nu” pentru grupul „nu e frumos”, „fără” pentru grupul ”fără
pic de bun simț”)
- conectori de expresii negative: sunt acele cuvinte care leagă inițiatorii de expresii
negative de restul grupului (ex.: „este” pentru grupul „nu este frumos”)
În momentul adăugării în dicționar sau al modificării, termenii sunt trecuți prin procesul de
stemming, excepție făcând termenii care fac parte din cele două clase menționate mai sus.
Acest lucru duce la un număr redus de intrări reținute în dicționar prin faptul că stemming-ul
acoperă toate cuvintele care conțin aceași rădăcină.
17
3.2.1.2 Expresiile
Expresiile sunt grupuri formate din unul sau mai multe cuvinte. Spre deosebire de termeni,
expresiile nu trec prin procesul de stemming, chiar și cele formate dintr-un singur cuvânt.
Pentru a acoperi toate formele unei expresii am utilizat un procedeu similar cu cel folosit în
cadrul termenilor. Am decis păstrarea rădăcinii cuvântului și folosirea caracterului „_” pentru a
sugera faptul că un cuvânt este variabil. Astfel, pentru a acoperi expresiile „cel mai bun” și „cei
mai buni”, utilizând cele menționate mai sus, este suficientă expresia „ce_ mai bun_”.
Așadar, expresiile sunt împărțite astfel:
- expresii fixe: sunt expresiile care nu prezintă nicio formă variabilă în componența lor
(ex.: felicitări, voie bună)
- expresii variabile: sunt expresiile care prezintă forme variabile în componența lor (ex.:
ce_ mai frumos_ pentru cel mai frumos, cei mai frumoși, etc.)
- expresii dinamice: expresiile dinamice sunt expresii identificate în momentul rulării.
Acestea sunt alcătuite doar din termeni și respectă urmatoare structură:
o încep cu un termen inițiator de expresie negativă
o pot sau nu să conțină unul sau mai mulți termeni conectori de expresie
negativă
o continuă cu un termen ce are proprietatea clasă pozitiv sau negativ
În funcție de proprietatea clasă al ultimului termen din expresie, aceasta este negată. Astfel,
în cazul în care clasa este pozitivă, expresia devine negativă, iar în cazul în care clasa este
negativă, expresia devine pozitivă (ex.: „nu este bine” – expresie dinamică negativă unde „nu”
este termen inițiator de expresie negativă, „este” termen conector de expresie negativă, iar
„bine” termen ce are proprietatea clasă pozitiv; „nu era chiar rău” – expresie dinamică pozitivă
unde „nu” este termen inițiator de expresie negativă, „era” și „chiar” termeni conectori de
expresie negativă, „rău” termen ce are proprietatea clasă negativ).
3.2.2 Funcția de analizare
Funcția de analizare utilizează dicționarul aplicației, care este încărcat în memorie la
momentul rulării. Am structurat alocarea în memorie pe diverse nivele astfel încât căutarea în
conținutul acestuia să fie una cât mai ușoară și mai puțin consumatoare de resurse.
Textul primit din partea utilizatorului este transformat și împărțit în termeni care mai apoi
sunt analizați. În urma analizării un rezultat este trimis spre partea de procesare grafică care
utilizează informațiile primite pentru reprezentarea în pagina a acestuia. Rezultatul afișat este
18
reprezentat atât sub formă grafică, utilizând cei mai relevanți termeni și cele mai relevante
expresii identificate, cât și sub formă tabelară fiind reprezentate trei nivele:
- nivelul expresiilor identificate
- nivelul termenilor identificați
- nivelul termenilor neidentificați (acest nivel fiind disponibil doar utilizatorilor cu drept
de administrator)
Fiecare termen sau expresie identificată apare în pagină o singură dată, însă este luată în
considerare, în cadrul rezultatului final, pentru fiecare apariție.
4. Implementare
În acest capitol voi prezenta câteva funcționalități pe care le consider reprezentative pentru
aplicație și care au avut, în opinia mea, un element cheie în modul de operare al acesteia:
- pagina de administrare a dicționarului și funcționalitatea acesteia
- funcționalitatea de analizare și încadrarea textului în clasa de sentiment identificată
- implementarea sistemului de notificare
4.1 Pagina de administrare a dicționarului și funcționalitatea acesteia
În opinia mea, pagina de administrare a dicționarului, reprezintă o pagină complexă
deoarece toate acțiunile existente se realizează în timp real, schimbările aplicându-se imediat,
fără reîncărcarea paginii. Voi descrie în continuare funcționalitățile existente oferind detalii de
implementare.
4.1.1 Adăugarea unui termen
Pentru adăugarea unui termen este necesară completarea formularului aferent. În urma
completării și a realizării acțiunii de adăugare, datele sunt validate pe partea de client, iar dacă
nu apar erori, este trimisă o cerere AJAX către server, unde datele sunt validate din nou (vezi
Secțiune Cod 1) și se verifică dacă termenul nu există deja în baza de date. În cazul în care noul
termen este adăugat cu succes, acesta este afișat în pagină prin trimiterea unei cereri AJAX care
actualizează termenii afișați.
19
Secțiune Cod 1: Validarea adăugării unui termen pe partea de server
4.1.2 Filtrarea dicționarului
Filtrarea dicționarului se face printr-o serie de câmpuri disponibile. Fiecare câmp are atașat
un declanșator astfel încât în momentul modificării se trimite o cerere AJAX care are rolul de
actualizare a datelor afișate în funcție de criteriile selectate (vezi Secțiune Cod 2).
Secțiune Cod 2: Ancorarea declanșatorilor pentru a permite filtrarea rezultatelor
Cererile AJAX sunt trimise de către obiectul DataTables creat la încărcarea paginii. Pentru a
realiza dinamic trimiterea parametrilor aferenți câmpurilor modificate, am adăugat pentru
cererile trimise, o funcționalitate personalizată ce permite cu ușurință eliminarea sau
adăugarea de noi filtre (vezi Secțiune Cod 3) prin utilizarea atributului „data-filter” atribuit
elementelor HTML ce reprezintă câmpurile.
20
Secțiune Cod 3: Adăugarea parametrilor de filtrare
4.1.3 Editarea termenilor
Din punct de vedere al implementării, editarea termenilor reprezintă cea mai complexă
funcționalitate a acestei pagini. Pentru a oferi eficiență am structurat funcționalitatea astfel:
- la încărcarea paginii, creez un obiect în JavaScript, unde rețin proprietățile specifice
termenului (conținutul, forma de stemming, clasa, etc.)
- la accesarea opțiunii de editare, utilizatorul primește dinamic posibilitatea de a salva
sau anula acțiunea curentă. Obiectul instanțiat la rulare este populat cu valorile
termenului modificat. Pentru fiecare valoare afișată, a fiecărei proprietăți, care până în
momentul actual este redată sub formă textuală, este generat dinamic, un câmp ce
poate fi modificat, populat cu valoarea curentă (vezi Secțiune Cod 4).
21
Secțiune Cod 4: Transformarea valorilor unui termen în câmpuri editabile
- în cazul anulării, câmpurile generate sunt transformate în reprezentare textuală, cu
valorile inițiale ale termenului (vezi Secțiune Cod 5)
Secțiune Cod 5: Transformarea câmpurilor în valori textuale
- în cazul modificării, se verifică dacă valorile câmpurilor diferă de valorile inițiale ale
termenului. Dacă valorile nu diferă, acțiunea se consideră a fi de anulare, aplicându-se
aceiași pași menționați anterior. Dacă valorile diferă, acestea sunt trimise server-ului,
care verifică dacă noile date sunt valide. În cazul în care datele sunt valide, se
efectuează modificarea pe partea de server, care trimite drept răspuns, schimbările
efectuate. Câmpurile sunt transformate în reprezentare textuală, fiind actualizate cu
noile valori (vezi Secțiune cod 6).
22
Secțiune Cod 6: Aplicarea modificărilor
4.2 Funcționalitatea de analizare și încadrarea textului în clasa de sentiment identificată
Execuția funcționalității de analizare are următorii pași:
- încărcarea dicționarului necesar
- împărțirea textului în propoziții
- identificare expresiilor fixe și variabile și înlocuirea acestora în text
- împărțirea propozițiilor în cuvinte
- determinarea scorului și identificarea clasei de sentiment
4.2.1 Încărcarea dicționarului necesar
La fiecare rulare, în funcție de limba textului, este încărcat în memorie, dicționarul necesar.
Înainte de încărcare, se verifică dacă dicționarul este deja în memorie și dacă este nevoie de
reîncărcarea acestuia, prin verificarea dății ultimei actualizări. Data ultimei actualizări este o
valoare reținută în baza de date și actualizată atunci când dicționarul suferă modificări, prin
utilizarea paginei de administrare a acestuia.
23
4.2.2 Împărțirea textului în propoziții
Pentru a evita posiblitatea de identificare greșită a expresiilor dinamice, am ales împărțirea
textului în propoziții. Prin identificare greșită mă refer la identificarea părților necesare unei
expresii dinamice, separat, în două propoziții și procesarea lor ca facând parte din aceași
expresie. (exemplu de identificare greșită: Ionel cuminte nu este. Bine că ...)
4.2.3 Identificarea expresiilor fixe și variabile și înlocuirea acestora în text
Primele identificate în text sunt expresiile fixe și variabile. Expresiile identificate sunt
înlocuite cu un termen irelevant pentru procesare. Acest lucru este necesar pentru a permite
identificarea corectă a expresiilor dinamice.
4.2.4 Împărțirea propozițiilor în cuvinte
Pentru procesarea termenilor și identificarea expresiilor dinamice este necesară împărțirea
textului în cuvinte. După împărțire, sunt identificate expresiile dinamice și termenii regăsiți în
dicționar. Pentru fiecare se adună la clasa de sentiment din care face parte, scorul acestuia.
4.2.5 Determinarea scorului și identificarea clasei de sentiment
Scorul obținut pentru fiecare clasă este transformat în procente astfel încât însumarea
acestora să dea 100% (vezi Secțiune cod 7).
Pentru a efectua încadrarea corectă în clasa de sentiment, am realizat o serie de teste ce m-
au ajutat în determinarea și precizia acestui lucru. Astfel pentru clasele de sentiment pozitiv și
negativ, am stabilit că încadrarea în acestea este corectă, doar dacă procentul calculat pentru
clasa identificată este mai mare decât suma procentului celorlalte clase identificate (vezi
Secțiune cod 7).
24
Secțiune Cod 7: Calcularea procentului și încadrarea în clasa de sentiment
4.3 Implementarea sistemului de notificare
Pentru a oferi utilizatorului o experință plăcută în urma realizării unei acțiuni, am decis
implementarea unui sistem de notificare ce înștiințează asupra rezultatului obținut.
Componența acestuia este alcătuită din două părți:
- partea viziuală
- partea funcțională
4.3.1 Partea vizuală
Partea vizuală este reprezentată de elementul HTML, pe care l-am denumit „alertă”, cu rolul
de a prezenta informațiile primite. Pentru realizarea și stilizarea acestuia am folosit unele
componente din biblioteca Bootstrap. În funcție de tipul mesajului reprezentat există trei tipuri
de alerte:
- alerte de succes
- alerte de eroare
- alerte de informare
25
Figura 6: Tipurile de alerte
4.3.2 Partea funcțională
Partea funcțională a sistemului de notificare are rolul de a interpreta răspunsul primit din
partea server-ului, de a-l procesa și mai apoi de a-l transforma în parte vizuală. Răspunsul este
de forma celui descris în secțiunea „3.2.1 Protocoale de comunicare”. Pe lângă răspunsul primit,
sistemul permite modificarea anumitor aspecte printr-o serie de parametrii, aceștia fiind:
- elementul de ancorare – are rolul de a preciza unde în pagină este afișată alerta, în
funcție de elementele specificate. Prin trimiterea unui singur element de ancorare se
va realiza centrarea pe verticală, iar prin două elemente, centrarea pe verticală și
orizontală. Elementele sunt trimise prin selectorii folosiți de jQuery (ex.:
$(‘#id_element’))
- durata de afișare – inițial alerta este vizibilă pentru 4 secunde. Parametrul permite
modificarea acestei valori
- animație – specifică dacă alerta este sau nu scoasă în evidență prin scroll către aceasta
- titlul alertelor – permite modificarea titlului pentru fiecare tip de alertă
26
Secțiune Cod 8: Exemplu de apelare a sistemului de notificare
Partea funcțională este realizată în JavaScript fiind structurată în următoarele etape:
- identificarea tipului de răspuns primit și verificarea structurii acestuia conform
protocolului stabilit
- încadrarea în tipul de alertă corespunzător
- afișarea notificării
4.3.2.1 Identificarea tipului și verificarea structurii răspunsului
Tipul răspunsului poate fi text sau obiect. În funcție de tipul acestuia se validează structura
răspunsului (vezi Secțiune Cod 9), care trebuie să respecte următorul șablon:
- răspuns de tip text {COD_RASPUNS}{SEPARATOR}{MESAJ} unde:
o COD_RASPUNS poate fi: 0 – eroare, 1 – succes, 2 – informare
o SEPARATOR este cel ce delimitează codul răspunsului de mesajul acestuia.
Separatorul utilizat este „#|#”
o MESAJ reprezintă mesajului răspunsului
- răspuns de tip obiect: { status -> ... , msg -> ... , data -> ...} unde:
o status – proprietate cu valorile: false – eroare, true – succes, orice altceva în
afară de valorile false și true este considerat status de informare
o msg – proprietate ce reprezintă mesajul răspunsului
o data – proprietate ce oferă posibilitatea de a extinde răspunsul primit prin
adăugarea unor date utilizate de client
27
Secțiune Cod 9: Identificarea răspunsului și validarea structurii
4.3.2.2 Încadrarea în tipul de alertă corespunzător
În funcție de tipul răspunsului se generează o alertă personalizată prin culoare și titlul
acesteia, luând în considerare parametrii de configurare în cazul în care aceștia sunt prezenți
(vezi Secțiune Cod 10):
Secțiune Cod 10: Încadrarea în tipul de alertă corespunzător
28
4.3.2.3 Afișarea notificării
Pentru afișare se ia în considerare dimensiunea alertei și elementele de ancorare specificate
(vezi Secțiune Cod 11).
Secțiune Cod 11: Afișarea alertei
5. Manualul utilizatorului
5.1 Meniul aplicației
Meniul (vezi Manualul utilizatorului figura 1) este mereu accesibil, indiferent de pagina pe
care se află utilizatorul și prezintă două stări: cea când utilizatorul nu este autentificat în
aplicație și cea când este.
Prima stare, când utilizatorul nu este autentificat, prezintă următoarele opțiuni:
Manualul utilizatorului figura 1: Meniul aplicației când utilizatorul nu este autentificat
29
- 1: pagina principală
- 2: opțiunea de înregistrare
- 3: opțiunea de autentificare
În urma accesării opțiunii de înregistrare, se va afișa o fereastră cu următoarele elemente:
Manualul utilizatorului figura 2: Fereastra de înregistrare
- 1 - 5: câmpurile necesare pentru a finaliza procesul de înregistrare
- 6: butonul de execuție a înregistrării
- 7: butonul de închidere a ferestrei de înregistrare
În urma accesării opțiunii de autentificare, se va afișa o fereastră cu următoarele elemente:
30
Manualul utilizatorului figura 3: Fereastra de autentificare
- 1 și 2: câmpurile necesare pentru a finaliza procesul de autentificare
- 3: butonul de execuție a autentificării
- 4: butonul de închidere al ferestrei de autentificare
Cea de-a doua stare a meniului, când utilizatorul este autentificat, prezintă următoarele
opțiuni:
Manualul utilizatorului figura 4: Meniul aplicației
- 1: pagina principală
- 2: pagina de administrare a dicționarului
- 3: pagina de administrare a utilizatorilor
- 4: pagina ultimelor rulări efectuate
- 5: funcționalitatea de modificare a contului
- 6: funcționalitatea de ieșire din cont
31
5.2 Pagina principală
Aici se vor efectua analizele de sentiment. În figura de mai jos sunt prezentate elementele
necesare efectuării unei analize:
Manualul utilizatorului figura 5: Pagina principală, elementele necesare analizării
- 1 – câmpul ce permite selectarea limbii
- 2 – câmpul unde se introduce textul
- 3 – butonul pentru execuția analizei
In urma analizei se va afișa rezultatul acesteia, prezentat în figura ce urmează:
Manualul utilizatorului figura 6: Pagina principală, afișarea rezultatului
32
- 4 – sentimentul principal identificat
- 5 – reprezentarea sub formă de grafic a proporțiilor identificate pentru fiecare clasă
- 6 – listarea termenilor ce au dus la identificarea sentimentului precizat la punctul 4
5.3 Pagina de administrare a dicționarului
Pagina de administrare a dicționarului prezintă următoarele secțiuni:
Manualul utilizatorului figura 7: Pagina de administrare a dicționarului
- 1: secțiunea de adăugare a unui nou termen
- 2: secțiunea de filtrare a dicționarului afișat în pagină
- 3: secțiunea de afișare a dicționarului
33
5.3.1 Secțiunea de adăugare a unui nou termen
Secțiunea de adăugare a unui nou termen prezintă următoarele elemente:
Manualul utilizatorului figura 8: Pagina de administrare, secțiunea de adăugare a unui termen
- 1: conținutul noului termen
- 2: tipul noului termen
- 3: clasa noului termen
- 4: limba noului termen
- 5: scorul noului termen
- 6: butonul de adăugare
5.3.2 Secțiunea de filtrare a dicționarului
Secțiunea de filtrare a dicționarului prezintă următoarele elemente:
Manualul utilizatorului figura 9: Pagina de administrare, secțiunea de filtrare a dicționarului
- 1: opțiunea de filtrare după conținut
- 2: opțiunea de filtrare după tipul termenilor
- 3: opțiunea de filtrare după clasa termenilor
- 4: opțiunea de filtrare după limba termenilor
- 5: opțiunea de filtrare după scorul termenilor
- 6: butonul de înlăturare a filtrelor aplicate
34
5.3.3 Secțiunea de afișare a dicționarului
Secțiunea de afișare a dicționarului, pe lângă informațiile afișate, prezintă următoarele
opțiuni:
Manualul utilizatorului figura 10: Pagina de administrare, secțiunea de afișare a dicționarului
- 1: editarea unui termen
- 2: ștergerea unui termen
În urma accesării opțiunii de editare, afișarea pentru termenul respectiv se va modifica,
permițând schimbarea valorilor:
Manualul utilizatorului figura 11: Pagina de administrare, modificarea unui termen
- 1: câmpul ce permite modificarea conținutului
- 2: câmpul ce permite modificarea tipului
- 3: câmpul ce permite modificarea clasei
- 4: câmpul ce permite modificarea scorului
- 5: câmpul ce permite modificarea limbii
- 6: opțiunea de salvare a modificărilor efectuate
- 7: opțiunea de anularea a modificărilor efectuate
În urma accesării opțiunii de ștergere, va fi afișată o fereastră ce va cere confirmarea
acțiunii efectuate:
35
Manualul utilizatorului figura 12: Pagina de administrare a dicționarului, confirmarea sțtergerii unui termen
- 1: buton de anulare a ștergerii
- 2: buton de confirmare a ștergerii
5.4 Pagina de administrare a utilizatorilor
Pagina de administrare, pe lângă listarea utilizatorilor și a informațiilor aferente despre
aceștia, prezintă următoarele elemente funcționale:
Manualul utilizatorului figura 13: Pagina de administrare a utilizatorilor
- 1: buton ce permite modificarea tipului utilizatorului
- 2: modificarea numărului de intrări afișate
36
- 3: câmp ce permite filtrarea după numele utilizatorilor
- 4: câmp ce permite filtrarea după adresa de email a utilizatorilor
- 5: câmp ce permite filtrarea după username-ului
- 6: câmp ce permite filtrarea după tipul utilizatorilor
- 7: buton ce permite înlăturarea filtrelor
5.5 Pagina ultimelor rulări efectuate
Aici sunt listate ultimele rulări efectuate, împreună cu informațiile aferente. Pagina prezintă
următoarele opțiuni:
Manualul utilizatorului figura 14: Pagina ultimelor rulări efectuate
- 1: opțiunea de a vedea întregul text atunci cand acesta este prea lung
- 2: opțiunea de a rula din nou analiza de sentiment
- 3: modificarea numărului de intrări afișate
- 4: câmp ce permite filtrarea intrărilor afișate după conținut
- 5: câmp ce permite filtrarea intrărilor afișate după limbă
- 6: buton ce permite înlăturarea filtrelor
37
5.6 Funcționalitatea de modificare a contului
În urma accesării opțiunii de modificare a contului, se va afișa o fereastră cu următoarele
elemente:
Manualul utilizatorului figura 15: Funcționalitatea de modificare a contului
38
- 1: câmp ce permite modificarea numelui
- 2: câmp ce permite modificarea adresei de email
- 3: câmp ce permite modificarea username-ului
- 4 și 9: butoane ce închid fereastra de modificare
- 5: buton ce salvează infomațiile modificate în câmpurile 1, 2 și 3
- 6: câmp ce necesită parola curentă în cazul schimbării parolei
- 7: câmp ce necesită o nouă parolă în cazul schimbării parolei
- 8: câmp ce necesită confirmarea noii parole în cazul schimbării parolei
- 10: buton ce modifică parola conform câmpurilor 6, 7 și 8
39
6. Concluzii
Având în vedere evoluția mediului online și amploarea pe care acesta a dezvoltat-o, pot
spune că „Sentiment Analyzer” este o aplicație cu potențial, care vine în ajutorul celor ce sunt
interesați de impactul emoțional transmis de diferite materiale (comentarii, recenzii, etc.).
Scopul acestei lucrări este de a prezenta aplicația și procedeele utilizate pentru realizarea
acesteia atât pe partea de client, cât și pe partea de server.
Prin elementele utilizate pentru aspect și funcționalitate am asigurat aplicației o perspectivă
„modernă”, ușor de utilizat care prezintă un flux cursiv și intuitiv.
Prin procedeele folosite pentru arhitectura analizatorului de sentiment, am permis
extinderea acestuia pentru orice limbă, prin adăugarea dicționarului aferent.
Pentru viitor se pot dezvolta unele îmbunătățiri precum:
- îmbunătățirea procedeelor utilizate pentru identificarea sentimentelor
- adăugarea de noi reguli în cadrul analizatorului
- un API ce permite reprezentarea datelor sub un format ușor accesibil (JSON, XML)
40
7. Bibliografie
1. https://www.cs.uic.edu/~liub/FBS/Sentiment-Analysis-tutorial-AAAI-2011.pdf
2. http://www.cs.uic.edu/~liub/FBS/opinion-lexicon-English.rar
3. https://en.wikipedia.org/wiki/Sentiment_analysis
4. https://en.wikipedia.org/wiki/Stemming
5. Jon Duckett. HTML and CSS: Design and Build Websites. John Wiley & Sons, Inc.,
2011.
6. Douglas Crockford. JavaScript: The Good Parts. O’Reilly Media, Inc., 2008.
7. Sabin Buraga. Programarea în Web 2.0. Polirom, 2007
8. https://en.wikipedia.org/wiki/MySQL