SlavicaJ / UZ_Project

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Projekt prikupljanja i analize podataka

Autor:

Anton Ilić

Mentori:

izv. prof. dr. sc. Ana Meštrović

dr. sc. Slobodan Beliga

Kolegij:

Upravljanje znanjem

Vrijeme izrade

Studeni 2020 - Prosinac 2020


Opis projekta

Cijeli projekt je odrađen na aktualnom dalmatinskom portalu Dalmacija Danas pritom koristeći sve kategorije koje se na portalu nude.

U prvom dijelu projekta potrebno izgraditi listu URL-ova koji vode na članke sa zadanog portala s vijestima te svaki članak zasebno obraditi struganjem željenih podataka u .csv i .json datoteku. Cijeli proces je odrađen automatiziranim putem u programskom jeziku Python 3 koristeći zavisnost modula za parsiranje web stranica, automatizirano slanje JavaScript zahtjeva i slanje HTTP zahtjeva.

Drugi dio projekta uključuje analizu prikupljenjih podataka. Analiza je fokusirana na aktualnu krizu izazvanom novim koronavirusom, uzročnikom bolesti COVID-19. Članci su analizirani te svrstani u one koji se odnose te oni koji se ne odnose na aktualni virus. Podaci su prikazani tablično i grafički, a odnose se na omjer ukupnog broja članaka te onih koji se odnose na zadanu temu u odnosu na neki kriterij. Ti kriteriji su omjer po kategoriji, mjesecu ili pojedinačnom danu. Nadalje, određena je, tablično prikazana te vizualizirana frekventnost 25 najkorištenijih riječi na mjesečnoj bazi koje novinari na portalu koriste kada pišu o koronavirusu.

Tehničke informacije

Operacijski sustav

  • Windows 10

Alati i softver

  • Visual Studio Code
  • Windows WSL 1 (Optional)
  • pip 20.0.2 from /home/user/.local/lib/python3.6/site-packages/pip (python 3.6)
  • Python 3.6.9
  • Bliblioteke
    • requirements.txt priložen u projektu

Važna napomena

  • Izgrađene baze podataka nisu uključene u Git repozitorij jer bi na taj način ovaj projekt kršio uvjete korištenja portala. Podaci u ovom projektu su korišteni isključivo kao demonstracija korištenja primjenjenih metoda u svrhu savladavanja gradiva na konkretnim primjerima na kolegiju Upravljanje znanjem. Komercijalna upotreba tih podataka nije dozvoljena.

Prikaz elemenata portala

Naslovnica


Prikaz kategorije Sport


Emotikoni i obrazac za komentiranje članka

Prva faza

U prvoj fazi izrade projekta izrađene su jedinstvene skripte article_url_scraper.py i article_scraper.py koje služe za dohvaćanje podataka, u nastavku je objašnjen način rada svake pojedine skripte.

Način rada

Napomena: Detaljan način rada je opisan u svakoj pojedinoj skripti.

article_url_scraper.py

Skripta služi za prikupljanje jedinstvenih URL-ova na svaki članak na portalu u razdoblju od 1.1.2020 do 30.11.2020. Automatska navigacija web stranicom omogućena je koristeći se Selenium i Requests modulima. Identifikacija i parsiranje svakog pojedinog elementa je omogućena korištenjem BeautifulSoup4 modula za Python 3.

Skripta prvo otvara željeni portal te se preko naslovne stranice identificiraju glavne kategorije pretraživanjem HTML elemenata. Koristeći petlju, skripta otvara svaku pojedinu glavnu kategoriju u svrhu prikupljanja URL-ova na članke. Za navigaciju kroz svaku pojedinu kategoriju, na portalu je implementirana JavaScript skripta koja omogućuje beskonačni scroll kojim se lista vidljivih članaka proširuje. Iz tog razloga, ta se skripta simulira od strane Selenium modula koji scrolla stranicu određeni broj puta da bi ti članci postali vidljivi u HTML-u web stranice. Zatim se svaki pojedini članak otvara, iz njega se analizaju meta podaci. Modul BeautifulSoup4 izvlači datum objave i poveznicu na članak. Ukoliko je članak iz željenog datumskog razdoblja (1.1.2020 do 30.11.2020), sprema se u željenu tekstualnu datoteku output/portal_urls.txt. Zatim se prelazi na sljedeću kategoriju, a postupak se ponavlja.

Zbog činjenice da svaki scroll "košta" 1.5 sekundu, te da je svaki pojedini članak potrebno otvoriti i respektivno analizirati radi provjere uvjeta, ova skripta se za željeni interval datuma izvodi po više od 8 sati.

Rezultat skripte je lista od 22436 jedinstvenih poveznica na članke portala.

Prikaz generiranih URL-ova

Prikaz poveznica

article_scraper.py

Skripta služi za sekvencijalno otvaranje svih URL-ova prikupljenih skriptom article_url_scraper.py te prikupljanje željenih podataka iz svakog članka. Rezultati se spremaju u output/portal_articles.csv te output/portal_articles.json, a stvara se i svojevrsni dnevnik tekućeg pokretanja u mapi output/. Tablica u nastavku prikazuje podatke koji se prikupljaju.

Podatak Tip podatka Opis podataka
ID int Jedinstveni identifikator članka
Title str Naslov članka
Subtitle str Podnaslov članka
URL str Poveznica na članak
Section str Kategorija u kojoj se članak nalazi
Article_text str Cijeli tekst članka
Published_time str/date pars. Datum objave članka
Modified_time str/date pars. Datum zadnje modifikacije članka
Author str Autor članka i/ili fotograf
Comments str Broj komentara na pojedinom članku
Reaction_love int Broj korisnika koji su na članak reagirali reakcijom 1
Reaction_laugh int Broj korisnika koji su na članak reagirali reakcijom 2
Reaction_hug int Broj korisnika koji su na članak reagirali reakcijom 3
Reaction_ponder int Broj korisnika koji su na članak reagirali reakcijom 4
Reaction_sad int Broj korisnika koji su na članak reagirali reakcijom 5
Reaction_mad int Broj korisnika koji su na članak reagirali reakcijom 6
Reaction_mind_blown int Broj korisnika koji su na članak reagirali reakcijom 7

Za izvođenje ove skripte potrebno je oko 8 sati.

<Primjer prikupljenih podataka iz portal_articles.json

JSON example

Upute za pokretanje prvog dijela

Skripte je moguće pokrenuti zasebno upisivanjem njihovog imena u Terminal/CMD:

python article_url_scraper.py
python article_scraper.py

Također, moguće je pokretanje pomoću main_scrape.py skripte koja sekvencijalno pokreće jednu po jednu skriptu jednom komandom:

python main_scrape.py

Druga faza

U drugoj fazi izrade projekta koriste se skripte article_tabler.py, article_grapher.py i article_language.py. One služe za kategorizirani prikaz podataka i njegovu vizualizaciju. Osim toga, služe i za analizu jezika korištenog pri pisanju članaka.

Način rada

Napomena: Detaljan način rada je opisan u svakoj pojedinoj skripti.

article_url_tabler.py

Primarna namjena skripte je identifikacija članaka koji se odnose na tematiku COVID-19 virusa te sumarizacija tih članaka, kao i ukupnog broja članaka. Osim toga, skrita je zadužena i za stvaranje pregleda broja članaka po danu, mjesecu i kategoriji portala.

Identifikacija COVID-19 članaka je realizirana pomoću tekstualne datoteke input/covid_dictionary.txt. Ona sadrži listu čestih riječi/pojmova koji se spominju u kontekstu izvještavanja o bolesti. Neki od primjera tih izraza su: stožer, COVID-19, zaraženih, samoizolaciji,... Zatim se tekstualni stupci koji sadrže tekst članka razdvajaju na riječi koje se uspoređuju s riječima iz covid_dictionary.txt liste. Ukoliko su riječi pronađene, u novi stupac COVID datoteke output/portal_articles_covid.csv se upisuje vrijednost 1, ukoliko članak ne sadrži te riječi, upisuje se 0.

Zatim se ti članci prebrojavaju ovisno o kriteriju te se rezultati upisuju u .csv datoteke u output/tables_categorized. Njihov prikaz slijedi u nastavku.

Prilikom pokretanja skripte te izgradnje portal_articles_covid.csv datoteke, prikazuje se ukupan broj članaka i broj COVID-19 članaka.


Prva generirana tablica se odnosi na dnevni pregled broja članaka od 1.1.2020 do 30.11.2020 vezanih uz COVID-19 i ukupni broj. Pregled podataka za 335 redova ručno nije zahvalan posao, zato je ova tablica iskorištena za grafički pregled koristeći sljedeću skriptu.


Druga tablica se odnosi na pregled broja članaka vezanih uz COVID-19 i ukupan broj članaka po svakoj kategoriji koju portal ima. Tablica je sortirana abecedno, a vidljivo je da portal najviše resursa usmjeruje u kategoriju Dalmacija, Vijesti i Sport što je i očekivano zbog općeg interesa čitatelja za ta područja. Također, i žuta kronika (Relax) nije zapostavljena.

Prije navedene najpopularnije rubrike imaju najviše zastupljeni udio COVID-19 članaka što nije čudno budući da se radi domeni izvještavanja svakodnevnih događaja. Osim toga, vidljivo je da portal podosta zapostavlja podkategorije od kojih neke gotovo da i nemaju novih objava. Iz tog razloga su u daljnjoj analizi te kategorije ujedinjene pod kategoriju Other.


Treća tablica se odnosi na pregled ukupnog broja COVID-19 članaka te ukupnog broja članaka na portalu na mjesečnoj bazi. Iz nje je vidljiv eksponencijalni rast COVID-19 tema u razdoblju kada informacije o njemu gotovo da i nisu bile dostupne (Ožujak i Travanj), odnosno kad je država bila pod mjerom Lockdown-a. To se može interpretirati i kao panična faza pandemije. U tom razdoblju je portal također imao najviše objava, a njihov je broj očito bio "napumpan" velikim brojem COVID-19 članaka. Tijekom ljeta je taj broj opao, budući da se tematika jednostavno zapostavila, pretežito zbog spašavanja turizma od strane vladajućih. Zatim se u zadnja dva mjeseca vidi neki ponovni rast.

article_url_grapher.py

Skripta učitava .csv tablice kreirane u skripti article_url_tabler.py te ih vizualizira pomoću prikladnih grafova koji se nakon izvedbe spremaju u graphing/ mapu. U nastavku slijedi prikaz tih grafova.

Grafovi i interpretacije

Stupčasti graf prikazuje ukupan odnos između broja članaka koji se odnose na COVID-19 i onih koji se ne odnose, pritom je vidljivo da skoro pola članaka u razdoblju od 1.1.2020 do 30.12.2020 izvješćuju o COVID-19 tematici.


Tortasti graf u nastavku prikazuje iste podatke prikazane u obliku prikladnijem za vizualizaciju omjera, prilikom toga su prikazani i postoci.


Graf prikazuje dnevnu distribuciju ukupnog broja članaka i članaka koji se odnose na COVID-19. Pritom su skokovi vidljivi za vrijeme 2. i 3. mjeseca što je već zaključeno u prethodnom poglavlju kod tablice koja prikazuje mjesečnu distribuciju. Također, ponovno je vidljiv ljetni pad izvještavanja te skok pri izvještavanju dolaskom hladnijih godišnjih goba i povratka virusa.


Kutijasti dijagram u nastavku pokazuje neke statističke podatke vezane uz dnevnu pojavu članaka.

  • Vidljivo je da srednja vrijednost iznosi oko 20 objava vezanih uz COVID-19, dok dnevna vrijednost ukupnog broja članaka iznosi oko 65.
  • Donji i gornji kvartil se od medijana razlikuju za nešto više od 5 članaka.
  • Minimalni broj članaka vezanih uz COVID-19 iznosi 0, dok maksimalni iznosi 60-ak.
  • Minimalni broj ukupnog broja članaka na dnevnoj bazi iznosi nešto manje od 40, dok maksimalni iznosi oko 100-ak.

Stupčasti graf prikazuje tablicu prikaza broja članaka po kategorijama prikazanu u prošloj skripti (article_tabler.py). Pritom ovaj graf prikazuje koliko veliku razliku ima portal u broju napisanih članaka po kategorijama. Vidljivo je da COVID-19 ima više objava u kategoriji Dalmacija nego ukupno u kategoriji Relax (Žuta kronika) na koju su portali inače jako usredotočeni. To samo pokazuje razmjere promjene u načinu rada koje je virus uzrokovao.


Tortasti graf prikazuje omjere između kategorija po zastupljenosti COVID-19 članaka. Prtiom su vidljivi i postoci.


Stupčasti graf također vizualizira rezultate prikazane u tablici broja članaka po mjesecima iz skripte article_tabler.py. Vidljiva je velika sličnost s grafom koji prikazuje broj članaka na dnevnoj bazi, ali u nešto urednijem i preglednijem formatu. Ovaj graf prikazuje jednu zanimljivu pojavu, a to je da ukoliko usporedimo Siječanj i Listopad, broj članaka se povećao za točno toliko koliko iznosi broj COVID-19 članaka. Zanimljivi dio je to da većina tih ostalih vijesti na portalu promakne u sjeni onih koje su vezane za virus.


Kutijasti dijagram prikazuje statistički pregled po mjesecu, ali podatke je nešto teže interpretirati zbog uskih intervala.

  • Srednja vrijednost COVID-19 vijesti iznosi oko, dok srednja vrijednost ukupnog broja iznosi oko 2100.
  • Minimalna vrijednost objava vezanih uz COVID i ona vezana uz ukupni broj se drastično ne razlikuje od vrijednosti donjeg kvartila.
  • Maksimalni broj članaka vezanih uz COVID-19 iznosi nešto manje od 1250, dok od ukupnog broja članaka iznosi nešto manje od 2500.

article_language.py

Skripta služi za jezičnu obradu tekstualnog dijela portala što uključuje naslov, podnaslov i cijeli tekst u svrhu analize jezičnog diskursa.

Prva faza rada skripte uključuje izoliranje članaka koji su u prijašnjim skriptama označeni kao članci vezani uz COVID-19, odnosno u kojima je binarna varijabla COVID jednaka 1. Iz tih je članaka izdvojen stupac koji označava vrijeme objave i spojene stupce koji se odnose na naslov, podnaslov i cijeli tekst članka. Rezultati su spremljeni u /output/discourse_csv/portal_covid_isolated.csv datoteku radi izbacivanja stupaca koji nisu bitni za ovaj dio analize.

Druga faza rada skripte je stvaranje liste zaustavnih riječi. To su riječi koje rečenici ne nose smisao niti informaciju, a to mogu biti veznici, uzvici, prilozi, prijedlozi, čestice,.. Radi se o nepromijenjivim vrstama riječi koje je lako izbaciti iz teksta uvođenjem liste bez naprednog procesiranja.

Eliminacija tih riječi je realizirano stvaranjem "sirovih" baza riječi u mapi input/raw_stopw/ koje se jednostavnom funkcijom spajaju u jedinstveni riječnik. Taj riječnik (stop_words_merged.txt) sadrži riječi koje kroz obradu moraju biti izbačene. Iteriranjem kroz datoteku portal_cvoid_isolated.csv izbacuju se zaustavne riječi.

Treća faza rada se odnosi na stvaranje mjesečnog pregleda 25 najzastupljenijih riječi. Ovisno o mjesecu, broji se frekvencija te se gradi lista od 25 najčešćih riječi kojima se portal koristi u svakodnevnom radu. Te su liste spremljene u obliku .csv datoteka u output/word_frequencies/, a njihove su tablice i grafovi prikazani u nastavku. Pritom su rezultati vizualizirani koristeći paket wordcloud, u njemu se riječi prezentiraju prema veličini ovisno o frekventnosti.

Rezultati te obrade slijede u nastavku za svih 11 mjeseci.

Siječanj

Veljača

Ožujak

Travanj

Svibanj

Lipanj

Srpanj

Kolovoz

Rujan

Listopad

Studeni


Pregledom svih grafova je utvrđena frekventnost 25 najkorištenijih riječi za svaki mjesec. Pomnijom analizom se može uočiti da se najkorištenije riječi odnose na tada tek završene predsjedničke izbore gdje su frekventne riječi. Tu je zastupljeno i ime tada aktualne bivše predsjednice Kolinde Grabar-Kitarović. Tu je također riječ predsjednik vjerojatno korištena u kontekstu novoizabranog predsjednika. Stožer za razliku od današnjeg je tada podrazumijevao izborni stožer kandidata za predsjednika. Također, vidljivo je da je portal jako fokusiran na splitsko područje po korištenju riječi Marjan i Split.

Valja napomenuti da se radi o lažno klasificiranim podacima pod COVID statistiku budući da se neki slični termini kao što je "stožer" može biti korišten u kontekstu izbornog stožera i Stožera civilne zaštite. Radi se o razdoblju u kojem portali o tematici virusa nisu raspravljali, tako da tablicu za prvi mjesec nema smisla uključivati u analizu.

U Veljači se tonalitet mijenja. Koronavirus tematika postaje de facto središnja tema na portalu te se u frekventnim riječima osim riječi koronavirus (i njegove varijacije) može pronaći i riječ Italiji. Italija se spominje zbog činjenice da je u drugom mjesecu bila jedna od najpogođenijih zemlja, pa nije ni čudno da se našla na toj listi.

Od veljače do danas se frekventne riječi nisu previše mijenjale. Broj riječi je određen trenutnom situacijom, što znači da se formira ovisno o mjerama i broju bolesnih. Visoko na listi se u svakom slučaju nalazi riječ ljudi, osobe i broj što je očekivano budući da se portal kao i svaki najviše obazire na nove broje iz dana u dan. Također je uočljivo da se u listi ponavlja broj 24 kao često ponavljana riječ. To je očekivano budući da većina izjava na tu temu počinje sa "U posljednja 24 sata...".

Problem u ovoj vrsti analize predstavljaju promijenjive vrste riječi koje zagađuju konačnu listu od 25 riječi. Eliminacija takvih riječi bi vjerojatno dala puno bolje rezultate, ali čak i sada je moguće izvući neku interpretaciju. Iz riječi se po mjesecima može zaključiti da portal ne iznosi previše mišljenja na temu virusa, već da iz dana u dan izvještava o brojkama novozaraženih te o prenošenju izjava vladajućih na aktualnu temu.

Jaccardov indeks

Odnos korištenih riječi na mjesečnoj bazi možemo prikazati Jaccardovim indeksom kojim dobivamo uvid u presjek skupova unije. Radi se o koeficijentu koju u odnosu na broj sličnosti između dva promatrana skupa rezultira u broju između 0 i 1. Ukoliko je broj bliže 1, postoji veća sličnost, dok ukoliko je broj manji od jedan, postoji manja sličnost.

Skupovi (mjeseci) su uspoređeni u paru po dvoje na način da se svaki mjesec usporedi s onim sljedećim (Npr. Siječanj-Veljača, Veljača-Ožujak,). Tablični i grafički prikaz su prikazani u nastavku.

U tablici je vidljiv poprilično mali presjek između vokabulara prvog i drugog mjeseca, što je i očekivano budući da zbog loše klasifikacije taj rezultat nema smisla promatrati. Što se tiče ostalih mjeseci, u pravilu je vidljiv veći presjek riječi. Vidljivo je da je vokabular između 2. i 6. mjeseca konstantan zbog ozračja u kojem se svijet nalazio. Zatim je vidljiv pad kroz 6. i 7. mjesec zbog činjenice da se virus teže širi ljeti zbog čega pada aktualnost teme. Povratkom virusa krajem ljeta, koeficijent se ponovno povećava, gdje ostaje do danas.



U nastavku slijedi i grafički prikaz koeficijenata presjeka dobivenog Jaccardovim indeksom.


Upute za pokretanje drugog dijela

Skripte je moguće pokrenuti zasebno upisivanjem njihovog imena u Terminal/CMD:

python article_tabler.py
python article_grapher.py
python article_language.py

Također, moguće je pokretanje pomoću main_analyse.py skripte koja sekvencijalno pokreće jednu po jednu skriptu jednom komandom:

python main_analyse.py

About


Languages

Language:Python 100.0%