64x64
Hakan Shehu
Themelues i Papirusit
12 Shkurt 2019 · 14 min lexim

Klasifikimi i lajmeve (Shqip) duke përdorur Machine Learning

Klasifikimi i lajmeve (Shqip) duke përdorur Machine Learning

Një nga produktet e para të Gjirafa.com janë lajmet. Në këtë produkt, Gjirafa bën mbledhjen e të gjitha lajmeve ditore që publikohen në të gjitha portalet shqiptare. Këto lajme analizohen nga sistemi jonë dhe paraqiten në një vend ku ju si vizitorë të Gjirafa.com mund të gjeni lajmet kryesore te ditës, çka po flitet apo kush po përmendet.


Pothuajse çdo portal e ka një strukturë të ndryshme të kategorizimit dhe mënyrën e tyre të publikimit të lajmeve. Për shembull, disa i postojnë të gjitha lajmet që kanë të bëjnë me sport në një kategori të vetme, e disa të tjerë i ndajnë ato në futboll, basketboll dhe kategori tjera përkatese apo edhe në ato lokale dhe ndërkombëtare. Një zgjidhje e thjeshtë do të ishte që te mirren këto kategorizime ashtu sic janë nga portalet, duke marrë parasysh që ato bëhen manualisht nga personat e caktuar dhe të shfaqen në Gjirafë. Por, kjo do të krijonte shumë kategori, disa prej tyre edhe me kuptime të njëjta por emërtime të ndryshme dhe nuk do të ishte një eksperiencë e këndshme për lexuesin. Kjo na detyron të krijojmë një strukturë të kategorive që përfaqëson pothuajse të gjitha lajmet dhe kategorizimi të bëhet në mënyrë automatike, pa nevojë për punë manuale.


Para se të vazhdojmë me artikullin duhet të keni parasysh që:

  1. Ky artikull është i shkruar më shumë për fillestarë (programerë, studentë apo personat që nuk kanë përvojë me machine learning), që do të thotë se shumë detaje nuk janë paraqitur
  2. Një pjesë e termeve nuk janë përkthyer dhe jane përdorur termet origjinalë në gjuhen Angleze (më mirë e pa përkthyer sesa e përkthyer gabimisht :), si dhe është më e lehtë për t’u hulumtuar më pas në termet origjinale)
  3. Ky nuk është tutorial si të implementoni një klasifikator duke përdorur Machine Learning, por mund ta konsideroni si një lloj hyrje se çfarë të kërkoni në rast se dëshironi të bëni një gjë të tillë


Që të bëhet automatizimi i kategorizimit, përdorimi i machine learning është esencial. Machine Learning është një studim shkencor i algoritmeve dhe modeleve statistikore që përdorin sistemet kompjuterike për të kryer një detyrë specifike në mënyrë efikase pa përdorur instruksione eksplicite. Kjo fushë përmban dy kategori kryesore:

  1. Supervised Learning
  2. Unsupervised Learning


Tek supervised learning, algoritmi ndërton një model matematikor bazuar në një set të të dhënave që përmban të dhënat që i jepen algoritmit dhe rezultatet e pritura. Kjo do të thotë se kur e trajnojmë një model ne i tregojmë algoritmit së çfarë rezultate presim për input-in përkatës. Për shembull. nëse qëllimi është që të tregojmë nëse nje fotografi ka një mace apo jo, ne i japim algoritmit fotografi të ndryshme bashkë më një etiketim se a përmban ajo fotografi mace apo jo. Nga këto fotografi algoritmi e trajnon një model i cili më pas është i gatshëm që në fotot që nuk i ka parë më herët, në bazë të pattern-ave të mësuara, të na tregojë se a ekziston ndonjë mace në fotografi apo jo. Për këtë arsye ne këto algoritme i quajmë Machine Learning, sepse kompjuteri "mëson" nga fotot se si duket një mace. Algoritmet kryesore të supervised learning janë algoritmet e klasifikimit dhe të regresit. Në këtë artikull do të përdorim algoritmet e klasifikimit.


Kurse tek unsupervised learning, algoritmet mundohen të gjejnë pattern-at duke u bazuar vetëm nga të dhënat hyrëse (input). Kjo teknikë është e dobishme kur ju nuk jeni të sigurtë se çfarë rezultate dëshironi në fund. Shumica e algoritmeve të unsupervised learning janë cluster analysis algoritmet. Cluster analysis është një metodë për grupimin e të dhënave të ngjajshme mes vete pa i përcaktuar paraprakisht këto grupe. Një shembull mund të jetë interesimi për videot e ndryshme. Nëse i japim një algoritmi të dhënat se cilat video i kanë shikuar përdoruesit e ndryshëm, atëherë ai do të mundohet t'i grupojë përdoruesit që kanë interesa të përbashkëta, pra përdoruesit që janë të interesuar në video të njëjta. Në një grup mund të jenë përdoruesit që janë të interesuar më shumë në videot sportive, e në grupin tjetër përdoruesit e interesuar për videot që kanë të bëjnë me përgatitjen e ushqimeve. Pika kryesore këtu është se ne nuk i specifikojmë paraprakisht këto grupe, por ato krijohen nga vetë algoritmet. Një nga algoritmet më të njohura për clustering është K-means


Kthehemi tek klasifikimi. Për të implementuar një klasifikator për lajmet në gjuhën shqipe nevojiten dy gjëra kryesore:

  1. algoritmi për klasifikim, dhe
  2. të dhënat e nevojshme


Pasi që nuk ekzison një algoritëm i vetëm i klasifikimit, që është i përshtatshëm për të gjitha nevojat, jane zhvilluar një numër i madh i algoritmeve për klasifikim. Disa nga algoritmet më të përdorura janë: linear discriminant analysis, Logistic regression, Naive Bayes classifier, Perceptron, Support vector machines, K-nearest neighbor, Neural networks etj.


Në rastin tonë do të përdorim algoritmin Naive Bayes. E kemi zgjedhur këtë algoritëm për shkak se implementimi i tij është më i lehtë dhe ka shfaqur rezultate të kënaqshme për atë që ne kemi synuar të arrijmë. Por, kjo nuk do të thotë se ky është algoritmi më i mirë për të klasifikuar lajmet në gjuhën shqipe. Në fakt një krahasim i këtyre algoritmeve për këtë përdorim do të ishte ide e mirë për ndonjë punim shkencor apo diplome (të interesuarit për të bërë një gjë të tillë le të më kontaktojnë, do të ndihmoja me shumë kënaqësi).


Nuk do të futem në detaje ta shpjegoj mënyren se si funksionon Naive Bayes për arsye se ekzistojnë materiale të mjaftueshme në internet që e bëjnë këtë gjë shumë më mirë se sa që do ta bëja unë, por ajo qka ne duhet të dijmë është se në thelb Naive Bayes është një model statistikor që bën klasifikimin e dokumenteve nëpër kategori të ndryshme duke përdorur frekuencën e fjalëve si indikator kryesor. Pra, kur bëhet trajnimi i një klasifikatori duke përdorur Naive Bayes, ky algoritëm analizon të gjitha fjalët që i takojnë dokumenteve të ndryshme dhe kategorive me të cilat janë asociuar këto fjalë. Duke përdorur këtë analizë, në rastin kur vjen një lajm për t’u klasifikuar, algoritmi analizon fjalët e këtij lajmi dhe duke u bazuar në paraqitjen e këtyre fjalëve në kategoritë ekzistueze, në mënyrë probabilistike algoritmi na tregon se cilës kategori i afrohet më së shumti lajmi. Për shembull: para, biznes, kontratë, kompani, paga, valuta, dollar, euro janë fjalët që më së shumti paraqiten në lajmet që kanë të bëjnë më ekonomi, kështu që gjasat janë të mëdha që një lajm i cili përmban këto fjalë i takon kategorise se ekonomise. Por, duhet ta kemi parasysh se një lajm mund të ketë shumë terme ekonomike por të jetë në ndonjë kategori tjetër. Shpesh ndodh që në lajmet për transferime të lojtarëve në futboll të paraqiten termet si paga, kontrata, shuma të parave, marrëveshje etj, por që lajmi i përket kategorisë së sportit.


Për të përdorur Naive Bayes ekzistojnë librari të shumta që e kanë implementuar këtë algoritëm në gjuhë të ndryshme. Python njihet si një prej gjuhëve më të përdorura në raste të tilla dhe përmban një numër të madh të librarive për Machine Learning, që janë tejet të lehta për t’u përdorur. Edhe në Gjirafë, verisoni i parë i klasifikatorit ka qenë në Python i cili është thirrur si service nga programet tona që janë kryesisht në C#. Por, për shkaqe të përformancës dhe mirëmbajtjes, më vonë kemi përdorur librarinë Apache OpenNLP që është në gjuhën Java.


Pasi që e kemi zgjedhur algoritmin dhe implementimin e nevojshëm për ta përdorur në klasifikim, tani duhet t’i përgatisim të dhënat e nevojshme që do të përdoren për të trajnuar këtë model. Ne kemi përdorur një korpus të lajmeve shqip të cilat janë klasifikuar manualisht. Këto lajme janë të ndara në 8 kategori kryesore:

  1. Politikë
  2. Kulturë
  3. Sport
  4. Teknologji
  5. Shëndetësi
  6. Ekonomi
  7. Aktualitet
  8. Showbiz


Duke marrë parasysh se si funksionon Naive Bayes, ne duhet të bëjmë një para-procesim të lajmeve që të kemi rezultate sa më të sakta. Së pari duhet t’i eliminojme nga lajmet fjalët që njihen si “stopwords”. Këto janë fjalët që zakonisht përsëriten shumë shpesh nëpër lajme dhe nuk ndihmojnë në klasifkim, e në fakt ndonjëherë mund edhe të ndikojnë negativisht. Shembull të këtyre fjalëve në gjuhën shqipe janë përemrat (unë, ti, ai, ajo) apo edhe foljet ndihmëse (është, ishte). Këto fjalë paraqiten pothuajse në çdo lajm, pa marrë parasysh se cilës kategori i përkasin, kështu që më së miri është të elimohen këto para së të trajnojmë modelin. Mënyra më e mirë për të bërë këtë është duke i zgjedhur manualisht një numër të caktuar të fjalëve që do t’i trajtojmë si “stopwords” dhe t’i elimojmë nga lajmet gjatë trajnimit. Për të lehtësuar procesin e gjetjes së këtyre fjalëve mund të përdorim TF-IDF. TF-IDF që ështe shkurtesë për Term Frequency - Inverse Document Frequency është një statistikë numerike që përdoret në Natural Language Processing (NLP) për të treguar rëndësinë e një fjale në një dokument që i takon një grupi të dokumenteve (korpusi). Përsëri nuk do të hyjmë në detaje se si funksionon ky algoritëm, por logjika e TF-IDF bazohet në atë se nëse nje fjalë përsëritet shpesh brenda një dokumenti atëhere ajo fjalë është e rëndësishmë për atë dokument, por nëse e njëjta fjalë përsëritet shpesh edhe në dokumentet tjera, atëhere ajo fjalë nuk është e rëndësishme dhe vlera e TF-IDF e asaj fjale bie proporcionalisht. Sa më e madhë që të jetë vlera e TF-IDF aq më e rëndësishme është fjala për këtë dokument. Në rastin tonë ne mund të përdorim TF-IDF për të gjetur fjalët që kanë vlerën më të vogël dhe më pas t’i zgjedhim disa prej tyre si “stopwords”


Pasi te kemi eliminuar “stopwords” është koha të elimojmë edhe problemin e paraqitjes së fjalëve në forma të ndryshme. Edhe pse për neve fjalët: punoj, punojnë dhe punonin janë të njëjta, për kompjuterin këto janë fjalë të ndryshme, kështu gjatë trajnimit algoritmi do t’i trajtojë këto si fjalë të ndryshme. Për këtë gjë do të përdorim stemming. Stemming është procesi i reduktimit të fjalëve në formën e tyre bazë. Për shembull. stemming i fjalëve të përdorur më lartë është fjala punë. Ekzistojnë algoritme të ndryshme për të implementuar stemming. Në rasting tonë do të përdorim një stemming për gjuhën shqipe të implementuar nga Prof.Asoc.Dr. Ercan Canhasi.


Në fund poashtu do t’i eliminojmë të gjitha shenjat e pikësimit nga lajmet, duke i lënë vetëm fjalët kryesore në formën e tyre bazë të paraqitura të gjitha me shkronja të vogla. Pasi i bëjmë të gjitha këto procesime, një lajm sikur ky:


Prototipi i modelit LaFerrari është bërë me pronar të ri në ankandin e shtëpisë RM Sotheby’s, por ai nuk do të mund të vozisë këtë veturë në trafik. Top modeli i fundit i Ferrari, LaFerrari është prezantuar më 2013 dhe ishte shitur shumë shpejt, pasi që prodhimi ishte kufizuar në vetëm 499 njësi. Automobili është i vitit 2012 dhe bie në mesin e disa njësive të paraprodhimit. Kjo njësi e paraprodhimit gjendet edhe në të gjitha fotografitë origjinale promovuese të LaFerrari. Ferrari ka njoftuar blerësin e ri se automjeti është i dedikuar vetëm për ekspozita dhe jo edhe për vozitje. Ndryshe, çmimi prej 2.1 milionë euro është dukshëm më i lartë se sa LaFerrari, i cili nis nga 1.2 milionë euro. Në ndërkohë, çmimi i këtij modeli është rritur dhe njësit e rralla mund të gjenden në treg me një çmim për disa herë më të lartë.



Do të dukej kështu:


prototip model laferrar pronar ankand shtëpi sotheby vozisë veturë trafik top model ferrar laferrar prezantuar shitur shpejt prodhim kufizuar njësi automobil bie njësi paraprodhim njër laferrar cilët prodhuar ndonjëherë maranel kompani shfrytëzuar prezantim mbyllur blerës organizuar njës paraprodhim gjend fotografitë origjinal promovues laferrar ferrar njoftuar blerës automjet dedikuar ekspozit vozitje ndryshe çmim milionë dukshëm lartë laferrar nis milionë ndërkohë çmim model rrit njësi rrallë gjend treg çmim lartë


Kodimi


Siç e kam cekur më lartë, ne kemi përdorur ApacheOpenNLP për klasifikimin e lajmeve. Për të trajnuar një model të klasfikimit duhet të vendosni të gjitha lajmet në një file, ku çdo lajm është i shkruar në një rresht dhe fjala e parë është kategoria e atij lajmi, psh: ekonomi treg punës kosovë punëtorë punojnë kontrat punës sektor…


Për të trajnuar një model duke përdorur këtë librari, përdorim këtë kod nga dokumentimi:


InputStreamFactory dataIn = new MarkableFileInputStreamFactory(new File(”FILE_PATH”));
ObjectStream<String> lineStream = new PlainTextByLineStream(dataIn, "UTF-8");
ObjectStream<DocumentSample> sampleStream = new DocumentSampleStream(lineStream);
 
// define the training parameters
TrainingParameters params = new TrainingParameters();
params.put(TrainingParameters.ITERATIONS_PARAM, 10+"");
params.put(TrainingParameters.CUTOFF_PARAM, 0+"");
params.put(AbstractTrainer.ALGORITHM_PARAM, NaiveBayesTrainer.NAIVE_BAYES_VALUE);
 
DocumentCategorizer doccat = new DocumentCategorizerME(model);


Dhe për të klasifikuar një lajme e përdorim modelin e trajnuar:


String[] words = getWords(content);
double[] probs = doccat .categorize(words);
String category = doccat .getBestCategory(probs);


Tek metoda getWords() e përdorim SimpleTokenizer nga libraria ApacheOpenNLP për të ndarë lajmin në fjalë si dhe i eliminojmë të gjitha karakteret speciale përveq shkronjave shqipe dhe numrave.


Ky klasifikator për momentin përdoret tek lajmet dhe deri më tani ka treguar rezultate mjaft të kënaqshme (ndodh që në disa raste të vendoset kategoria gabim, por janë gabime brenda kufinjëve të tolerueshme).


Pjesa më e rëndësishme e klasifikatorit janë të dhënat. Çfarëdo algoritëm që përdoret, nëse të dhënat tuaja nuk janë mjaftueshëm kualitative për detyrën që duhet ta kryejnë, atëherë më shumë gjasë nuk do të keni rezultate të duhura. Nëse dëshironi të krijoni një klasifikator duhet t’i kushtoni shumë rëndësi të dhënave dhe përgatitjes së tyre. Pjesa e algoritmit edhe pse ka mjaft rëndësi, është relativisht e lehtë. Nëse keni të dhëna te duhura edhe nje algoritëm i thjeshtë mund të kryej punë mjaftueshëm. Tek të dhënat mundohuni të krijoni një balancë në mes të kategorive që përdorni, për shkak se nëse keni le te themi 40% të lajmeve në një kategori të vetme dhe pjesën tjetër të ndarë në kategoritë tjera, atëherë mos u quditni nëse shumica e lajmeve do t’ju klasifikohen në kategorinë me numër më të madh të lajmeve. Poashtu një rol të madh luan edhe gjatësia e lajmeve. Zakonisht lajmet në politikë dhe ekonomi janë relativisht më të gjatë se sa ato në sport apo showbiz, kështu që duhet të keni parasysh edhe këtë fakt gjatë trajnimit. Poashtu do të ishte mirë të planifikoni përditësimin e modelit. Me kalimin e kohës lajmet dhe temat që diskutohen ndryshojne kështu që këshillohet që në mënyrë periodike ta përditësoni modelin me të dhëna të reja (përafërsisht çdo 3 muaj).


Përveq lajmeve, një eksperiment interesant me Naive Bayes që ka pasur rezultate interesante ka qenë edhe klasifikimi i produkteve në Gjirafa50. E kemi trajnuar një model me tituj dhe përshkrime të mijëra produkteve që i kemi në gjuhën shqipe dhe më pas i kemi testuar se si ky model i kategorizon këto produkte në kategori të ndryshme që ekzistojnë në Gjirafa50. Edhe pse prooduktet teknologjike përmbajnë përsëritje të madhe të termeve të njejta, jemi befasuar me rezultatin e mirë që e ka treguar ky model. Në bazë të disa testimeve që i kemi bërë kemi arritur një saktësi mbi 60% të klasifikimit të produkteve. Por, duke marrë parasysh natyrën e titujve dhe përshkrimeve të produkteve nuk kemi provuar të bëjmë diqka automatike në këtë aspekt (ende).


Kjo ishte një përmbledhje e shkurtër e përvojës sonë në Gjirafë me përdorimin e Machine Learning dhe implementin e saj për të klasifikuar lajmet në gjuhën shqipe. Çdo koment, sygjerim apo kritikë është e mirë se ardhur!







Hakan Shehu
Themelues i Papirusit
64x64
Gjirafa Engineering
Artikujt e ndryshëm nga ekipi i inxhinierisë softuerike në Gjirafa.

Gjithashtu lexoni


1 koment