Clasificarea Textelor ÎN Social Media
UNIVERSITATEA „LUCIAN BLAGA” SIBIU
FACULTATEA DE INGINERIE
DEPARTAMENTUL DE CALCULATOARE ȘI INGINERIE ELECTRICĂ
PROIECT DE DIPLOMĂ
COORDONATOR ȘTIINȚIFIC :
Asist. dr. ing. Pitic Antoniu Gabriel
ABSOLVENT : Ghena Răzvan Victor
SPECIALIZAREA : Calculatoare
– Sibiu, 2016 –
UNIVERSITATEA „LUCIAN BLAGA” SIBIU
FACULTATEA DE INGINERIE
DEPARTAMENTUL DE CALCULATOARE ȘI INGINERIE ELECTRICĂ
CLASIFICAREA TEXTELOR ÎN SOCIAL MEDIA
COORDONATOR ȘTIINȚIFIC :
Asist. dr. ing. Pitic Antoniu Gabriel
ABSOLVENT : Ghena Răzvan Victor
SPECIALIZAREA : Calculatoare
– Sibiu, 2016 –
CAPITOLUL 1. INTRODUCERE
În introducere aș vrea să răspund la două întrebări, care se formează în mintea celui care citește pentru prima data denumirea aplicației, Clasificarea textelor în social media, și anume la întrebările CE? și DE CE?
Ce este această aplicație? Clasificarea textelor în social, media este un soft care se adresează persoanelor publice și instituțiilor publice și private care are ca scop informarea acestor entități în timp util cu privire la activitatea din mass-media în privința subiectelor de interes.
De ce este utilă această aplicație? În zilele noastre este foarte important pentru o companie sau pentru o persoană publică să fie conectată, să fie la curent cu ce se întâmplă în mass-media cu privire la ea. În momentul în care un site de știri sau o postare pe un anumit forum menționează numele entității, aceasta trebuie să știe cât mai repede acest lucru, această știre putând fi negativă, ca urmare imaginea companiei sau persoanei în cauză fiind afectată. Studiile statistice au arătat că dacă o companie răspunde în mai puțin de două ore impactul asupra imaginii companiei este mult diminuat în ochii clientului final. Putem observa tot mai des astfel de exemple în care anumite persoane publice sau companii sunt denigrate în public de către anumite site-uri fără ca acestea să aibă posibilitatea unui răspuns sau mai grav fără ca măcar să știe în timp util ce sa întâmplat. Puterea acestei aplicații vine din faptul că aceasta poate fi programată de către utilizator cu scopul de a supraveghea activitatea din mass-media la un interval de timp regulat și dacă este cazul, să fie anunțat dacă există activitate prin intermediul unui e-mail. Ne-am propus, pe lângă obținerea acestor texte din mass-media care sunt importante pentru utilizatorii aplicației, să facem o clasificare a acestor texte. Această clasificare se face în funcție de sentimentul pe care îl exprimă un text, unui individ. Pe lângă faptul că utilizatorul aplicației noastre va fi informat dacă este menționat într-un post în mass-media acesta va știi și dacă acel text are un impact pozitiv sau negativ asupra imaginii companiei. De asemenea ne-am mai propus ca folosind datele obținute în urma căutărilor pe web, să facem anumite predicții în legătură cu frecvența postărilor negative și pozitive în care este menționat numele companiei client. Astfel cu aceste predicții am putea ajuta utilizatorul aplicației noastre să reușească să anticipeze anumite evenimente ce se petrec în jurul companiei.
Am structurat lucrarea in cinci capitole după cum urmează:
Primul capitol reprezintă o introducere, al doilea capitol este reprezentat de partea teoretică, mai exact de tehnologiile folosite si de articolele, cărțile si cursurile care au fost citite pentru a putea fi dezvoltată aceasta aplicație.
În capitolul trei este prezentată partea practică a aplicației, în care am încercat să descriu cat mai în detaliu cum a fost implementata aplicația și ce principii am folosit în dezvoltarea ei.
Capitolul patru prezintă rezultatele obținute cu ajutorul aplicației si o scurtă interpretare a acestor rezultate.
Nu in ultimul rând, în capitolul cinci am prezentat concluziile si ce dezvoltări ulterioare se mai pot aduce aplicației.
CAPITOLUL 2. CONSIDERAȚII TEORETICE
2.1.Visual Studio 2012
Primul pas în dezvoltarea aplicației a fost alegerea unui mediu de lucru, iar pentru aceasta am ales una dintre soluțiile Microsoft și anume Visual Studio. Visual Studio 2012 este un mediu de dezvoltare care îți permite realizarea mai multor tipuri de aplicații, cum ar fi aplicații WEB Sites, Windows Forms și așa mai departe. Visual Studio include un editor de cod care printre funcționalități conține un IntelliSense (componenta pentru completarea automată a codului) și de asemenea Code refactoring, o componenta care ajută la restructurarea codului existent. Soluția oferită de cei de la Microsoft oferă suport pentru o serie largă de limbaje de programare cum ar fi C, C++, C#, VB .NET, F# și mai nou cu ultimul update, și pentru HTML, XHTML, JavaScript și CSS. De asemenea se pot instala servicii separate în Visual Studio care ar putea face disponibile limbaje precum Python, Ruby sau Node.js. [WikiIDE]
2.2 C#
Pentru dezvoltarea aplicației am ales limbajul C#. Este un limbaj de programare orientat-obiect (POO) conceput de Microsoft la sfârșitul anilor 90. A fost conceput ca un concurent pentru bine-cunoscutul limbaj Java . C# este un derivat al limbajului de programare C++. C# are o legătură deosebită cu mediul său de rulare, arhitectura .NET. Ce este arhitectură .NET? Arhitectura .NET definește un mediu de programare care permite dezvoltarea și execuția aplicațiilor indiferent de platformă. Aceasta permite programarea într-o gamă largă de limbaje și oferă facilități de securitate și portabilitate a programelor, fiind disponibilă pe platforma Windows. Legat de C#, arhitectura .NET definește două entități importante și anume biblioteca de clase .NET și motorul comun de programare sau Common Language Runtime (CLR). C# nu are o bibliotecă de clase proprii ci utilizează clasele .NET. De exemplu dacă avem un program care face operații de tip IO atunci C# va folosii clasele .NET. CLR se ocupă cu execuția programelor C#. El asigură de asemenea programarea în limbaj mixt, securitatea și portabilitatea programelor. [WikiC#]
2.3 ASP .NET MVC
2.3.1 Introducere
ASP.NET (Active server pages) este o platformă creată de către compania Microsoft și are ca scop permiterea dezvoltării aplicațiilor WEB. Această unealtă permite programatorilor să producă WEB site-uri, WEB Aplicații și de asemenea servicii WEB.
Pentru a simula experiența programatorului din modelul windows forms, au fost introduse in web forms programarea bazata pe evenimente, Viewstate (pentru a persista schimbările de stare intre postaback-uri) si PostBack. Ciclul de viată al unei pagini în acest model este unul complex având o singură clasă pentru a afișa o interfața către utilizator și pentru preluare input-ului utilizatorului. [WikiAspNETMVC]
2.3.2 MVC
Bazându-se pe ASP.NET Microsoft produce o versiune îmbunătățită a acestei platforme prin introducerea unui pattern foarte bine cunoscut în lumea programatorilor și anume MVC, model-view-controller. Șablonul MVC a fost introdus inițial în anul 1979 de către Trygve Reenskaug care lucra la limbajul Smalltalk. ASP.NET MVC permite programatorilor dezvoltarea unor aplicații complexe WEB folosind acest pattern. În cele ce urmează aș vrea să explic fiecare din cele 3 componente logice ale pattern-ului MVC.
Modelul MVC conține logica aplicației ce nu ține de view sau controller. În particular, modelul conține logica business a aplicației și accesul la baza de date.
Pot fi folosite o varietate de tehnologii pentru a implementa logica de acces la baza de date, cum ar fi Microsoft Entity Framework, NHibernate, Subsonic, LINQ to SQL sau clase ADO.NET.
View-ul este componenta care se ocupă cu afișarea datelor către utilizator. Spre deosebire de ASP.NET sau ASP, în ASP.NET MVC nu este inclus ceva ce în mod direct corespunde unei pagini. Într-o aplicație ASP.NET MVC nu există o pagină pe disc ce corespunde caii ASP.NET MVC un view. O cerere din browser este mapată unui controller, care poate returna un view
Figura 2-1. MVC Design Pattern [W3SPic]
Un lucru foarte interesant legat de view-uri în structura ASP.NET MVC este faptul că se poate folosii orice limbaj .NET pentru a genera conținut dinamic într-un view. De cele mai multe ori Visual Basic .NET sau C# vor fi folosite.
Pentru a fi mai ușor să se adauge conținut la un view, se poate folosi un, așa numit, HTML Helper. Un HTML helper este o metodă care returnează un string și poate fi folosit pentru a genera elemente HTML standard, cum ar fi textbox-uri, link-uri, dropdown-uri, etc.
Se poate, de asemenea, crea propriile HTML helpere. De exemplu, o metodă helper DataGridView() care să afișeze un set de câmpuri din baza de date.
Se poate folosi o proprietate a view-ului, ViewData pentru a transmite mai departe date din controller la un view. ViewData este o colecție nume-valoare.
Controller-ul este cel responsabil cu interacțiunea cu modelul și actualizarea acestuia pentru a reflecta schimbările ce se petrec în cadrul aplicației. Fiecare cerere din browser este mapată la o clasă controller. De exemplu, controller-ul poate returna la utilizator un view sau poate redirecta spre un alt controller.
Numele unei clase controller trebuie să se termine cu sufixul Controller. De exemplu PersonController este corect, dar un controller cu numele Person nu va funcționa (va arunca o excepție). Un controller este o clasă ce trebuie să extindă clasa de bază Controller.
Un controller expune acțiuni. O acțiune este o metodă în clasa controller care este apelată atunci când utilizatorul introduce un URL în bara de adrese a browser-ului. O acțiune a controller-ului trebuie să fie o metodă publică. Trebuie avut în vedere faptul că orice metodă publică din clasa controller este automat expusă ca o acțiune a controller-ului. Astfel, poate fi apelată de oricine doar prin scrierea URL-ului corespunzător în bara de adrese a browser-ului.[W3SAspMVC]
Mai există și alte reguli ce trebuie respectate de o acțiune a controller-ului: o metodă folosită ca acțiune nu poate fi supraîncărcata și nu poate fi statică. Ceea ce returnează o acțiune a unui controller reprezintă răspunsul cererii de la browser. Framework-ul ASP.NET MVC suportă șase tipuri standard de rezultat:
ViewResult – reprezintă HTML
EmptyResult – niciun rezultat
RedirectResult – reprezintă o redirectare spre un alt URL
RedirectToRouteResult – reprezintă o redirectare spre o alta acțiune a controller-ului
JsonResult – reprezintă un rezultat JavaScript Object Notation ce poate fi folosit într-o aplicație AJAX.
ContentResult – reprezintă un rezultat text
Toate aceste clase ce pot fi returnate de o acțiune extind clasa de bază ActionResult. În cele mai multe cazuri, acțiunea controller-ului întoarce un ViewResult.
2.3.3 Direcționare URL (URL Routing)
Direcționarea URL (URL Routing) este modulul responsabil cu maparea cererilor din browser la o acțiune specifică din controller.
Direcționarea URL trebuie setată în două locuri:
Fișierul de configurare (WEB.config). Există patru secțiuni în fișierul de configurare ce sunt relevante pentru direcționare (routing): secțiunea system.web.httpModules, system.web.httpHandlers, system.webserver.modules și secțiunea system.webserver.handlers. Fără aceste secțiuni prezente în fișierul de configurare, direcționarea nu funcționează.
Tabelul de direcționare este creat în fișierul Global.asax. Acesta este un fișier special ce conține tratarea evenimentelor din ciclul de viață al aplicației ASP.NET. Tabelul de direcționare este creat în timpul evenimentului Application Start.
Când o aplicație ASP.NET MVC rulează pentru prima dată, metoda Application_Start() este apelată. Această metodă, la rândul ei, apelează metoda RegisterRoutes(), care creează tabela de direcționare (route table). [MSDNAspMVC]
Dacă utilizatorul nu include un nume de controller în URL, atunci valoarea implicită este Home. Dacă nu se oferă numele acțiuni, aceasta va fi implicit Index, iar dacă nu se oferă un id, parametrul id va fi un string gol. [MSDNAspMVC]
2.3.4 Avantaje ASP.NET MVC
Controlul integral asupra HTML-ului redat
Separarea conceptelor (separation of concerns SoC)
Folosirea cu ușurință a programării bazate pe teste (Test Driven Developmnet – TDD)
Include o componentă de mapare a URL-urilor pentru crearea de aplicații cu URL-uri simple, permițând optimizarea pentru motoarele de căutare (SEO)
Suportă motoare de vizualizare cum ar fi Nvelocity, Brail sau Razor.
Nu folosește modelul existent în web forms de post-back pentru interacțiunea cu serverul. Acest model a fost înlocuit cu direcționarea interacțiunii utilizatorului la o clasă Controller, astfel se realizează separarea conceptelor și ușurința testării.
Framework extensibil. Framework-ul MVC este proiectat pentru a fi ușor de înlocuit și de asemenea suportă injectare de dependențe (dependecy injection) și modele de containere IOC (Spring.NET, NHibernate, etc).
2.3.5 Concluzii
Pentru programatorii care doresc să creeze aplicații folosind arhitectura MVC, ASP.NET MVC este o opțiune ușoară și curată. Oferă posibilitatea de a menține ușor separarea conceptelor în aplicație, de asemenea, facilitatea de a crea unit teste și de a aborda programarea bazată pe teste.
2.4 Baza de date
2.4.1 MSSQL Server
De asemenea în dezvoltarea aplicației am avut nevoie de o bază de date iar pentru aceasta am ales o altă soluție oferită de cei de la Microsoft și anume Microsoft SQL Server. MSSQL Server este un sistem de gestionare a bazelor de date relaționale.
Bază de date relațională – O bază de date este o colecție de date structurată sub forma unor tabele. O bază de date are, în principal, următoarele roluri: stocare (memorare) și organizarea datelor (structurare).
Ca și utilitate, bazele de date ne permit memorarea unor cantități mari de date, regăsirea datelor pe baza unor criterii ce căutare (ce sunt legate în mod direct de structurarea datelor), dar și prelucrarea unor volume mari de date (filtrare, ordonare, agregare).
Bazele de date relaționale sunt un tip de baze de date în care datele, văzute ca și atribute ale entităților reale, sunt stocate în tabele și sunt legate între ele prin relații. O relație reprezintă o asociere între două tabele.
Relația este modul în care o entitate spune „ai grijă, eu depind de altă entitate!”.
Exemple de relații pot fi: angajații sunt alocați pe proiecte, proiectele au task-uri, în cadrul unui departament se derulează mai multe proiecte.
Acest mod de structurare a datelor, bazat pe legături între date, permite eliminarea redundanței, astfel încât stocarea și, mai ales, modificarea unei informații se face într-un singur loc, iar, din punct de vedere funcțional, această structură permite regăsirea, filtrarea, ordonarea și agregarea datelor, în mod natural.[WikiDB]
2.4.2 Normalizarea
La proiectarea unui baze de date relaționale, principalul obiectiv în realizarea unui model logic este crearea unei reprezentări corecte a datelor, a relațiilor dintre ele și a constrângerilor. Pentru atingerea acestui obiectiv, trebuie identificat un set adecvat de relații. Normalizarea reprezintă o tratare de jos în sus a proiectării bazelor de date, care începe prin examinarea relațiilor dintre atribute. Totuși, de multe ori metodologia de proiectare abordează o tratare de sus în jos a bazelor de date (care începe prin identificarea principalelor entități și relații), caz în care normalizarea este folosită ca tehnică de validare.
Procesul de normalizare este o metodă formală, care identifică relațiile bazându-se pe cheile primare ale acestora și pe dependențele funcționale dintre atributele lor. Normalizarea ajută proiectanții de baze de date, prin prezentarea unei serii de teste care pot fi aplicate relațiilor individuale, pentru a preveni apariția anomaliilor de reactualizare.
Unul din principalele scopuri urmărite la proiectarea BD relaționale, este gruparea atributelor în relații în așa fel încât să se minimizeze redundanța datelor și prin aceasta să se reducă spațiul de stocare necesar relațiilor de bază, implementate.
Dependența funcțională descrie legăturile dintre atributele unei relații: fie A și B două atribute ale relației R; atributul B este dependent funcțional de A (notat A->B) dacă fiecărei valori a atributului A îi corespunde o singură valoare a atributului B. A și B pot fi simple sau compuse.
Conceptul de dependență funcțională este elementul central în procesul de normalizare. Normalizarea este o tehnică formală de analiză a relațiilor, care se bazează pe cheile primare și dependențele funcționale. Tehnica presupune o serie de reguli care pot fi utilizate pentru testarea relațiilor individuale, astfel încât o bază de date poate fi normalizată până la orice grad. Atunci când o cerință nu este îndeplinită, relația care o deranjează trebuie să fie descompusă în relații care satisfac individual cerințele normalizării. [AB&ANDB]
Adeseori, normalizarea este executată sub forma unei serii de pași. Fiecare pas corespunde unei anumite forme normale, care are proprietăți cunoscute. Pe măsură ce se desfășoară normalizarea, relațiile devin în mod progresiv mai restrictive. Pentru modelul relațional, numai forma normală 1 este de o importanță critică în crearea de relații adecvate. Toate formele normale următoare sunt opționale.
Prima formă normală se definește ca fiind o relație în care intersecția fiecărui rând cu fiecare coloană conține o singură valoare și numai una, adică toate atributele relației iau valori unice. [AB&ANDB]
2.4.3 ADO.NET
ADO.NET este o tehnologie Microsoft care oferă acces la baza de date. Acesta asigură comunicarea între sistemul de bază de date relațional sau non-relațional printr-un set de componente bine definite. ADO.NET este inclus în platforma .NET și face parte din setul principal de clase oferite de aceasta. În principiu această componentă este folosită de programatori pentru a lucra cu baza de date și pentru a beneficia de serviciile oferite de engine-ul bazei de date. Această tehnologie se consideră a fii o evoluție a ActiveX Data Object (ADO) dar a fost atât de mult schimbat și extins în timp încât poate fii considerat în produs nou. Pentru a executa operații cu bazele de date, se execută declarații SQL sau proceduri stocate (care conțin declarații SQL). Se utilizează declarațiile SQL sau procedurile stocate pentru a citi sau scrie în baza de date și a executa funcții agregate, cum ar fi adunări sau medieri. De asemenea se utilizează declarații SQL sau proceduri stocate pentru a crea, modifica tabele sau coloane, a efectua tranzacții, etc. [MsdnADO]
În ADO.NET se utilizează comenzi de date pentru a încapsula declarațiile SQL sau procedurile stocate. De exemplu dacă dorim să citim un set de linii dintr-o baza de date, creăm o comandă de date și o configurăm cu ajutorul textului unei declarații SQL Select, sau cu numele procedurii stocate care conține declarația. Când dorim extragerea unor date urmăm următorii pași:
– deschidem conexiunea
– apelam o metoda de execuție a comenzii care execută declarația SQL sau procedura stocată la care are referință comanda
– închidem conexiunea
2.4.4 SQL
Limbajul SQL este un limbaj de interogare structurat care este folosit pentru a comunica cu o bază de date. În conformitate cu ANSI (institutul național american de standarde), este limbajul standard pentru sistemele de management al bazelor de date relaționale. Instrucțiunile SQL sunt utilizate pentru a efectua sarcini, cum ar fi actualizarea sau achiziționarea de date. Limbajul SQL este folosit de un număr mare de SGBD-uri, cum ar fi: Oracle, Sybase, Microsoft SQL Server, Access, Ingres, etc. Deși majoritatea sistemelor de baze de date utilizează SQL, cele mai multe dintre ele au, de asemenea, propriile extensii care sunt de obicei utilizate doar pe sistemul respectiv. Cu toate acestea comenzile SQL standard, cum ar fi „SELECT”, „INSERT”, „UPDATE”, „DELETE”, „CREATE” și „DROP” pot fi folosite pentru a realiza tot ceea ce este nevoie pentru lucru cu o bază de date.
2.5 Tehnologii pentru interfața grafică
2.5.1 Razor
Razor reprezintă o sintaxă de programare în ASP.NET folosit pentru a crea pagini web dinamice cu ajutorul limbajului C# sau Visual Basic.NET. Razor a fost dezvoltat în anul 2010 și a fost scos pe piață în versiunea 2010 a lui Visual Studio. Razor este un motor de interfață care oferă o sintaxă simplă și a fost publicat ca și parte a MVC3. Sintaxa oferită are la bază limbajul de programare C#, și îi dă posibilitatea programatorului să folosească în interiorul unei construcții HTML cod de C#. În locul folosirii marcajelor vechi din ASP.NET WEB Form(.aspx) care erau de forma <%= %>(indicau un bloc de cod), sintaxa razor are ca și semn de marcaj simbolul „@” care nu are nevoie de închiderea explicită, în momentul în care blocul de cod sa terminat. Ideea din spatele lui Razor este aceea de a oferii o sintaxă pentru generarea codului HTML optimizată.[ASPRazor]
HTML
HTML sau Hypertext Markup Language reprezintă un limbaj de marcare care este folosit pentru crearea structurii unei pagini web ce poate fi afișata cu ajutorul unui browser. Acest limbaj are rolul de a prezenta informația sub forma de paragrafe, fonturi, tabele etc. Împreuna cu CSS si JavaScript reprezintă limbajele actuale cu ajutorul cărora se realizează majoritatea interfețelor paginilor WEB.
Elementele HTML formează blocurile HTML ale pagini. HTML permite inserarea de imagini sau alte obiecte embedded si poate fi folosit pentru crearea unor forme interactive. De asemenea HTML poate încapsula scripturi scrise in limbajul JavaScript care afectează comportamentul paginii. De asemenea HTML poate referii cod CSS care ajuta la îmbunătățirea interfeței cu utilizatorul. Istoria HTML este una foarte lungă, iar în anul 2014 acesta a ajuns la versiunea HTML 5, care are rolul de a oferii un standard valabil pentru toate browserele mari de pe piață. De asemenea o serie de noi elemente au fost puse la dispoziția programatorilor care ajuta la o dezvoltarea mai rapida si mai eficienta a paginilor web. [WikiHTML]
Actualizările ce țin de acest limbaj sunt oferite de World Wide Web Consortium sau W3C. [WikiHTML]
2.5.3 CSS
CSS (Cascading Style Sheets) este un standard pentru formatarea elementelor unui document HTML. Stilurile se pot atașa elementelor HTML prin intermediul unor fișiere externe sau în cadrul documentului, prin elementul <style> / atributul style. CSS se poate folosii pentru formatarea elementelor XHTML, XML SVGL.
Beneficiile sintaxei CSS sunt:
Formatarea este introdusă într-un singur loc pentru tot documentul.
Editarea rapidă a etichetelor.
Datorită introducerii într-un singur a etichetelor se obține o micșorare a codului paginii, implicit încărcarea mai rapidă a acesteia.
Sintaxa CSS este structurată pe trei nivele:
Proprietățile etichetelor din documentul HTML, tip inline.
Informația introdusă în blocul head, tip embedded.
Comenzile aflate în pagini separate, tip externe.
Cea mai mare importantă (suprascrie orice alt parametru) o are sintaxa de nivelul 1 iar cea mai mică importanță o are cea de nivelul 3. [WikiCSS]
Folosirea unui fișier extern sau nivelul 3 care să conțină comenzi CSS este foarte practic deoarece poate fi utilizat în mai multe situații (mai multe fișiere HTML pot folosi același fișier extern CSS) eliminând timpul necesar introducerii codului corespunzător în fiecare pagină și totodată editarea lor într-un singur loc pentru mai multe fișiere. Extensia acestor fișiere este .css.
Legătura paginilor HTML cu fișierele externe CSS se face prin introducerea următoarei linii de cod:
<link rel = „stylesheet” type=”text/css” href = „fisier.css”>
Atributele indica următoarele:
Rel – fișierul este tip stylesheet
Type – tip text ce conține CSS
Href – fișierul sau adresa fișierului CSS
Comenzile de nivel 2 sau embedded sunt cele găzduite oriunde între perechea de etichete <head> și </head> conform sintaxei:
<style type = „text/css”>
<!—
..comenzi CSS..
–>
</style>
Unde style – specifică unde începe și unde se termină blocul CSS iar type este folosit pentru a ascunde de browser-ele vechi, care nu cunosc sintaxa CSS, conținutul blocului style.
Comenzile CSS de nivel 1 sau inline sunt cele mai folosite, ele suprascriind orice alte comenzi CSS. Sunt amplasate în interiorul etichetelor HTML aflate în zona BODY și au sintaxa:
<eticheta style = „codul CSS dorit”>
..textul sau obiectul asupra căruia este aplicat codul CSS..
</eticheta>
Id și class sunt comenzi care dau unei formatări CSS un nume. Se folosesc atunci când dorim să aplicăm un style de formatare unei anumite zone. Pentru compatibilitate cu versiunile anterioare de browsere numele asociate zonelor nu voi conține caracterul _ . [WikiCSS]
Elementul id, se aplică la o singură etichetă HTML, plasându-se un nume acelui style. Acest element necesită existența comenzilor CSS în zona HEAD sau într-un fișier extern.
Elementul class este similar cu id dar spre deosebire de acesta poate fi folosit de mai multe ori sau pentru zone mai mari, ca și id necesită existența comenzilor CSS în zona HEAD sau într-un fișier extern.[WikiCSS]
2.5.4 JavaScript
JavaScript (JS) este un limbaj de programare orientat obiect. Este folosit mai ales pentru introducerea unor funcționalități în paginile web, codul fiind rulat de către browser. Limbajul este folosit în construirea site-urilor web, dar și pentru accesul la obiecte inserate (embedded objects) în alte aplicații. A fost dezvoltat inițial de către Brendan Eich de la Netscape Communications Corporation sub numele de Mocha, apoi LiveScript, și denumit în final JavaScript. Este un limbaj tot mai des folosit în zilele noastre deoarece oferă enorm de multă dinamicitate unui site web. Putem spune în anul de față, 2016, JavaScript împreună cu platformele care au la bază javascript sunt indispensabile pentru crearea unei aplicații web. Printre aceste platforme pot enumera cu ușurință 2-3 foarte importante și de asemenea foarte utile, cum ar fi JQuery,Angular,js, Node,js și așa mai departe. JavaScript este un limbaj care se execută la nivelul browser-ului, ceea ce implică faptul că se execută client-side(adică la client). Acest lucru este foarte util deoarece putem elimină o parte din cererile către server, care ar îngreuna mersul aplicației. Totodată o altă „minune” care are la bază JavaScript este platforma Ajax cu ajutorul căreia putem face apeluri asincrone către server, ceea ce implică o dinamicitate sporită la nivelul clientului.[WikiJS]
2.6 LINQ
O altă unealtă folosită de mine în dezvoltarea aplicației a fost LINQ sau Language Integrated Query care a fost de mare folositor. LINQ este o tehnologie oferită de Microsoft care adaugă o capabilitate foarte importantă pachetului .NET, și anume posibilitatea folosirii interogărilor la nivelul codului. Adică, LINQ introduce operatori precum SELECT, WHERE ,SUM ,MIN, MAX care pot fi aplicați la nivelul obiectelor și la nivelul colecțiilor de date. Aceste metode sunt extrem de utile și reprezintă una din bazele RAD (rapid application development) propus de cei de la Microsoft, deoarece folosind aceste metode scade timpul de producție al unui soft.[WikiLINQ]
2.7 GIT
Git este un sistem de control al versiunii, care este utilizat pe scară largă pentru dezvoltarea de software și alte sarcini de control al versiunii. Este un sistem de control distribuit de revizuire cu accent pe viteză, integritatea datelor, și suport pentru fluxurile de lucru distribuite, non-lineare. La fel ca și celelalte sisteme de control al versiunii distribuite, și spre deosebire de cele mai multe sisteme client-server, fiecare director de lucru GIT este ca și un „depozit”(repository) cu drepturi depline și cu o istorie completă de versiuni cu capacități de urmărire a versiunii, independent de accesul la rețeaua de internet sau de un server central.
În dezvoltarea soft-ului, am folosit GIT-ul cu scopul, păstrării unei versionari cât mai curate și beneficiind de puterea GIT-ului am putut avea un back-up în permanență și am putut reveni în urmă, la o versiune mai veche a aplicației de fiecare dată când a fost nevoie, fără a avea probleme. GIT-ul nu are o interfață grafică, comenzile acestuia fiind date dintr-o consolă, însă cei de la Atlassian au creat o interfață grafică pentru GIT, care au denumit-o SourceTree, o unealtă foarte folositoare deoarece te scutește de reținerea comenzilor de consolă, acestea fiind reprezentate de anumite acțiuni la nivelul interfeței în SourceTree.[WikiGIT]
2.8 Conceptul de sentiment analysis
2.8.1 Inteligenta artificiala
Inteligența artificială este ramura informaticii care se ocupă cu proiectarea de sisteme de calcul care să simuleze comportamente inteligente. Aceasta mai este definită și ca domeniul care se ocupă cu realizarea de sisteme care să perceapă mediul înconjurător și care să ia măsuri pentru a-și maximiza șansele de succes. [Volovici97]
La momentul actual, inteligența artificială este un domeniu foarte vast utilizat. Câteva exemple unde aceasta este folosită ar fi:
autoturisme autonome
rezolvarea de probleme dificile în multe alte domenii precum chimie, biologie, inginerie, medicină ș.a.
căutări pe motoarele de căutare web
roboți care realizează sarcini motoare repetitive
procesare de limbaj natural
traduceri dintr-o limbă în alta
recunoaștere vocală
procesare de imagini vizuale
jocuri
Scopul principal al inteligenței artificiale este acela de a rezolva probleme. Inițial au fost dezvoltați algoritmi care imitau pas cu pas comportamentul pe care îl au oamenii atunci când rezolvă un puzzle sau când fac o deducție logică. Prin cercetări ulterioare s-au descoperit metode de a trata informații incerte sau incomplete, folosind concepte din economie si probabilități. În cazul problemelor dificile, majoritatea acestor algoritmi pot să necesite resurse enorme de calcul, majoritatea ducând la o explozie combinatorială (cantitatea de memorie sau timpul de calcul necesare devin astronomice atunci când problema depășește un anumit prag). O mare prioritate a inteligenței artificiale o constituie găsirea unor algoritmi cât mai eficienți pentru rezolvarea problemelor.[WikiAI]
2.8.2 Sentiment analysis
Pentru aplicația dezvoltată de mine am ales unul din subdomeniile inteligenței artificiale și anume sentiment analysis.
Sentiment analysis sau opinion mining se referă la folosirea procesării limbajului natural, la analiza textului și la lingvistica computațională pentru a identifica și a extrage informație subiectivă dintr-o sursă de materiale. Analiza sentimentală este aplicată la scară largă pentru site-urile de știri (mass-media) și pentru diferitele tipuri de analize (reviews), variind de la domeniul marketing-lui până la serviciile cu clienți. [WikiSA]
În general vorbind, analiza sentimentală are ca scop determinarea atitudinii unui vorbitor sau scriitor cu referire asupra unui subiect sau asupra polarității contextuale a documentului. Această atitudine poate fi judecata sau evaluarea afectivă a lui/a ei sau comunicarea emoțională ce o primește. [Mullen]
Una din sarcinile analizei sentimentale este clasificarea unei text dintr-un document, o propoziție sau un cuvânt cu privire la opinia exprimată, aceasta putând fi pozitivă, negativă sau neutră. Într-un mod mai avansat, dincolo de polaritate, clasificarea sentimentală încearcă să privească textul dat dintr-o perspectivă cât mai umană astfel încercând să intuiască stări emoționale cum ar fii „bucuria”, „tristețea” , sau „supărarea”. [Lexa]
Studiile recente care includ cercetările făcute de Turney și Pang care au aplicat diferite metode pentru detectarea polarității recenziilor unui produs sau a unui film. Aceste cercetări au fost la nivelul documentului, însă se poate clasifica polaritatea unui document pe mai multe căi, lucru care a fost încercat de către Pang și Snyder împreună cu alții. Pang și Lee au extins sarcina de bază a clasificării unei recenzii de film ca fiind pozitivă sau negativă, la a încerca să predictioneze pe o scară de evaluare cu steluțe, având un interval de 3 sau 4 steluțe, în timp ce Snyder a încercat o analiză mai în detaliu asupra recenziilor unui restaurant, predictionand din aspecte variate, cum ar fi, calitatea mâncării și atmosfera pe o scară de 5 stele. Chiar dacă în majoritatea metodelor de clasificare statistică, clasa „neutru” este ignorată făcând presupunerea că textele neutre se apropie de granița clasificatorului binar, mai mulți cercetători au sugerat faptul că în orice problemă de polaritate 3 categorii trebuie identificate. Mai mult de atât, se poate dovedii că, clasificatori specifici cum ar fii Entropia maximă (Max Entropy) și SVM ar beneficia de introducerea clasei neutru și ar îmbunătății acuratețea globală. Fie că algoritmul, prima dată identifică limbajul neutru, îl filtrează și pe urmă evaluează termenii rămași ca fiind sentiment de tip pozitiv sau negativ sau construiește o clasificare bazată pe estimarea probabilităților distribuției pe categorii. [WikiSA]
Putem lua ca exemplu modul de lucru al clasificatorului Naive Bayes implementat în kit-ul NLTK a lui Python. Când și cum să folosești clasa „neutru” depinde de natura datelor. Dacă datele sunt clar împărțite în „neutru”, „pozitiv”, „negativ” atunci are logică să filtrăm partea neutră, și să ne axăm pe polaritatea negativă sau pozitivă, însă dacă datele sunt majoritatea neutre cu mici deviații între pozitiv și negativ atunci această strategie ar face mai greu diferență între cei doi poli. O altă metodă pentru determinarea sentimentului este folosirea unui scale în care cuvintelelor le sunt asociate numere specifice cum ar fii -10 pentru foarte negativ până la +10 ca fiind foarte pozitiv. Acest lucru face posibilă ajustarea sentimentului unui termen, în funcție de contextul dat. Când un text este analizat folosind procesarea limbajului natural acesta primește un scor bazat pe cuvintele contextuale și pe scorul asociat acestora. Acest procedeu permite o analiză mai sofisticată asupra unui text deoarece în acest mod, este posibil să ajustăm valoare sentimentală a unui cuvânt pe baza contextului în care se află. Cuvinte care intensifică, relaxează sau neagă sentimentul exprimat de concept, afectează scorul global al textului. [WikiSA]
2.8.3 NLP Stanford University
Natural language processing (NLP) este un domeniu ce aparține de știința calculatoarelor, inteligența artificială și lingvistica computațională preocupat cu interacțiunea dintre calculatoare și om (comunicarea umană). NLP sau procesarea limbajului natural are ca scop studiul calculator-om. Una din sarcinile importante ale acestuia este înțelegerea limbajului natural uman, practic să ofere calculatorului posibilitatea să înțeleagă sensul limbajului uman. Algoritmii moderni pentru procesarea limbajului natural sunt bazați pe machine learning. Paradigma machine learning este diferită față de primele încercări ce au fost făcute în acest domeniu. Implementările anterioare pentru procesarea lingvistică presupuneau codificarea unei set masiv de reguli. Această nouă paradigmă apelează la algoritmi de învățare, care au ca scop învățarea automată a acestor reguli prin analiza unor seturi mari de documente denumite în engleză „corpora”. Un „corpus” este un set de documente sau în unele cazuri propoziții de sine stătătoare care au fost etichetate de om cu valorile corecte pe care ulterior algoritmul nostru să le învețe. [WikiNLP]
Subiectele principale pe care le abordează NLP sunt următoarele:
Automatic summarization – are ca scop crearea unei rezumat al unei text cum ar fi un articol financiar dintr-un ziar
Machine translation – ideea acestuia este de a traduce automat dintr-o limbă în alta.
Named entity recognition (NER) – acest modul are rolul de a determina care cuvinte reprezintă nume de persoană, locuri sau organizații etc.
Part-of-speech tagging – acest subiect încearcă să eticheteze fiecare cuvânt dintr-o frază în funcție de partea de vorbire, de exemplu dacă un cuvânt este subiect, predicat, adverb etc
Sentiment analysis – după cum am spus și mai devreme acest modul are rolul de a obține o părere subiectivă despre un text, stabilind polaritatea acestuia
Word sense disambiguation – multe cuvinte au mai multe sensuri, rolul acestui subiect este de a își da seama din ce context aparține acel cuvânt
Pentru lucrarea de licență am făcut studii pentru a vedea care NLP este cel mai bine dezvoltat de pe piață, care are rezultatele cele mai bune. În primă fază am fost atras de implementarea și rezultatele celor de la NLTK (natural language toolkit). Aceștia au implementat NLP într-un mediu care permite o procesare foarte rapidă pe texte și anume Python. Însă problemele au apărut în momentul în care am vrut să leg acest modul de NLP cu proiectul meu principal care este reprezentat în mare parte de soluții Microsoft și anume Visual Studio și limbajul de programare C#. Am încercat mai multe metode prin care să fac legătura între Python și Visual Studio, printre aceste încercări pot enumera apelul direct către Python prin metode de proces și printr-un tool aflat pe piață în momentul de față numit IronPython însă complexitatea și lipsa de maturitatea din partea celor de la IronPython nu mi-am permis crearea legături între mediile de dezvoltare, astfel am ales un alt NLP, și anume cel oferit de universitatea din Stanford.
Aceștia pun la dispoziția programatorilor un set de modele antrenate și niște funcții API care te ajută la folosirea engine-ului de NLP. Am găsit ca fiind foarte ușor de folosit aceste API-uri și cu niște rezultate foarte bune. După ce am studiat lucrarea lor științifică în care și-au prezentat aplicația, am aflat că modelul oferit de ei este antrenat pentru limba engleză pe baza de date oferită și construită de Pang în anul 2005, care conține recenziile unor filme. După procesarea acestora au rezultat undeva la 215,154 fraze unice cu ajutorul cărora a fost antrenat algoritmul. Algoritmul celor de la universitatea din Stanford are la bază rețele neuronale recursive. Aceștia au folosit rețelele neuronale recursive pentru a antrena algoritmul și pentru a oferii un model celor care vor să îl testeze. [NLPSta] [NLPPaper]
2.9 Web Crawler
2.9.1 Introducere
Un Web crawler este în esență un bot de internet care, în mod regulat caută în world wide web cu scopul de a indexa sau de a parcurge anumite pagini web.
Motoarele de căutare folosesc acești web crawleri cu scopul de a actualiza conținutul anumitor pagini sau cu scopul indexării lor. Acești boți ai internetului pot copia în întregime paginile ce le vizitează pentru o procesare ulterioară, a altor aplicații, cum ar fii motoarele de căutare. Ideea indexări site-urilor a apărut pentru a oferii utilizatorilor o experiență cât mai plăcută și pentru a eficientiza căutările în momentul în care se vrea anumite rezultate. [WikiWC]
Din păcate acești crawleri sunt consumatori de resurse ale sistemului pe care îl vizitează, și de ce le mai multe ori fără permisiunea site-urilor respective. Astfel apar probleme cum ar fi încărcarea sau „politețea” cu care acești crawleri accesează paginile web. Bineînțeles există anumite mecanisme și protocoale care împiedică accesul acestor agenți pe site-urile respective, însă există șansa reală ca acești agenți să nu țină cont de acel protocol, mai ales dacă este un agent neoficial. Cum numărul de pagini din internet este incredibil de mare, chiar și cei mai puternici crawleri nu reușesc să indexeze toate paginile web. [WikiWC]
2.9.2 Mod de funcționare
Modul de funcționare a acestor crawleri este unul destul de simplu. În primul rând ii se oferă o listă inițială de url-uri pe care să le viziteze numită în engleză „seeds”. În momentul în care agentul intră pe url acesta identifică toate site-urile care le găsește pe pagina respectivă și le adaugă la o listă de site-uri care urmează să fie vizitate. Această listă de site-uri este vizitată recursiv în funcție de anumite politici/setări care sunt făcute. Dacă crawlerul este setat să facă arhivare a site-urilor ce le vizitează acesta copiază și salvează conținutul întru-un mod care se permite vizualizarea ulterioară a acelui conținut ca și cum el ar fi fost live. Volumul foarte mare pe care crawler-ul trebuie să îl descarce implică faptul că numărul de pagini este limitat într-un interval definit de timp, deci este nevoie de o prioritizare. Din păcate schimbările sunt destul de rapide astfel pot apărea probleme în care paginile pot fi în orice moment modificate sau chiar șterse, deci nefiind de actualitate.
De asemenea o altă problemă pe care o poate întâlnii un crawler este descărcarea conținutului duplicat. Există nenumărate cereri de tip http get care doar o parte din ele returnează conținut unic. De exemplu avem o galerie de poze care oferă posibilitatea utilizatorului să ordoneze pozele după patru criterii, crawler-ul va obține același conținut pentru fiecare cerere făcută la server in care pozele sunt ordonate într-un fel sau altul, astfel putem continua cu exemplul nostru adăugând alți parametrii în get-ul respectiv, și făcând un calcul simplu vedem faptul că există foarte mult conținut duplicat cu care agentul are de-a face, și într-un fel sau altul trebuie să îl trateze.
2.9.3 Politici de crawling
Există mai multe tipuri de politici care pot fi implementate în contextul web crawler-ului și anume:
O politică a selecției – care pagină să o descarce și care nu
Regula revizitării unui site – când să caute după schimbări la anumite pagini
Politica „politețe” – această politică sau regulă face referire la un crawling sănătos din punctul de vedere a țintei, a site-ului pe care îl vizităm, pentru a nu crea supraîncărcare acelui site
Politica paralelizării – face referire la crearea unui protocol care să coordoneze o serie de agenți care lucrează în paralel. [WikiWC]
2.9.4 Securitate
Legat de securitate, un element foarte important, este faptul că, chiar dacă majoritatea deținătorilor de site-uri vor ca paginile lor să fie indexate de către motoarele de căutare rezultând o prezența puternică în topul căutărilor, acești web crawleri pot fi pe o parte dăunători paginilor deoarece pot conduce la pierderi de date sau chiar compromiterea anumitor resurse. Un studiu din 2013 a arătat faptul că majoritatea site-urilor care au fost hack-uite erau în topul căutărilor deci erau foarte bine indexate de motoarele de căutare, astfel au permis atacatorilor să găsească foarte ușor victimele. [WikiWC]
Web crawleri în mod general se identifică server-ului pe care îl vizitează, printr-un câmp din cererea HTTP și anume „User-agent”. Administratorii site-ului pot examina log-ul serverului și folosind câmpul specificat mai devreme să determine ce crawleri au vizitat serverul web și cât de des. Crawlerul de asemenea mai poate include un URL în care administratorul site-ului să găsească mai multe informații despre agent. [WikiWC]
2.9.5 Data mining
Data mining sau „mineritul” (extragerea) de date este un subdomeniu în cadrul științei calculatoarelor. Este procesul computațional de descoperire a modelelor din cadrul unor seturi mari de date care implică metode din mai multe domenii, cum ar fii inteligenței artificiale, învățare automată, statistică și sisteme de baze de date. Scopul general al procesului de extragere a datelor este de a extrage informații dintr-un set de date și transformarea acestora într-o structură ușor de înțeles pentru o utilizare ulterioară. [TheArling]
Exploatarea datelor are ca sarcină analiza automată sau semi-automată a unor cantități mari de date pentru a extrage modele interesante, necunoscute anterior, cum ar fi grupuri de înregistrări de date (cluster analysis), înregistrări neobișnuite (detectarea anomaliilor – anomaly detection) și dependențe (association rule mining). Acest lucru implică, de obicei, folosirea unor tehnici de baze de date, cum ar fi indicii spațiali. Aceste modele pot fi apoi văzute ca un fel de rezumat al datelor de intrare și pot fi utilizate în analize ulterioare sau, de exemplu, în carul domeniului de învățare automată (machine learning) și în cadrul analizei predictive. [TheArling]
Cum poate extragerea de date să furnizeze informații importante, necunoscute, iar în același timp să poată prezice ceea ce va urma să se întâmple? Tehnica utilizată pentru a efectua aceste lucruri se numește modelare („modeling”). Modelarea este pur și simplu actul de construire a unui model într-o situație în care se știe răspunsul, iar apoi se aplică acest model într-o altă situație a cărei răspuns este necunoscut. Acesta tehnică de construire a unui model este o tehnică folosită de către oameni de foarte mult timp, cu siguranță, înainte de apariția calculatoarelor sau a tehnologiei de extragere a datelor. Cu toate acestea ceea ce se întâmplă cu adevărat pe calculator nu este cu mult diferit de modul în care oamenii construiesc modele. Calculatoarele sunt încărcate cu o mulțime de informații cu privire la o varietate de situații în care un răspuns este cunoscut, iar apoi un program software de extragere a datelor trebuie să ruleze prin acele informații și să filtreze caracteristicile datelor care v-or alcătui modelul. Odată ce modelul este construit acesta poate fi apoi utilizat în situații similare, în cazul în care răspunsul nu este cunoscut. [TheArling]
Ultimii ani au cunoscut o creștere dramatică a datelelor de tip text scris în limbajul natural, inclusiv pagini web, articole de știri, literatură științifică, email-uri, documente și „social media”, cum ar fi articole de tip blog, mesaje, recenzii și „tweet-uri”. Datele de tip text sunt unice, în sensul că acestea sunt, de obicei, generate în mod direct de către un om și nu de către un sistem informatic sau senzori de stări, și astfel sunt date deosebit de valoroase în descoperirea unor cunoștințe despre opiniile și preferințele oamenilor, în plus față de numeroase alte tipuri de cunoștințe pe care le codificăm în texte.
Așadar „mineritul” de texte, de asemenea, menționat ca și extragerea de date din cadrul textelor, se referă la procesul de obținere a informațiilor de înaltă calitate din cadrul textelor. Această informație cu caracter special este desprinsă din cadrul textelor prin conceperea de modele și tendințe prin mijloace, cum ar fi modele de învățare statistică. „Mineritul” de text implică, de obicei, procesul de structurare a textului de intrare (parsare, împreună cu adăugarea unor caracteristici lingvistice derivate și cu eliminarea altora, alături de inserarea ulterioară într-o bază de date), derivând modele în cadrul datelor structurate, și în final evaluarea și interpretarea textului de ieșire (output). [WikiTM]
2.10 Machine Translation
2.10.1 Introducere
Traducerea unui text automată cu ajutorul unui calculator, așa se poate traduce în limba română unul din subdomeniile inteligenței artificiale, tot mai important și mai în vogă în zilele noastre. Machine translation face parte din aria de studiu a lingvistici computaționale care se ocupă cu utilizarea unui software care să traducă un text sau o conversație verbala dintr-o limbă sursă într-o limbă destinație. La un nivel de bază MT face o înlocuire simplă a cuvintelor dintr-o limbă în alta, însă acesta metodă nu poate produce o traducere a unui text foarte bună, deoarece este nevoie de o perspectivă de ansamblu asupra unei fraze pentru a putea traduce corect. Rezolvarea acestei probleme cu ajutorul „Corpus”, care încearcă să se bazeze pe exemple din viață de zi cu zi și cu ajutorul unor tehnici statistice, este într-o rapidă creștere și duce la traduceri din ce în ce mai bune. Aplicațiile software din ziua de astăzi de cele mai multe ori permit personalizarea în funcție de domeniul de activitate, astfel se limitează domeniul cuvintelor care trebuie înlocuite, astfel rezultând traduceri mai bune. [WikiMT]
2.10.2 Procesul de traducere la om
Procesul de traducere la poate fi descris în felul următor:
Decodificare înțelesului textului sursă și
ReCodificarea acestui înțeles în limba destinație.
În spatele acestui proces simplu stă o serie de operații complexe cognitive. Pentru a decodifica înțelesul textului sursă, cel care traduce textul trebuie să interpreteze și să analizeze fiecare cuvânt al frazei, proces care necesită cunoștințe în gramatică, semantică, sintaxă, metafore, etc, a limbii sursă și la fel de multe cunoștințe pentru recodificarea în limba destinație.
Acestea sunt provocările acestui domeniu: cum să faci o aplicație software care rulează pe un calculator să „înțeleagă” un text așa cum o persoană o face.
2.10.3 Abordări
Machine translation poate folosi o metodă bazată pe regulile limbii, ceea ce înseamnă că fiecare cuvânt va fii tradus într-un mod lingvistic. Altfel reformulat, fiecare cuvânt a textului sursă va fi înlocuit cu cuvântul echivalent lui, în limba destinație. De multe ori este discutat faptul că pentru a avea succes în acest domeniu, prima dată trebuie rezolvată problema înțelegerii limbajului natural.
Dacă au destule date, aceste soft-uri de traducere de cele mai multe ori funcționează bine pentru un vorbitor nativ de o limbă care vrea traducerea aproximativă a ceea ce a spus un alt vorbitor de limbă nativă diferită. Dificultatea vine când nu există suficiente date de un anumit tip pentru a ajuta o metodă specifică. De exemplu, avem corpus care este compus din multe limbi, însă cantitatea de date de care are nevoie pentru a funcționa metodele statistice pentru metodele bazate pe gramatică nu este suficient. [WikiMT]
2.10.4 Aplicații
Nu putem spune că există la oră actuală un sistem care oferă sfântul Graal în traducerea de mare calitate a unui text, însă există destul de multe sisteme care produc niște rezultate decente. Calitatea traducerilor crește foarte mult dacă domeniile în care se fac traducerile sunt limitate. [WikiMT]
Google are niște rezultate foarte bune în acest domeniu și foarte promițătoare, obținute în urma folosirii unui motor de traducere automată statistic. Motorul de traducere statistic folosit de cei de la Google pentru traducerile de tip Arabă <-> Engleză și Chineză <-> Engleză a avut un scor superior față de unealtă celor de la IBM (testele au avut loc în vară anului 2006), teste conduse de Institutul Național de Standarde și Tehnologie. [WikiMT]
Acest domeniu este în creștere, tot mai multe companii investesc în el, și în anii ce urmează odată cu dezvoltarea Natural Language Processing o să apară rezultate deosebite și în acest domeniu.
CAPITOLUL 3. DEZVOLTAREA APLICAȚIEI
Orice aplicație scrisă în zilele noastre trebuie să țină cont de anumite principii. Experiența dobândită în anii anteriori m-a ajutat să aleg cu grijă aceste principii. În primul rând orice aplicație pe care o dezvoltăm, și aici vorbesc pe partea de programare și de partea de coding trebuie să fie cât mai curată. Ce înțeleg prin curată? E foarte simplu… trebuie în primul rând ca programatorul să aibă coerență în cod, să scrie codul cât mai lizibil posibil deoarece orice aplicație cel mai probabil o să fie întreținută și de alți programatori, astfel am ales să urmez principiile învățate din cartea „Clean Code” a lui Robert C. Martin. [CleanCodeMartin]
De asemenea un alt lucru care l-am învățat din experiență este faptul că orice aplicație trebuie să dețină un UX și un UI cât mai prietenos pentru utilizator. Un design bun al aplicației nu este suficient, însă dacă acel design este îmbrăcat cu un UX cât mai plăcut, atunci putem spune cu siguranță că utilizatorul nostru va petrece cu drag timpul în aplicația dezvoltată de noi. Pentru a crea un mediu cât mai plăcut și cât mai simplu de utilizat am ales să definesc următorii actori care fac parte din Social media text classifier, iar în cele ce urmează am să vii prezint.
3.1 Actors and USE CASES
Primul actor care face parte din aplicație este vizitatorul sau utilizatorul neînregistrat. Astfel ajungem la primul use case.
Vizitatorul are posibilitatea de a accesa pagina principală a site-ului și anume pagina de „Home” și pagina de „About” acolo unde poate citii o documentație despre utilitatea și utilizarea aplicației. Pentru a face acest lucru, utilizatorul trebuie doar să accese link-ul site-ului.
Vizitatorul poate de asemenea accesa si folosii componenta de sentiment analysis.
Precondiții: Textul inserat trebuie să fie în limba engleză.
Scenariul ideal:
Pentru a face acest lucru acest trebuie să aleagă din meniu din partea de sus a aplicației modulul inscripționat cu „Sentiment analysis” și de acolo din cele două opțiuni trebuie să aleagă „Use sentiment analysis.”
Utilizatorul neînregistrat accesează pagina, acolo unde îi apare posibilitatea de a insera un text și de a apăsa butonul de „submit”.
După introducerea textului și apăsarea butonul submit utilizatorul primește ca rezultat opinia componentei de sentiment analysis cu privire la textul inserat.
Excepții: Dacă textul inserat în câmpul respectiv este în altă limbă decât engleză, rezultatul este eronat.
O altă excepție poate fii o eroare din partea aplicației care nu reușește să ruleze algoritmul de sentiment analysis, astfel pe ecran va apărea o eroare prin care se comunică acest lucru utilizatorului.
Vizitatorul se poate înregistra.
Precondiții: Vizitatorul nu trebuie să dețină un cont în aplicație.
Scenariul ideal:
Pasul 1 este accesul paginii de înregistrare prin click pe butonul „Register”.
După care acesta are este nevoit să completeze câmpurile care i se cer, și anume câmpul cu username-ul dorit și parola cu care o să își acceseze contul ulterior, de asemenea el trebuie să reintroducă parola în câmpul de „confirmare parola”. După completarea câmpurilor acesta apăsa butonul „Register”. Aplicația face o cerere de înregistrare către baza de date, iar vizitatorul nostru primește status-ul de „Membru” sau „Utilizator înregistrat” .
Excepții: Utilizatorul deține un cont iar server-ul refuză înregistrarea acestuia, anunțând-ul printr-un mesaj pe ecran.
De asemenea este posibil ca parolele ce sunt introduse în câmpurile respective să nu coincidă, astfel apare un mesaj în care utilizatorul este avertizat de acest lucru.
Vizitatorul se poate loga în aplicație.
Precondiții: Vizitatorul nu este logat și este un membru înregistrat al aplicației.
Scenariul ideal: Acesta dă click pe butonul de „Log in”. Acesta are posibilitatea de a alege una din cele două opțiuni de logare, și anume logarea clasică în care este se introduc „username-ul” și parola, sau o autentificare prin intermediul aplicației externe „Facebook”. Acesta alege una din cele două posibilități și preia statusul de „Membru”.
Excepții: Server-ul aplicației refuză autentificarea deoarece datele introduse sunt greșite.
Server-ul refuză autentificarea deoarece acesta nu deține un cont în aplicația „Facebook”.
Aplicația externă nu răspunde cererii aplicației SMTC.
Membrul aplicației în primul rând moștenește toate use-case-urile utilizatorului neînregistrat.
Precondiții: Utilizatorul deține statusul de „membru”(utilizator înregistrat).
Scenariul ideal: Poate să îndeplinească toate sarcinile ce le poate face și vizitatorul aplicației, mai sus menționate.
Excepții: Una dintre excepțiile ce pot apărea la vizitator.
Membrul aplicației poate accesa meniul de „Settings sentiment analysis”.
Precondiții: Utilizatorul deține statusul de „membru”(utilizator înregistrat).
Scenariul ideal: Acesta poate selecta din meniul aferent pagina de „Settings” al componentei sentiment analysis. Odată ce a dat click acesta poate face modificările dorite și salva aceste modificări. Sistemul face o cerere de salvare a datelor în baza de date, iar într-un final datele sunt salvate.
Excepții: Server-ul refuză să salveze datele și intră într-o stare de eroare. Utilizatorul va afla acest lucru printr-un mesaj pe ecran.
Membrul aplicației poate accesa modulul de „Translate”.
Precondiții: Utilizatorul deține statusul de „membru”(utilizator înregistrat).
Scenariul ideal: Utilizatorul înregistrat al aplicației poate beneficia de accesul la pagina de translate. La apăsarea pe butonul din meniu, care este inscripționat cu „Use Google Translate API” va accesa pagina în care ii va apărea un câmp de tip input în care are posibilitatea să introducă textul care vrea să fie tradus. Odată introdus textul dorit de tradus, se poate apăsa butonul de submit, care va face o cerere către serviciul Google Translate API, iar acesta va întoarce un rezultat. Rezultatul va fi de forma, textul tradus și limba care a detectat-o.
Excepții: Serviciul extern Google translate API nu funcționează, iar cererea nu a putut fi satisfăcută.
Membrul aplicației SMTC are acces la pagina de „Settings Translate”.
Precondiții: Utilizatorul deține statusul de „membru”(utilizator înregistrat).
Scenariul ideal: Utilizatorul înregistrat poate să modifice setările serviciului API Google printr-un click pe butonul „Settings Google Translate API”, iar mai departe poate să facă modificările dorite, cum ar fi modificarea parametrilor de acces al serviciului. Odată apăsat butonul de „Submit”, se face o cerere de salvare către baza de date, a noilor setări.
Excepții: Baza de date nu răspunde cereri de salvare și returnează un mesaj de eroare, care îi va apărea utilizatorului pe ecran.
Utilizatorul înregistrat poate de asemenea accesa meniul de „Web Crawler”.
Precondiții: Utilizatorul deține statusul de „membru”(utilizator înregistrat).
Scenariul ideal: Acesta apasă pe butonul aferent din meniu, iar pagina web crawler-ului se deschide. Odată deschisă pagina are mai multe posibilități. În primul rând poate vizualiza site-urile care sunt în „trend” bazate pe ultima căutare făcută la o anumita data, care este afișata si ea in partea de jos. De asemenea el are posibilitatea să reactualizeze această lista de site-uri care sunt în vogă printr-un simplu click pe butonul „Refresh”. Odată dat click pe butonul de refresh după câteva momente, pe ecran vor apărea site-urile noi din căutarea Google. Un alt aspect este reprezentat de posibilitatea utilizatorului înregistrat de a face o căutare propriu zisă pe web, cu ajutorul web crawler-ului și pe baza cuvintelor definite. Odată apăsat butonul de „Start crawling” crawler-ul rulează algoritmul respectiv și returnează pe pagină de „Results”, rezultatele găsite. Rezultatele găsite sunt de forma: site-ul pe care a fost găsită informația, și bineînțeles textul care a fost găsit.
Excepții: Unul din site-urile pe care web crawler-ul vrea să le acceseze este offline.
Membrul aplicației SMTC poate accesa pagina de Settings a componentei „Web Crawler”.
Precondiții: Utilizatorul deține statusul de „membru”(utilizator înregistrat).
Scenariul ideal: Odată accesată această pagină prin click pe butonul din meniu care este notat cu „Settings web crawler”, utilizatorul nostru are următoarele opțiuni. Prima opțiune este definirea cuvintelor cheie. Să presupunem că utilizatorul vrea să adauge un nou cuvânt, acesta dă click pe butonul de „ADD”, după care se deschide o pagină în care este un input, iar odată textul inserat acesta poate să îl salveze. Sistemul face o cerere de salvare către baza de date iar noul cuvânt este salvat, iar utilizatorul este redirecționat către pagina de settings. De asemenea are posibilitatea să șteargă unul dintre cuvintele cheie definite printr-un simplu click pe semnul „X” din dreptul cuvântului dorit să fie șters. Dacă se dă click pe acel buton atunci sistemul va face o cerere de ștergere către baza de date, iar cuvântul va fi șters și pagina reactualizată.
O a doua posibilitate este definirea unor site-uri pe care Web crawler să înceapă căutarea. Definirea începe printr-un click pe butonul de „ADD” din dreptul meniul de sites, iar odată afișată pagina de adăugare, acesta poate să insereze url-ul dorit în interiorul unui input de tip textbox. După care se poate salva în baza de date, prin apăsarea butonul de submit. Sistemul face o cerere de salvare către baza de date iar noul cuvânt este salvat, iar utilizatorul este redirecționat către pagina de settings. De asemenea membrul are posibilitatea ștergerii unui url deja inserat prin click pe iconița de „junk” din dreptul url-ului dorit șters. Dacă se dă click pe acel buton atunci sistemul va face o cerere de ștergere către bază de date, iar url-ul va fi șters și pagina reactualizată. O a treia opțiune de pe această pagină este modificarea parametrilor web crawler-ului cum ar fii adâncimea și numărul de pagini simultane după care să caute. Odată modificați acești parametrii și click pe butonul de „Submit”, toate modificările făcute de acesta sunt salvate în baza de date. De asemenea acesta poate accesa meniul, să vizualizeze setările existente și să apese butonul de „Back”, iar acesta îl va redirecționa către pagina de „Home”.
Excepții: Baza de date nu răspunde cereri de salvare sau de ștergere și returnează un mesaj de eroare, care îi va apărea utilizatorului pe ecran.
Membrul site-ului nu introduce nimic în câmpul de url sau cuvinte cheie și apasă butonul de salvează. Atunci sistemul îl va atenționa cu un avertisment pe ecran.
Membrul aplicației poate accesa modulul principal din aplicație și anume SMTC care are rolul de a unii toate componentele.
Precondiții: Utilizatorul deține statusul de „membru”(utilizator înregistrat).
Scenariul ideal: Odată accesat meniul SMTC utilizatorul vizualizează un istoric cu ultimele căutări făcute după cuvintele cheie și url-urile definite în „web crawler”. Pe această pagină se pot vedea aceste căutări într-un format restrâns, însă în dreptul fiecărei căutări se regăsește un buton de detalii „details” sub forma unei iconițe de folder, care la click pe ea ne duce pe o pagină în care regăsim toate detaliile căutări, cum ar fii, cuvintele cheie și url-urile după care a fost făcută căutarea. De asemenea putem regăsi într-un tabel datele sub forma: text-ul care a fost găsit, link-ul către textul găsit, limba detectată de unealta de traducere și de asemenea traducerea in limba engleză a textului găsit. În ultima coloană regăsim textul analizat de componenta de sentiment analysis și în dreptul fiecărei propoziții regăsim atașat „sentimentul” care îl exprimă aceea propoziție. În partea de jos regăsim numărul rezultatelor găsite și data la care a fost făcută căutarea. De asemenea tot in partea de jos regăsim butonul de Email, care la apăsarea lui se va trimite un email către utilizator cu ceea ce se poate vizualiza în partea de sus. Membrul are posibilitatea să revină la meniul anterior prin apăsarea butonul de înapoi („Back”).
Întorcând-ne la pagina principală a modului SMTC regăsim o ultimă funcționalitate a acestuia și probabil cea mai importantă din aplicație și anume cea care unește toate componentele enumerate mai sus și ne oferă rezultatele sub forma dorita. Această funcționalitate se activează prin apăsarea butonului „New Search”. După ce modulele puse cap la cap obțin rezultatul, acesta este afișat pe ecran într-o pagină de „results” asemănătoare cu cea de details văzută mai sus, unde avem posibilitatea să trimitem un email cu rezultatele găsite și să salvăm în baza de date această căutare, pentru o vizualizare ulterioară. Aceste căutări se pot șterge prin apăsarea butonului din dreptul intrării dorite ștearsă. Utilizatorul se poate întoarce pe pagina principală a site-ului apăsând butonul de „Back”.
Excepții: Baza de date nu răspunde cereri de salvare sau de ștergere și returnează un mesaj de eroare, care îi va apărea utilizatorului pe ecran.
Unul dintre module nu funcționează conform parametrilor.
Nu există un email definit.
Serviciul de mail-ing de la Google nu funcționează.
Membrul aplicației are posibilitatea să accese pagina de settings al modului SMTC.
Precondiții: Utilizatorul deține statusul de „membru”(utilizator înregistrat).
Scenariul ideal: În pagina de settings acesta poate definii adresa de email la care să primească rezultatele găsite de aplicație. Odată introdusă adresa de email aceasta se poate salva printr-un click pe butonul „Submit”. Sistemul face o cerere de salvare către baza de date, iar datele sunt salvate. De asemenea utilizatorul înregistrat de poate întoarce la meniul anterior prin click pe butonul „Back”.
Excepții: Baza de date nu răspunde cereri de salvare și returnează un mesaj de eroare, care îi va apărea utilizatorului pe ecran.
Câmpul în care se poate introduce adresa de email este lăsat gol și apăsat butonul de salvează.
Emailul introdus nu este corect.
Membrul aplicației poate să accese meniul de „Manage account” și să facă modificări asupra contului deținut în aplicație.
Precondiții: Utilizatorul deține statusul de „membru”(utilizator înregistrat).
Scenariul ideal: Pagina de management a contului poate fi accesată prin click pe numele contului care apare sub meniu. Odată accesată pagina, acesta poate să își modifice parola, sau să adauge servicii externe de logare cum ar fii aplicația „Facebook”.
Excepții: Parola curentă introdusă nu este corectă.
Parola nouă introdusă nu este la fel cu cea din câmpul de „Confirm new password”.
Eroare la introducerea în baza de date a datelor.
Serviciul extern „Facebook” nu funcționează.
Membrul aplicației se poate deloga din aplicație.
Precondiții: Utilizatorul deține statusul de „membru”(utilizator înregistrat).
Scenariul ideal: Utilizatorul înregistrat dă click pe butonul de „Log off”, iar acesta își pierde statusul de „Membru” și devine vizitator.
Un alt actor al aplicație SMTC este reprezentat de Web Crawler care are rolul de a obține datele pe care utilizatorul le dorește. Datele găsite de el reprezintă input-ul aplicației.
3.2 Arhitectura aplicației
Ca prin pas în dezvoltarea aplicației am ales ca și mediu de dezvoltare una din soluțiile celebre ale companiei Microsoft și anume Visual Studio varianta din 2012. Am făcut această alegere deoarece oferă posibilitatea creării de aplicații WEB cât și aplicații Windows Forms. Am ales să merg pe partea de web deoarece în ultimi ani a avut loc o explozie de noi tehnologi și nu am avut posibilitatea să lucrez cu mare parte din ele, astfel acum am avut șansa să încerc o mare parte din ele și să le integrez într-o aplicație serioasă. De asemenea am ales partea de web deoarece studiile recente arată că tot mai mulți investitori, investesc în web și în dezvoltarea lui, și sper că în curând web-ul semantic să fie o realitate.
Calitatea aplicațiilor este influențată direct de arhitectura implementată acestora. O implementare precara a aspectelor arhitecturale conduc la un rezultat final în care aplicația are de suferit din punct de vedere al scalabilității, securității, performanței etc. Pe lângă constrângerile tehnice precum disponibilitatea serverelor web, serverele de aplicații utilizate sau integrarea sistemelor de moștenire, arhitecturile aplicațiilor web trebuie să ia în considerare și cadrul de lucru organizațional în care ele sunt incluse (de exemplu experiența arhitecților). Utilizarea unor arhitecturi multi-strat flexibile, tratarea conținutului multimedia și integrarea depozitelor de date existente sunt obligatorii pentru dezvoltarea arhitecturii aplicațiilor web.
Astfel am ales să aplic principiul de design Soc sau Separation of Concerns. Acest design pattern oferă posibilitatea de a împărții/separa aplicația ta în mai multe secțiuni, în care fiecare secțiune are un rol bine definit și adresează un anumit set de informații (concern). Un concern este un set de informații care afectează doar o parte de cod a programului. O aplicație care îmbrățișează această abordare este denumită o aplicație modulară. Modularitatea vine din încapsularea fiecare secțiuni. Încapsularea fiind procesul de ascundere a datelor într-o secțiune. Unul din mecanismele care aplică acest principiu, Soc, este numit MVC sau Model-View-Controller. MVC este un model arhitectural care separă funcționalitatea specifică domeniului pentru care este dezvoltat sistemul software de interfața grafică a aplicației, permițând dezvoltarea, întreținerea și testarea separată a celor două părți. În figura 1 este descris grafic modelul arhitectural MVC. Acesta are rolul de a împărții o aplicație în trei componente, și anume: model, view si controller.
Figura 3-1. Model arhitectural MVC [MSDNImg]
1. Modelul – are rolul de a gestiona datele aplicației, de a răspunde la interogări referitoare la starea View–ului și de a realiza operații de modificare a datelor, in principiu operații ce țin de controller .
În interiorul aplicației noastre modelul este reprezentat cu ajutorul unor clase care descriu obiecte ale realități sistemului care îl modelăm. Putem lua ca exemplu una din componentele aplicației, și anume cea de traducere. Modelul acestei componente ca de altfel toate modele aplicației îl putem găsi în directorul Models. Voi prezenta partea de settings a modelului nostru, care este reprezentat de clasa cu denumire de „TranslateApiSettingsModel”.
public class TranslateApiSettingsModel
{
public int Id { get; set; }
public int UserId { get; set; }
public string ApiKey { get; set; }
public string ApplicationName { get; set; }
public string TargetLanguageShortname { get; set; }
}
Primul aspect de remarcat asupra exemplului de mai sus este stilul de scriere a clasei și a membrilor ei, și anume am abordat, ca de altfel în tot proiectul un stil de scriere de tip „CamelCase”. Acest stil de scriere în opinia mea este unul foarte lizibil și ajută pe orice citește codul să înțeleagă mult mai repede ce se petrece în program.
Al doilea aspect relevant este cuvântul cu care se finalizează acesta clasă, și bineînțeles și restul claselor din directorul „Models” al aplicației, și anume cuvântul „Model”. Este relevant deoarece clarifică foarte mult rolul clasei într-un context să zicem ambiguu.
A treia remarcă este faptul că modelul nostru în esență este alcătuit din proprietăți de forma „getter” și „setter”, care au rolul de a seta câmpurile modelului și de a ne da posibilitatea de a primi informația ce se găsește la un anumit membru al clasei.
Membrii claselor model pot fi împărțiți în două categorii. Prima categorie este cea în care aceste proprietăți sunt relevante pentru utilizator. În exemplul de mai sus putem regăsi trei exemple de acest tip și anume: „ApiKey”, „ApplicationName” , „TargetLanguageShortname”.
Aceștia sunt relevanți pentru utilizator deoarece apar pe interfață, și pot fi manipulați să zicem într-un mod direct de către utilizator. A doua categorie este cea a proprietăților care sunt importante pentru back-end, pentru partea de business logic. Și aici putem da ca exemplu câmpul de Id, care nu are niciun sens pentru utilizator, însă pentru programator este poate cel mai important deoarece ulterior pe baza acestui câmp o să se poate face modificări sau adăugări ale unor setări de acest tip.
View-ul are rolul de a afișa modelul astfel încât utilizatorul să poată interacționa cu el, iar toate astea prin intermediul elementelor vizuale, cum ar fi tag-urile de HTML. În cazul aplicațiilor ASP.NET MVC view-urile sunt implementate sub forma unor fișiere care conțin un amestec de cod C# și HTML, bazate pe un motor de interfață nou apărut denumit Răzor.
Un alt aspect foarte important în cazul aplicațiilor ASP.NET este faptul că putem avea mai multe View-uri ce țin de un singur controller, astfel putem grupa codul sub același business logic. Un alt aspect este faptul că view-urile sunt grupate pe controller. Adică luând ca exemplu controller-ul „TranslateApiController”, acesta va caută după view-urile aferente lui doar în folderul din view’s ce ține de el și anume în folderul „TranslateApi”.
O altă componentă foarte importantă care este specifică ASP.NET MVC pe partea de view, este ceea ce se găsește în directorul „Shared”. Acest director este foarte important deoarece view-urile ce se găsesc în interiorul lui sunt privite ca și globale. Adică în acest director vom avea de exemplu structură paginilor noastre. Putem spune că este echivalentul lui MasterPage din ASP-ul clasic care avea același scop și anume să țină structura interfețelor aplicației.
Pentru a continua pe aceeași linie vom lua ca exemplu view-ul ce ține de componenta de traducere.
Figura 3-2 Constructia view-ului componentei Translate
Primul aspect important este chiar prima linie de cod unde regăsim simbolul „@” care are rolul de a marca începerea unei secvențe de cod de tip Razor. După care putem identifica asocierea view-ului cu modelul. Trebuie observat faptul că este specificată toată calea către model.
După care regăsim linia de cod „Layout = "~/Views/Shared/_Layout.cshtml” care are rolul de a specifica structura comună pe care o moștenește interfața noastră grafică.
În cele ce urmează avem definit un „Form” care prin metoda „Post” la apăsarea butonului submit va face o cerere către server de trimitere a datelor și bineînțeles elementele care permit vizualizarea și editarea conținutului modelului.
3. Controller – recepționează acțiunile utilizatorului și răspunde interogând modelul. Controller-ul trebuie derivat din clasa „Controller”. După cum o să vedem în exemplul ce urmează vom regăsi două metode care manipulează datele noastre.
Figura 3-3 Controller-ul componentei Translate
După cum se poate observa în Figura 1 avem metoda „SettingsTranslateAPI” care are rolul de a aduce pe interfață setările curente ale utilizatorului, asta în cazul în care are niște setări făcute, dacă nu introducem noi niște setări implicite.
De asemenea avem și metoda „SaveSettings”, este metoda care interceptează apelul „POST” al pagini și care are rolul de a face persistarea datelor în baza de date.
Acestea sunt cele trei componente ale modelului MVC, care împreună alcătuiesc o arhitectură ușor de manevrat și ușor de înțeles și care oferă posibilitatea dezvoltării unor aplicații complexe și totodată optime.
Toată arhitectura prezentată în rândurile anterioare mai are nevoie de o componenta fără de care, la o aplicație serioasă nu poate să lipsească, și anume bază de date.
Primul pas a fost alegerea unei tehnologii, iar alegerea mea a fost una dintre soluțiile Microsoft și anume MSSQL. După care a fost nevoie de instalarea unui sistem de management al bazelor de date, iar pentru asta am instalat SQL Server Management 2012. După instalarea mediului de lucru cu bază de date, am creat o bază de date și am făcut arhitectura ei. Unul din criteriile la care am ținut foarte mult în dezvoltarea bazei de date a fost normalizarea. Normalizarea sau eliminarea redundanței datelor este un principiu extrem de util în arhitectura unei baze de date și am pus-o pe primul loc la această sarcină.
După ce am avut baza de date, a fost nevoie de un liant între partea de cod și baza de date, iar pentru asta am ales una din componentele bibliotecii .NET și anume ADO. Prin intermediul pachetului de librării ADO.NET am reușit să mă conectez la baza de date foarte simplu. Primul pas este stabilirea unei conexiuni cu baza de date, iar acest lucru este realizat prin intermediul clasei „SqlConnection”, care primește ca parametru stringul de conexiune la baza de date.
private void ConnectToDatabase()
{
try
{
DatabaseConnection = new SqlConnection(DatabaseUtils.ConexiuneSql);
DatabaseConnection.Open();
}
catch (SqlException exception)
{
Console.WriteLine("Cannot connect to database! exception:" + exception.Message);
foreach (SqlError error in exception.Errors)
{
Console.WriteLine(error.Message);
}
}
}
Conexiunea cu baza de date este o parte fragilă în orice aplicație, de aceea trebuie manipulată foarte bine. În acest scop am aplicat un pattern cunoscut și anume Singleton, care îmi oferă posibilitatea menținerii unei singure conexiuni deschise cu baza de date, și ori de câte ori aș avea nevoie să deschid o nouă conexiune, o să o folosesc pe cea inițială, astfel eliminând traficul cu baza de date.
După ce a fost stabilită conexiunea nu ne rămâne altceva de făcut decât să ne scriem comanda în limbaj SQL și să o punem într-un string, iar prin intermediul lui ADO și al claselor sale, avem posibilitatea să executăm acele comenzi printr-o simplă pasare ca și parametru a șirului de caractere care reprezintă comanda SQL, la o clasă de tipul SQLCommand. După închiderea sesiunii de lucru se închide și conexiunea cu baza de date.
Pentru a păstra o claritate cât mai mare în cod, am mai introdus un pattern cunoscut și anume repository pattern.
Figura 3-4. Repository Pattern [MSDNRepoPattern]
La ce ma ajutat acest pattern? Răspunsul la întrebare este foarte simplu și se poate vedea chiar din imaginea de mai sus. În primul rând avem dreptunghiul care reprezintă baza noastră de date. Noi facem cereri către baza de date de citire și scriere de date. Modelul MVC lucrează cu obiecte ale realități, însă în baza de date noi avem datele reprezentate sub formă de tabele, astfel a fost nevoie de introducere acelui „data mapper” care nu este altceva decât un ORM (Object-relațional mapping). Astfel noi mapăm tabele din baza de date unde păstrăm anumite principii cum ar fi normalizarea, pe modelele din bussines logic-ul de la nivelul codului. Astfel am introdus layer-ul de „Servicii” care are rolul de a mapa aceste obiecte, de a citii din baza de date și de a scrie modele în baza de date, practic de a persista datele.
După salvarea datelor avem acces la ele ori de cate ori este nevoie, printr-o simpla interogare.
3.3 Detalii de implementare
3.3.1 Introducere
În construirea structuri aplicației am urmărit ca fiecare componentă care o adaug să fie într-un procent cât mai mare independentă, adică dacă ulterior mă hotărăsc că vreau să implementez ceva mai bun sau am găsit un API mult mai bine făcut, care îndeplinește aceeași funcție, acea componentă să poată fi înlocuită fără probleme de compatibilitate sau să existe dependențe de celelalte module care să împiedice schimbarea sau modificarea acesteia.
Astfel am structurat aplicația în 4 componente.
Figura 3-5. Structura aplicației, și componentele care fac parte din ea.
Cele trei componente mari: web crawler, sentiment analysis și translate API funcționează independent una de cealaltă putând fi schimbate foarte ușor. Componenta denumită generic „process” este cea care unește cele trei componente și face ca soft-ul să fie unitar. Această parte a aplicației constituie partea de interfață cu utilizatorul și oferă o fereastră către engine-urile prezentate mai sus. În partea dreaptă este reprezentat output-ul aplicației și anume rezultatul împachetat sub forma unui Email către utilizatorul final.
3.3.2 Logare & Înregistrare
Pentru a putea beneficia de întreaga aplicație la potențialul maxim un vizitator trebuie să se înregistreze pentru a deveni membru a aplicației. Modul de înregistrare am urmărit să fie unul cât mai simplu și cât mai ușor de folosit.
Figura 3-6. Interfata cu utilizatorul a modului de autentificare
După cum se poate observa în imaginea de mai sus crearea unui cont constă în completarea a trei câmpuri, și anume câmpul de username, un câmp de parolă și al treilea câmp este reprezentat de reconfirmarea parolei mai sus scrisă. Apoi dacă se trece de validare vizitatorul nostru primește statusul de Membru și este logat.
Pe partea de coding am încercat să păstrez autentificarea cât mai simplă, astfel cum se poate vedea în imaginea de mai jos, dacă modelul este valid, adică a trecut de toate validările, atunci prin apelul metodei „CreateUserAndAccount” pasându-i username și parola, utilizatorul nostru este înregistrat, iar mai apoi apelăm și metoda de „Login” care are rolul să îl autentifice în aplicație.
Figura 3-7. Functia „Register”
Logarea sau autentificarea în aplicație se poate face în două moduri.
Figura 3-8. GUI pentru componenta de logare
Primul mod după cum se poate vedea și în imaginea de mai sus în partea stângă, avem modul de autentificare clasic, în care utilizatorul completează datele menționate în modulul de înregistrare și la apăsarea butonului de Login, dacă datele sunt corecte acesta va fii logat în aplicație.
Al doilea mod de autentificare în aplicație este prin intermediul unui intermediar, și acest intermediar în cazul nostru este bine-cunoscutul Facebook. Am ales să adaug autentificarea prin Facebook deoarece foarte multă lume are un cont în aplicația asta, iar modul acesta oferă comoditate utilizatorului.
Primul pas în implementarea modului de autentificare prin Facebook a fost să mă înregistrez pe platforma de dezvoltare oferită de Facebook. După care am înregistrat aplicația mea pe această platformă. După ce am înregistrat aplicația, mi-au fost date două key-uri. Una dintre ele este ID-ul aplicației mele, iar a doua este un șir de caractere care cei de la Facebook îl denumesc „App secret”. După ce am primit aceste două chei m-am întors la aplicația mea. După cum spuneam mai sus aplicația este dezvoltată în ASP.NET MVC 4, iar în această versiune există clasa „OAuthWebSecurity” , aceasta fiind un API, care primește ca și parametri cele două chei primite de la Facebook.
OAuthWebSecurity.RegisterFacebookClient(
appId: "1058291110898023",
appSecret: "301aabff86dfb646e88af1988b07944e");
Printr-un apel de forma de mai sus a metodei „RegisterFacebookClient” îi spunem API-ului că vrem o autentificare prin Facebook, și că acelea sunt credențialele aplicației noastre.
După care continuăm să ne folosim de clasa „OAuthWebSecurity” în felul următor. În cazul în care utilizatorul nostru este la prima autentificare prin Facebook atunci pe lângă faptul că o să se autentifice în aplicația noastră, dar o să i se și creeze un cont pe baza credentialelor primite de la Facebook. Dacă nu este la prima autentificare cu Facebook atunci el va fii direct autentificat în aplicația noastră prin verificarea datelor de la Facebook. Această verificare este făcută bineînțeles prin API-ul „OAuthWebSecurity”.
Odată autentificat, Membrul aplicației are posibilitatea să își administreze tipurile de autentificări. Adică dacă s-a înregistrat prin intermediul Facebook, atunci setând prima dată o parolă, poate să își elimine modul de autentificare extern. De asemenea are posibilitatea adăugării unui mod de autentificare extern toate acestea din interiorul meniului de „Administrare Cont”.
3.3.3 Web crawler
Web crawler-url este probabil cea mai importantă componentă a aplicației mele. De ce? Răspunsul este foarte simplu, pentru că datele obținute de această componentă reprezintă input-ul aplicației, reprezintă datele cu care o să lucrează toate celelalte module, datele care urmează a fi, după o procesare, livrate către utilizatorul final, din această cauză, îl plasează ca și importanță pe primul loc.
Web crawler-ul este folosit de două dintre modulele aplicației mele.
Primul modul care folosește bot-ul de căutare web, este denumit generic „Trending Sites”. Acest modul are rolul de a căuta pe un motor de căutare, site-urile care sunt în ascensiune/trend pe baza cuvintelor cheie definite de utilizator.
Pentru implementarea acestei sarcini am apelat la două din clasele bibliotecii .NET si anume: „HTTPWebRequest” și „HTTPWebResponse”.
În primul rând având cuvântul după care vreau să caut stocat într-un string, mi-am definit un alt șir de caractere care are forma următoare:
string searchResults = "http://google.com/search?q=" + textForSearch.Trim();
După obținerea string-ului „searchResults” nu am avut altceva de făcut decât să creez un WebRequest pe baza acelui șir de caractere.
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(searchResults);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Cu ajutorul acelui WebRequest/cerere web am obținut un răspuns, pe care l-am stocat într-un obiect de tip HttpWebResponse. După care din obiectul response mi-am extras un stream
Stream resStream = response.GetResponseStream();
Iar cu ajutorul acestui stream, prin transformarea lui într-un string, am ajuns la ceea ce m-ă interesa, și anume conținutul paginii respective.
După obținerea conținutului paginii am trecut la partea de extracție a informației din pagină. La această sarcină mă ajutat pachetul HtmlAgilityPack care conține un set foarte util de metode care ajută la parcurgerea și extragerea informațiilor din conținutul unei pagini web.
Astfel am încărcat acel string într-un obiect HtmlDocument după cum se poate vedea în linia de cod de mai jos:
HtmlAgilityPack.HtmlDocument html = new HtmlAgilityPack.HtmlDocument();
html.LoadHtml(sbb);
Informația care mă interesează în cadrul acestui modul este obținerea link-urilor de pe pagină, astfel printr-o simplă parcurgere a tag-urilor existente pe pagină, de forma:
Figura 3-9. Parcurgere a tag-urilor unei pagini HTML cu ajutorul HTMLAgilityPack
am obținut link-urile care mă interesau. După cum se poate vedea în imaginea de mai sus, a mai fost nevoie de niște filtrări suplimentare deoarece căutarea pe motorul de căutare folosit în această versiune a aplicației mele, este Google, iar Google, pe lângă rezultatul dorit afișează pe pagina de rezultate și anumite rezultate nedorite de noi, astfel a trebuit să fac niște filtrări suplimentare. După care împachetez rezultatul într-o listă și o trimit către modul principal unde urmează a fi afișată utilizatorului.
Al doilea modul în care a fost nevoie de web crawler constituie nucleul aplicației, deoarece această parte a aplicației are rolul de a obține cele mai utilizate date de către celelalte module.
În primul rând utilizatorul trebuie să definească o lista de cuvinte cheie după care agentul nostru să caute pe web. După ce a completat cuvintele cheie, trebuie să își definească lista de „seeds” (site-uri de la care bot-ul web să plece în căutare).
Figura 3-10. Pagina de setări a web crawler-ului
După cum se poate vedea și în imaginea de mai sus aceste liste sunt primele în setările web crawler-ului nostru.
De asemenea aș vrea să mai mă opresc asupra unei parametru foarte important, și anume Depth sau adâncimea. Acest parametru este relevant pentru agentul nostru deoarece îi specifică cât de mult să înainteze în interiorul unui site. Exemplu: dacă avem setată adâncimea „0” , atunci el va merge doar pe pagina principală a fiecărui url din lista de seeds, altfel dacă avem adâncime „1” atunci agentul va accesa toate url-urile care le găsește pe pagina principală a site-urilor date în lista de seeds și le va parcurge inclusiv pe acelea.
Sarcina noastră a fost găsirea url-urilor de pe o pagină de seed, parcurgerea lor și găsirea textelor pe baza unor cuvinte cheie.
Astfel am împărțit această sarcină în două subsarcini și anume găsirea tuturor url-urilor de pe o pagină, iar a două a fost găsirea textelor din aceea pagină.
Prima sarcină a fost destul de ușor de rezolvat deoarece a fost adaptarea algoritmului de la „trending sites”.
Însă a apărut totuși o problemă la această sarcină și anume anumite url-uri erau duplicate. În prima fază m-am gândit să rezolv prin intermediul unui algoritm această problemă, însă a fost mai simplu prin schimbarea structurii de date cu care lucram. Mai exact am schimbat structura de date inițială, care consta într-o listă, într-un HashSet. HashSet-ul având proprietatea de a nu păstra duplicatele, lucru care ma ajutat să rezolv aceasta problema repede. Un al doilea aspect care mi-a pus probleme a fost filtrarea din pagină doar a url-urilor utile. Ce înțeleg prin url-uri utile? În primul rând în pagina sursă a unui site putem găsii de la ancore interne până la reclame către alte site-uri. Acestea nu sunt site-uri utile și ne pun probleme în crawling-ul lor și bineînțeles sunt inutile. Astfel am introdus două filtrări suplimentare: prima filtrare este bazată pe Regex, și anume are rolul de a îmi păstra toate url-urile de pe o pagină, și a doua a fost să țin doar URL-urile care încep cu denumirea site-ului din lista de seeds. Ca exemplu: dacă avem în lista de seeds site-ul www.ulbsibiu.ro, atunci noi vom face crawling doar pe url-urile care încep cu aceea adresă: http://www.ulbsibiu.ro/ro/despre_ulbs/, http://www.ulbsibiu.ro/ro/admitere/ , etc. Atfel eliminăm problema reclamelor și a altor site-uri care nu ne interesează.
A doua sarcină a fost găsirea textelor care conțin anumite cuvinte cheie. Această sarcină a fost mai dificilă deoarece trebuia să găsesc o modalitate să extrag tot conținutul unui element pe baza unui cuvânt căutat.
Ca urmare am apelat la HtmlAgilityPack.
Figura 3-11. Căutare in codul sursa al unei pagini WEB
După cum se poate vedea în imaginea de mai sus HtmlAgilityPack oferă posibilitatea căutării și extragerii de informație dintr-o pagină web ușor. Am parcurs toată lista de cuvinte pe care utilizatorul nostru a introdus-o iar mai apoi pe baza secvenței doc.DocumentNode.SelectNodes(), am selectat toate nodurile (tag-urile) care conțin textul căutat de mine. În momentul în care găseam un nod, îl adăugăm într-o listă de noduri.
Aceea listă de noduri urmează să o procesez, și anume să o parcurg și să extrag din ea textele care mă interesează, să o împachetez într-o structură de date și să o trimit către modulul care afișează date.
Un alt detaliu de care am ținut cont este posibilitatea găsirii textelor duplicate. Această problemă am rezolvat-o prin verificarea în prealabil adăugării în lista de rezultate, dacă textul găsit există deja, acest detaliu l-am rezolvat prin intermediu metodei „Contains” oferită de către LINQ.
Rezultatul l-am împachetat sub forma unei liste de obiecte, în care un obiect este format din url-ul în care am găsit text-ul și bineînțeles textul găsit.
3.3.4 Sentiment analysis
Sentiment analysis este componenta care își „exprima opinia” cu privire la un text dat. Pentru aceasta am ales să aduc în aplicația mea pachetul celor de la Stanford, și anume NLP. Acest lucru l-am realizat prin intermediul unei unelte oferite de Visual Studio 2012 și anume NuGET, care oferă posibilitatea de a include în aplicația ta, pachete „third part” foarte ușor. După instalarea pachetului NLP, adică adăugarea de referințe, am descărcat de pe site-ul lor modelul gata antrenat pentru limba engleză.
Primul pas în implementare a fost setarea path-ului (calea) către modelul salvat. După care am setat o listă de adnotatori, cu ajutorul cărora am comunicat pachetului ce vrem să proceseze și ce rezultat se ne returneze.
Figura 3-12. Inițializare modul analiza sentimentala
Următorul pas a fost instanțierea StanfordCoreNLP cu proprietățile mai sus menționate.
Acest modul l-am creat sub pattern-ul de Singletone, deoarece nu avem nevoie de mai multe instanțe de analiză sentimentală. O putem refolosi pe aceeași, pasându-i parametrii doriți. Astfel am economisit memorie și timp de încărcare deoarece aceea încărcare de modele durează aproape un minut (depinde de sistem) și aproximativ 400 MB în memorie.
Pentru a realiza analiza sentimentala am realizat următorul algoritm.
Figura 3-13. Algoritm pentru folosirea API-ului NLP de la Stanford
Metoda „GetSentimentByText” primește ca și parametru textul care trebuie analizat, și prin apelul metodei „Annotation” dăm comanda motorului NLP să ne facă analiza textului care l-am pasat ca parametru. După care primim ca rezultat propozițiile și analiza lor, pe care o stocăm într-o structură de date, mai exact un Tuple.
Rezultatul obținut îl pasăm către modulul apelant pentru afișare sau prelucrare ulterioară.
3.3.5 Google Translate API
Google Translate API este un serviciu oferit parțial gratuit de către cei de la Google care oferă posibilitatea traducerii și detectării unui text dintr-o limbă sursă într-o limbă destinație.
În primul rând aș vrea să va spun de ce am avut nevoie de un astfel de serviciu. Am avut nevoie de un astfel de serviciu deoarece în momentul de față pachetul NLP oferit de universitatea din Stanford poate face analiză sentimentală doar asupra textelor din limba engleză.
Ideea a fost să creez o aplicație cât mai dinamică și cât se poate de scalabilă, dacă mă opream la limba engleză, ca și analiză sentimentală, eram destul de limitat. Astfel am hotărât împreună cu tutorele meu să adăugăm un liant între modulul de analiză sentimentală și web crawler, care după cum v-am spus mai sus reprezintă input-ul aplicație, un modul care să traducă textele găsite de crawler, în limba engleză pentru a putea face analiza sentimentală.
Astfel ne-am hotărât să apelăm la probabil cel mai dezvoltat serviciu de traducere la ora actuală, și anume serviciul oferit de echipa Google.
Primul pas în implementarea lui a fost crearea unui cont pe platforma Google Developers. După crearea contului am înregistrat aplicația dezvoltată de mine, iar ei mi-au oferit un mijoc de autentificare prin care pot folosii acest serviciu.
Acest mijloc de autentificare este reprezentat de două chei pe care trebuie să le setez în momentul în care fac o cerere către serviciu Google. Aceste chei sunt unice pentru fiecare aplicație înregistrată.
Figura 3-14. Autentificare API Google Translate
După cum se poate vedea mai sus, am creat un serviciu care pe baza credentialelor se conectează la serviciul de traducere Google.
Am setat limba destinație în care vreau rezultatul și mi-am pregătit variabilele pentru stocarea răspunsului.
Un aspect care trebuie menționat este faptul că apelul către funcțiile API oferite de Google te obligă să faci apeluri asincrone, lucru care ajută aplicația ta să nu se blocheze în momentul în care așteaptă după un rezultat. Acest lucru este realizat prin crearea unui obiect de tip Task și prin menționarea cuvântului „async” în momentul implementării funcției. De asemenea trebuie menționat în momentul în care se face apelul funcției asincron cuvântul cheie „await”.
După ce am primit rezultatul care este reprezentat de textul tradus în limba engleză și limba sursă detectată, îl stocăm într-o structură de date și îl pasăm către modulul apelant pentru afișarea rezultatului sau pentru procesarea ulterioară a acestuia.
3.3.6 SMTC
SMTC este denumirea generică cu care am denumit modulul care are rolul de reunii cele trei module enunțate mai sus. SMTC reprezintă acronimul pentru Social media text classifier care este numele aplicației dezvoltate de mine, și acest modul nu este altceva decât interfața grafică cu utilizatorul.
Dacă până acum toate modulele descrise erau practic niște motoare de procesare a datelor, acest modul este fereastra cu utilizatorul. Aici utilizatorul are posibilitatea să facă din browser-ul dorit setările pentru celelalte module și să le folosească atât individual cât și la un loc.
Figura 3-15. Meniul aplicației SMTC
Am încercat ca în acest modul să mă rup de partea de algoritmică și să pun accentul pe design și pe interfață. Am vrut ca utilizatorul aplicației să aibe o experiență cât mai plăcută în momentul folosirii ei. Am dorit că interfața (UI) să fie cât mai plăcută și cât mai ușor de folosit.
Figura 3-16. Pagina de căutare si vizualizare rezultate SMTC
Astfel am folosit îmbinarea de HTML, CSS și puțin JavaScript să ofer utilizatorului un ambient cât mai plăcut.
Însă acest modul mai are un rol pe lângă cel de interfață cu utilizatorul, și anume de a face apelul către celelalte module și de procesa secvențial rezultatele primite de la fiecare modul în parte. După primirea unui rezultat de la web crawler SMTC are rolul de a face apelul către Google Translate API pentru a traduce textul în limba engleză.
Figura 3-17. Apelul iterativ al componentelor aplicației
După primirea rezultatului de la serviciul Google, acesta este pasat mai departe către componenta de analiză sentimentală. După ce sa făcut analiza sentimentală a textului, acesta fie este afișat pe ecran utilizatorului fie este salvat în baza de date pentru o vizualizare ulterioară.
Figura 3-18. Pagina de vizualizare rezultate
3.3.7 EMAIL
Ultima funcționalitate care vreau să v-o prezint este cea de Email. Această funcționalitate permite utilizatorului să primească rezultatele procesate de aplicația noastră printr-un mail în timp real.
Figura 3-18. Funcția de trimitere a unui e-mail
Primul pas este setarea email-ului care va fii salvat in baza de date.
Pasul următor a constat în crearea unei funcții care trimite mail. Pentru aceasta am avut nevoie de un provider de mail care să mă ajute să trimit aceste mesaje. Astfel am ales o altă soluție Google și anume Gmail. Am setat parametri pentru conexiunea la server-ul google, cum ar fii host, port și bineînțeles credentialele celui care trimite mesajul.După care am decis să împachetez rezultatul într-un mod cât mai plăcut pentru utilizator.
Astfel am hotărât ca în corpul email-ului să construiesc un tabel care va fi afișat în momentul în care utilizatorul îl va citii.
CAPITOLUL 4. REZULTATE
Prin rularea aplicației pe o serie de subiecte de interes a fost salvata o baze de date cu peste 400000 de înregistrări. Prin intermediul acestora am obținut o serie de rezultate interesante care vor fi prezentate in secțiunea următoare.
Mai departe vom prezenta câteva cuvinte cheie după care am făcut căutarea si salvarea datelor si o parte din rezultatele care pot fi extrase din acestea.
4.1 Cuvântul cheie Romania
Primul cuvânt cheie sau mai bine zis „hashtag” după care am căutat a fost „Romania”.
In figura 4-6 de mai jos avem primele rezultate, si anume numărul tweet-urilor în funcție de limba in care au fost postate:
Figura 4-6. Clasificare a tweet-urilor în funcție de limba în care au fost postate
Rezultate care le-am obținut au fost surprinzătoare, pentru ca ne-am așteptat ca majoritatea textelor pe care le găsim sa fie in limba romana si o mica parte din ele sa fie in limba engleza.
Însă după cum se poate vedea in tabelul de mai sus majoritatea textelor au fost in limba engleza si anume mai bine de 100000 din cele 200000 asta însemnând mai mult de 50%.
Figura 4-7. Grafic clasificare a tweet-urilor în funcție de limba în care au fost postate
Un număr impresionant de mic si anume 2659 de postări au fost făcute in limba romana. Putem constata faptul ca undeva la 10% din postările care circula pe twetter si au cuvântul cheie „Romania” sunt in limba romana.
Figura 4-8. Clasificare a tweet-urilor in functie de locatia din care au fost postate
In legătura cu locația din care au fost postate aceste tweet-uri putem observa faptul ca o foarte mare parte din ele nu au definita locația din care a fost făcută postare. Un lucru care trebuie precizat este faptul ca utilizatorului aplicației Tweeter are posibilitatea de a refuza sa furnizeze locația din care se face postul.
Figura 4-8. Clasificare a tweet-urilor în funcție de locația din care au fost postate
Un alt aspect care ne-a atras atenția a fost faptul ca, a doua în lista de locații nu este Romania, ci Japonia, Romania fiind pe locul al treilea in acest clasament.
Din păcate nu am reușit sa facem o clasificare sentimentala a acestor tweet-uri deoarece majoritatea erau reclame si link-uri către alte site-uri.
4.2 Cuvântul cheie Știri
Pe lângă cuvântul cheie „Romania” am decis sa adunam date despre cuvântul cheie „Știri”. Iată ce am descoperit in perioada in care am adunat date:
In primul rând se poate observa din graficul 4-1 ca limba predominanta in care se postează, după cum ne așteptam este limba romana. Însă nu foarte departe este limba italiana, spaniola si franceza care au un număr impresionant de posturi cu acest cuvânt cheie.
Figura 4-1. Limba în care au fost publicate tweet-urile
Un alt lucru care a fost observat a fost faptul ca utilizatorii aplicației Twitter pe lângă cuvântul „stiri” sau mai bine zis „#stiri” adaugă într-un număr foarte mare adaugă cuvântul echivalent lui in alta limba, de exemplu pentru știri un număr foarte mare adaugă si „#news”.
Legat de locația din care se postează se pot trage destul de puține concluzii deoarece acest câmp este completat manual de către utilizatori, astfel aceștia au dreptul de a adaugă ce vor in acel câmp.
Figura 4-2. Locația din care s-a postat Tweet-ul
După cum se poate observa in figura 4-2 majoritatea care au postat cuvântul cheie „stiri” au completat la locație „Romania” si orașe ale României. Însă putem vedea un număr destul de mare de oameni care lasă câmpul gol sau chiar îl completează greșit, introducând chiar cuvântul cheie.
Un alt aspect care as vrea sa îl precizez este faptul ca la fel ca si in cazul cuvântului „Romania” a fost nevoie de o filtrare a textului obținut. A fost nevoie de aceasta filtrare deoarece acest text pe lângă faptul ca, conține link-uri, care reprezintă nimic altceva decât reclame, dar regăsim si texte care nu au niciun sens pentru un analizator. Astfel am fost nevoiți sa aruncam undeva la 1-2% din datele obținute deoarece acestea nu reprezentau date utile ci erau doar niște link-uri.
Figura 4-3. Tabel in care regăsim numărul de tweet-uri analizate sentimental
Figura 4-4. Grafic in care putem vizualiza analiza sentimentala a textelor găsite pe baza cuvântului cheie „stiri”
După cum putem observa se pare ca majoritatea postărilor in care regăsim cuvântul cheie „stiri” transmit o stare negativa cititorului despre acel text.
Figura 4-5. Grafic in care putem vizualiza analiza sentimentala a textelor găsite pe baza cuvântului cheie „stiri in procente”
Mai mult de 57 % din aceste postări au o tenta negativa, si doar 10 % dintre acestea sunt pozitive. Un număr foarte mic dintre acestea transmit o stare foarte pozitiva sau foarte negativa, mai puțin de 1%.
Ca o concluzie inițiala, ar trebui ca aplicația sa realizeze o filtrare a acestor tipuri de mesaje, ele reprezentând de fapt zgomot in contextul clasificării din perspectiva sentimentelor utilizatorului.
CAPITOLUL 5. CONCLUZII ȘI DEZVOLTARI ULTERIOARE
Am reușit dezvoltarea unei aplicații construite din module independente care puse împreună dau valoare aplicației. Astfel am reușit dezvoltarea modului de Web crawler care poate fi programat de utilizator din interfață pentru a deservi acțiunilor dorite de el, totodată am reușit punerea împreună a două API-uri valoroase și anume Google Translate și NLP Stanford, care oferă o analiză automată cu privire la informația subiectivă extrasă dintr-un text, pentru utilizatorul aplicației. De asemenea am implementat componenta care are rolul de a informa în cel mai scurt timp utilizatorul, prin împachetarea rezultatului și trimiterea unui email către acesta.
Unul din obiectivele lucrării a mai fost realizarea unui UX și UI cât mai bun, astfel am plecat de la implementarea unei autentificări cât mai ușoare pentru utilizator și am realizat autentificarea prin intermediul aplicației externe Facebook și bineînțeles autentificarea clasică în care utilizatorul completează trei câmpuri și se autentifica în aplicație. De asemenea interfața aplicației este una simplă, în care utilizatorul pentru a naviga în aplicație trebuie doar să acceseze link-urile din meniu. Astfel am reușit să creăm un mediu cât mai plăcut de lucru pentru utilizator și bineînțeles cât mai ușor de folosit.
Cu toate ca am reușit sa folosim aplicația pentru a obține un număr relativ mare de înregistrări pe baza cărora am reușit sa extragem anumite informații, componenta care ar fi folosit aceste date pentru a face predicții nu am reușit sa o implementam in aceasta versiune.
În concluzie am reușit dezvoltarea unei aplicații software care oferă utilizatorului posibilitatea de a supraveghea activitatea mass-media în ceea ce îl privește și de a îi oferi un feedback în tip real/timp util cu privire la starea emoțională transmisă cititorului, de documentul respectiv.
Din punct de vedere al dezvoltărilor ulterioare această aplicație poate fi dezvoltată și îmbunătățită în foarte multe direcții. După cum am spus anterior în document aplicația este modulară, astfel putem înlocui fiecare modul fără să stricăm întregul.
În primul rând putem îmbunătății sistemul de analiză sentimentală, prin introducerea unui modul tot din domeniul inteligenței artificiale, care se intitulează Word Sense Disambiguation, care ar „ajuta” modul de sentiment analysis să „înțeleagă” mai bine contextul cuvântului pentru o analiză mai relevantă. De asemenea pentru a crește șansele de a analiza corect fraza mai putem introduce un alt analizator separat de cel de la NLP, de exemplu NLTK, care să facă o verificare suplimentară a rezultatului final. O altă metodă prin care putem îmbunătății modul de sentiment analysis este prin eliminarea componentei secundare de Translate, care ne poate altera rezultatul, și producerea unui „corpus” în limba română. Odată ce avem acest set de date putem antrena algoritmul de analiză sentimentală pentru limba română, ceea ce probabil ar produce rezultate mai bune decât varianta actuală în care se traduce textul si apoi este analizat.
În al doilea rând se pot aduce foarte multe optimizări pe partea de web crawler. Una dintre aceste optimizări constă în introducerea multithread-ingului la nivelul numărului de pagini simultane după care se caută. De asemenea o altă îmbunătățire ar fi plasarea modului de web crawler pe un server iar acesta să funcționeze în regim de daemon.
O altă îmbunătățire care se poate aduce aplicației este introducerea funcționalității de „căutare” pe site-urile de socializare cum ar fi Facebook și Twitter. După ce studiat problemă am constatat că printr-un web crawling clasic nu putem obține date relevante de pe aceste site-uri. Însă nu m-am oprit aici cu studiu, și ulterior am aflat faptul că aceste platforme de socializare oferă către dezvoltatori niște funcții API prin care poți obține anumite date care te interesează. Astfel introducerea unui modul care să folosească aceste API-uri ar aduce o valoare în plus aplicației.
În prezent există, pe lângă cele prezentate în lucrare, încă 2 module în versiune de test care permit obținerea de rezultate de pe platformele Twitter și Facebook.
Nu în ultimul rând se poate introduce un al doilea mod de avertizarea a utilizatorul cu privire la activitatea din mass-media în ceea ce îl privește, pe lângă cel implementat deja EMAIL, prin intermediul unui text scris primit pe telefonul mobil / SMS.
Aplicația si o parte din rezultate au fost prezentate la conferința „The 7th INTERNATIONAL CONFERENCE on Information Science and Information Literacy” în luna aprilie a acestui an [Pitic&Ghena, 2016].
BIBLIOGRAFIE
[WikiIDE]~https://en.wikipedia.org/wiki/Microsoft_Visual_Studio
[WikiC#]~https://en.wikipedia.org/wiki/C_Sharp_(programming_language)
[WikiAsp.NETMVC]~https://en.wikipedia.org/wiki/ASP.NET_MVC
[W3SAspMVC]~http://www.w3schools.com/aspnet/mvc_intro.asp
[MSDNAspMVC]~https://msdn.microsoft.com/en-us/library/dd381412(v=vs.108).aspx
[WikiDB]~https://en.wikipedia.org/wiki/Microsoft_SQL_Server
[W3SPic]~http://www.w3schools.com/aspnet/mvc_intro.asp
[AB&ANDB]~http://www.alexandru.butean.com/databases/
[MsdnADO]~https://msdn.microsoft.com/en-us/library/h43ks021(v=vs.110).aspx
[ASPRazor]~https://en.wikipedia.org/wiki/ASP.NET_Razor
[WikiHTML]~https://ro.wikipedia.org/wiki/HyperText_Markup_Language
[WikiCSS]~https://ro.wikipedia.org/wiki/Cascading_Style_Sheets
[WikiJS]~https://ro.wikipedia.org/wiki/JavaScript
[WikiLINQ]~https://en.wikipedia.org/wiki/Language_Integrated_Query
[WikiGIT]~https://en.wikipedia.org/wiki/Git_(software)
[Volovici97]~Daniel Volovici, Inteligență artificială și sisteme expert, Editura Universității din Sibiu, 1997
[WikiAI]~https://en.wikipedia.org/wiki/Artificial_intelligence
[WikiSA]~https://en.wikipedia.org/wiki/Sentiment_analysis
[Mullen]~http://lct-master.org/files/MullenSentimentCourseSlides.pdf
[Lexa]~https://www.lexalytics.com/technology/sentiment
[WikiNLP]~https://en.wikipedia.org/wiki/Natural_language_processing
[NLPSta]~http://nlp.stanford.edu/sentiment/
[NLPPaper]~http://nlp.stanford.edu/~socherr/EMNLP2013_RNTN.pdf
[WikiWC]~https://en.wikipedia.org/wiki/Web_crawler
[TheArling]~http://www.thearling.com/text/dmwhite/dmwhite.htm
[WikiTM]~https://en.wikipedia.org/wiki/Text_mining
[WikiMT]~https://en.wikipedia.org/wiki/Machine_translation
[CleanCodeMartin]~ Robert C. Martin, Clean Code A Handbook of Agile Software Craftsmanship Publisher: Prentice Hall; 1 edition (August 11, 2008)
[MSDNImg]~https://msdn.microsoft.com/en-us/library/dd381412(v=vs.108).aspx
[MSDNRepoPattern]~https://msdn.microsoft.com/en-us/library/ff649690.aspx
[Pitic&Ghena, 2016]~http://bcu.ulbsibiu.ro/conference/index.html
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Clasificarea Textelor ÎN Social Media (ID: 111636)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
