SVEUČILIŠTE U ZAGREBU
FAKULTET ORGANIZACIJE I INFORMATIKE
V A R A Ţ D I N
Asja Stermšek
VIZUALIZACIJAKOMUNIKACIJSKIH TRENDOVA NA DRUŠTVENIM APLIKACIJAMA
ZAVRŠNI RAD
Varaţdin, 2013.
SVEUČILIŠTE U ZAGREBU
FAKULTET ORGANIZACIJE I INFORMATIKE
V A R A Ţ D I N
Asja Stermšek
Izvanredni student
Broj indeksa: 35908/2007.
Smjer: Poslovni sustavi
Preddiplomski studij
VIZUALIZACIJAKOMUNIKACIJSKIH TRENDOVA NA DRUŠTVENIM APLIKACIJAMA
ZAVRŠNI RAD
Mentor:
Doc. dr. sc. Markus Schatten
Varaţdin, Srpanj 2013.
I
Sadržaj
1. Uvod ........................................................................................................................................ 1
2. Analiza društvenih mreža ........................................................................................................ 2
2.1. Društvene mreže ............................................................................................................... 2
2.2. Analiza društvenih mreža ................................................................................................. 2
2.3. Osnovni koncepti u analizi društvenih mreža................................................................... 2
3. Teorija grafova ........................................................................................................................ 5
3.1. Graf ................................................................................................................................... 5
3.2. Tipovi grafova .................................................................................................................. 6
3.2.1 Neusmjereni graf ....................................................................................................... 6
3.2.2 Usmjereni graf ........................................................................................................... 6
3.2.3 Miješani graf ............................................................................................................. 7
3.2.4 Multigraf .................................................................................................................... 7
3.2.5 Jednostavni graf ......................................................................................................... 7
3.2.6 Težinski grafovi ......................................................................................................... 8
3.3. Susjedni čvorovi i bridovi................................................................................................. 8
3.4. Matrica incidencije ........................................................................................................... 8
4. Razvoj društvenih mreža kroz povijest ................................................................................. 10
4.1. Frigyes Karinthy (1929.) ................................................................................................ 10
4.2. Jacob Moreno (1933.) ..................................................................................................... 10
4.3. Solomonoff i Rapoport (1951.) ...................................................................................... 12
4.4. Erdős i Renyi (1960.)...................................................................................................... 13
4.5. Pool i Kochen (1978.) ..................................................................................................... 13
4.6. Travers i Milgram (1969.) .............................................................................................. 14
4.7. Derek de Solla Price (1965.) ........................................................................................... 14
4.8. De Castro i Grossman (1999.) ........................................................................................ 15
5. Vizualizacija mreža ............................................................................................................... 17
5.1. Softver za analizu društvenih mreža ............................................................................... 17
5.1.1 Gephi ....................................................................................................................... 18
6. Dinamička vizualizacija komunikacijskih trendova na blogovima ....................................... 19
6.1. Prikupljanje podataka pomoću programa pretraživača .................................................. 19
6.2. Eksport u Gephi .............................................................................................................. 22
6.3. Obrada u Gephi ............................................................................................................... 23
6.4. Program za stvaranje prikaza dinamičke vizualizacije ................................................... 23
6.5. Rezultati obrade .............................................................................................................. 24
7. Zaključak ............................................................................................................................... 28
Literatura ....................................................................................................................................... 29
Prilog – Programski kod aplikacije ..................................... Ошибка! Закладка не определена.
Popis slika i dijagrama
Slika 2.1. Primjer društvene mreže ................................................................................................. 4
Slika 3.1 Primjer grafa (s osam vrhova i devet veza) ...................................................................... 5
Slika 3.2 Usmjereni graf .................................................................................................................. 6
Slika 3.3 Jednostavan graf (ujedno i neusmjereni graf) .................................................................. 7
Slika 3.4 Prikaz matrice incidencije za usmjerene i neusmjerene grafove ..................................... 9
Slika 4.1 Morenova zapažanja o evoluciji grupe .......................................................................... 11
Slika 4.2 Prikaz načina dodjeljivanja Erdősovog broja ................................................................. 16
Slika 6.1 Različiti blogovi na blog.hr servisu ............................................................................... 20
Slika 6.2 Stranica s komentarima ureĎena od strane blog.hr servisa ............................................ 21
Slika 6.3 Pojednostavljeni rad programa pretraživača .................................................................. 21
Slika 6.4 Konačan graf .................................................................................................................. 25
Slika 6.5 Razvoj grafa od početka do kraja video isječka ............................................................. 26
1
1. Uvod
Tijekom prošlog desetljeća intenzivno se razvio interes za ideju povezanosti modernog
društva. Zahvaljujući tehnološkom napretku koji je omogućio i olakšao daleka putovanja,
globalnu komunikaciju i računalom posredovane interakcije društvene mreže u kojima živimo
intenzivno su se proširile i privukle pažnju mnogih znanstvenika. Znanost koja kvantificira
društvene interakcije razvija se iz potrebe da se istraže podaci koji se kriju unutar njih, te je
danas, analizom i vizualizacijom mreža istraživačima omogućeno prikupljanje informacija iz, do
nedavno, nezamislivo velikih količina podataka.
Ovaj rad bavi se vizualizacijom društvenih mreža, odnosno vizualizacijom komunikacijskih
trendovima na blogovima. Započinje upoznavanjem društvenih mreža općenito te nam
objašnjavajući osnovne pojmove analize mreža i osnove teorije grafova omogućuje detaljnije
upoznavanje s analizom društvenih mreža.
Nadalje se u radu govorio razvoju analize društvenih mreža kroz povijest, te su pritom
spomenuti autori i djela koji suznačajnije utjecali na to da se analiza društvenih mreža pomakne
iz okvira socioloških interesa i formira u zasebnu znanost. Pratimo kako se ideja o društvenoj
meĎupovezanosti pojavljuje meĎu znanstvenicima te kako se s vremenom popularizira i u manje
stručnim krugovima.
Na krajuje objašnjena vizualizacija društvenih mreža te se govori softveru koji je za to
specijaliziran.Spominje se programkoji je korišten za vizualizaciju komunikacijskih trendova na
blogovima u ovom radu te je objašnjeno kako su podaci o komunikaciji pomoću programa
pretraživača prikupljeni, vizualno prikazani i obraĎeni u video.
Kao dodatak radu priložen je i programski kod napisan u Javi, odnosno glavne klase
programa pretraživača, eksportera iz baze podataka u .gexf format datoteke te programa za
stvaranje prikaza dinamičke vizualizacije.
2
2. Analiza društvenih mreža
2.1. Društvene mreže
Osnovna pretpostavka teorije društvenih mreža jest da su naoko autonomni pojedinci ili
organizacije u stvari utkani u cjelovitu strukturu interakcija i društvene povezanosti[Borgatti,
Mehra, Brass i Labianca, 2009., str 8]. Izraz društvena mreža definiran je kako bi se opisala
društvena struktura koju čine pojedinci ili organizacije povezani jednom ili više tipova
meĎuovisnosti poput prijateljstva, srodstva, zajedničkih interesa, financijskih razmjena,
naklonosti ili nenaklonosti, vjerovanja, znanja ili prestiža.
U svom najosnovnijem obliku društvena mreža je mapa pojedinih veza, poput, na
primjer, prijateljstva, izmeĎu promatranih čvorova. Analizom društvenih mreža promatramo ih
kao mreže sastavljene od čvorova i bridova koji ih povezuju.
2.2. Analiza društvenih mreža
Analiza društvenih mreža bavi se istraživanjem povezanosti unutar skupa promatranih
subjekata. Ključna razlika izmeĎu analize mreža i drugih pristupa društvenim znanostima je
usmjerenost na odnose izmeĎu subjekata više nego na atribute koji pojedine subjekteopisuju.
Analiza društvenih mreža, prema tome, predstavlja drukčiji pristup društvenim fenomenima i
samim time zahtjeva nove metode za prikupljanje i analizu podataka. Zbog toga razvija vlastiti
vokabular za opisivanje društvenih struktura i formalne modele koji opisuju uobičajena svojstva
svih (društvenih) mreža i skupove metoda koje možemo primijeniti na mreže općenito. Formalni
jezik koji se koristi za prezentiranje podataka prikupljenih analizom društvenih mreža je jezik
teorije grafova, pa ćemo se u sljedećem odlomku definirati neke od osnovnih pojmova analize
društvenih mreža i pozabaviti se osnovama teorije grafova.
2.3. Osnovni koncepti u analizi društvenih mreža
Za razumijevanje i raspravljanje o društvenim mrežama potrebno je razumjeti nekoliko
ključnih koncepata koje koristimo u njihovoj analizi. To su pojmovi akter, relacijska veza, grupa,
podgrupa, relacija i mreža, te ćemo ih definirati u nastavku.
3
Akter (engl. actor). Analiza društvenih mreža bavi se razumijevanjem veza izmeĎu
društvenih entiteta i implikacijama veza meĎu njima. Te društvene entitete općenito nazivamo
akteri, a mi ćemo ih nazivati i čvorovi, vrhovi ili subjekti, ovisno o tome u kojem kontekstu
spominjemo mrežu. Akteri predstavljaju nedjeljive društvene jedinice poput osobe, korporacije
ili nekog drugog definiranog kolektiva. Kao primjer za aktere mogu poslužiti pojedinac, skupina
ljudi, odjel unutar neke korporacije ili čak čitave nacije.
Relacijska veza koju ćemo često nazivati i samo veza uspostavlja povezanost izmeĎu
para aktera. Oni su meĎusobno povezani nekom vrstom društvene veze čija vrsta i raspon mogu
biti poprilično široki. Neki uobičajeni primjeri takvih veza u analizi društvenih mreža su:
Izraženo prijateljstvo ili poštovanje
Transferi materijalnih resursa
Udruživanje ili pripadanje
Ponašajne interakcije
Pomicanja izmeĎu mjesta ili statusa
Formalni odnosi
Fizičke veze
Biološke veze [Wasserman i Faust, 1994., str. 17-18]
Grupe. Analiza mreža ne bavi se samo skupinama povezanih društvenih entiteta. U širem
smislu, moć analize leži u mogućnosti da se modeliraju odnosi unutar sustava aktera. Sustav se
sastoji od veza unutar članova neke grupe. Kao definiciju grupe koristit ćemo skup svih aktera na
kojima ćemo analizirati veze. Grupa se, prema tome, sastoji od konačnog broja aktera koji se
zbog konceptualnih, teoretskih ili empirijskih razloga tretiraju kao konačan skup subjekata na
mreži koju mjerimo. Ograničenje na konačan broj aktera proizlazi iz analitičkih razloga. Iako bi
se, u teoriji, pojedina grupa mogla sastojati od veza meĎu akterima čiji bi broj mogao biti
neograničen bilo bi nemoguće analizirati podatke prikupljene u takvoj mreži.
Podgrupe. Čest je slučaj da se unutar grupe na mreži formiraju u manje podgrupe koje su
sastavljene od bilo kojeg podskupa aktera i svih veza meĎu njima. Pronalaženje i proučavanje
podgrupa koristeći odreĎene kriterije važan je segment u analizi društvenih mreža.
Relacija je skup veza unutar članova grupe. Na primjer, skup prijateljskih veza izmeĎu
dvoje djece u razredu ili skup formalnih diplomatskih veza izmeĎu dvije države nacije su veze
4
koje definiraju relacije.Važno je naglasiti da se relacija odnosi na skup svih veza zadane vrste
koje mjerimo na parovima aktera iz odreĎenog skupa aktera. Veza sama po sebi postoji samo
izmeĎu odreĎenog para aktera.
Društvena mreţa. Sada kada imamo definirane pojmove poput aktera, grupe i relacije
možemo detaljnije definirati socijalnu mrežu. Društvena mreža, prema tome, sastoji se od
konačnog skupa ili skupova aktera i relacije ili relacija meĎu njima. Prisutnost relacija ključno je
svojstvo koje definira društvene mreže.[Wasserman i Faust, 1994., str. 19-21]
Kao primjer društvene mreže promotrimo sliku 2.1. koja prikazuje komunikaciju putem
e-maila izmeĎu 436 zaposlenika Hewlett-Packard istraživačkog laboratorija.Čvorovi, ovdje
prikazani crvenom bojom, predstavljaju zaposlenike te poznate kompanije povezane linijama
koje predstavljaju e-mailove koje su razmijenili.
Slika 2.1. Primjer društvene mreţe [Easley i Kleinberg, 2010., str. 3]
5
3. Teorija grafova
Grafovi su centralni element promatranja teorije grafova. Riječ graf u ovo smislu prvi je
put upotrijebio James Joseph Sylvester 1878. godine.
Graf je objekt koji nam na apstraktan način prikazuje neki skup elemenata čiji su parovi spojeni
vezama. U jeziku teorije grafova te povezane objekte nazivamo čvorovima ili vrhovima, a veze
koje ih sparuju bridovima. Tipično su grafovi prezentirani na način da točke prikazuju čvorove, a
ravne crte ili zakrivljene linije prikazuju veze [Gross i Yellen, 2003., str. 20].
3.1. Graf
Graf je ureĎeni par G=(V,E) gdje V predstavlja skup čvorova (engl. vertex), a E skup
bridova (engl. edge), za koje vrijedi E ⊆[V]2 pod pretpostavkom da E ∩ V = 0 [Diestel, 2005.,
str. 2].
Broj čvorova V kod grafa G predstavlja red grafa G. Grafove reda 0 ili 1 nazivamo
trivijalnima. Kako za potrebe rada na društvenim mrežama ne bi imalo smisla raditi s praznim ili
trivijalnim grafovima, takvim se grafovima nećemo baviti u ovom radu. Slikom 3.2. prikazujemo
jedan uobičajeni primjer grafa sa osam čvorova i devet veza kojim su vrhovi grafa meĎusobno
povezani.
Slika 3.1Primjer grafa(s osam vrhova i devet veza)
Jedno od ključnih svojstava koje nam je važno za analizu društvenih mreža je radili se o
usmjerenom ili ne usmjerenom grafu pa, iako ćemo razliku preciznije definirati kasnije,
objasnimo je sada primjerom. Ukoliko graf prikazuje skup ljudi okupljenih na nekom
neformalnom druženju ili zabavi, i povlačimo brid izmeĎu svako dvoje ljudi koji su se na toj
6
zabavi rukovali, onda se radi o neusmjerenom grafu, jer, zaista, ako se osoba A rukovala s
osobom B onda vrijedi i obrnuto, zbog čega je ta veza simetrična. Ako pak veza predstavlja
činjenicu da li osoba Apoznaje osobu B, onda će se raditi o usmjerenom grafu jer ovakva vrsta
povezanosti nije nužno simetrična. I zaista, ako osoba A zna za osobu B nije nužan slučaj da
osoba B zna za osobu A.
3.2. Tipovi grafova
3.2.1 Neusmjereni graf
Kod ovakvog grafa bridovi nemaju orijentacije, što znači da nisu zadani ureĎenim parom
čvorova koje spajaju, već samo skupom dvaju čvorova {vi, vj}.
3.2.2 Usmjereni graf
Usmjereni graf ili digraf je ureĎeni par D=(V,A) gdje ve predstavlja skup čvorova, a
ureĎene parove iz skupa čvorova koje nazivamo usmjerenim bridovima. Brid a = (x,y) smatra se
usmjerenim od x do y; y je direktni sljedbenik x, a x je direktni prethodnik y. Brid koji
označavamo s (y,x) nazivano invertirani brid (x,y). Jednostavan prikaz usmjerenog grafa koji se
sastoji od tri vrha i tri usmjerene veze možemo vidjeti na slici 3.2.
.
Slika 3.2 Usmjereni graf
7
3.2.3 Miješani graf
Miješani graf je graf u kojem su neki bridovi usmjereni, a neki ne, a piše se kao
usmjerena trojka G=(V,E, A) gdje je V skup čvorova, E predstavlja skup neusmjerenih bridova,
dok A predstavlja skup ureĎenih parova iz skupa čvorova, odnosno usmjerene bridove.
3.2.4 Multigraf
Petlje (refleksivne veze) su bridovi, usmjereni ili neusmjereni, kojima je početni i završna
točka isti čvor. One mogu, ali i ne moraju biti dozvoljene ovisno o primjeni. Izraz multigraf
označava da je riječ o grafu u čijem su prikazu dozvoljeni višestruki bridovi, te slučaj kada su
dozvoljene i petlje.
3.2.5 Jednostavni graf
Ako nije naznačeno drukčije, kada se spomene graf pretpostavlja se da je riječ o
jednostavnom grafu. To je neusmjereni graf u kojem nema petlji i nema više od jedne veze
izmeĎu dva čvora. Kod jednostavnog para svaki je brid zadan parom različitih čvorova. Kod
ovakvih grafova s n čvorova, svaki čvor ima broj veza manji od n. Slikom 3.3. prikazujemo
jedan jednostavan graf s tri vrha.
Slika 3.3 Jednostavan graf (ujedno i neusmjereni graf)
8
3.2.6 Težinski grafovi
Postoje slučajevi kada je potrebno pojedinom bridu dodijeliti odreĎenu (brojčanu)
vrijednost. One mogu predstavljati, na primjer, cijene, udaljenosti, kapacitete ili slično. Tada
govorimo težinskim grafovima. Težina grafa je suma vrijednosti dana svakom pojedinom bridu.
3.3. Susjedni čvorovi i bridovi
Čvorovi vi i vj su susjedni ako su povezani zajedničkim bridom, a bridovi ei i ej su,
analogno tome, susjedni ako imaju zajedničku krajnju točku odnosno zajednički čvor. Na
temelju susjednih čvorova i bridova izraĎujemo matricu incidencije [Biggs, 1993., str. 7].
3.4. Matrica incidencije
Neka je graf G definiran skupom čvorova {v1, v2,...,vn} i skupom bridova {e1, e2,...,em}.
Za svaki i, j (1 ≤ i ≤ n, i 1 ≤ j ≤ n) definiramo:
aij = 1, 𝑎𝑘𝑜 𝑝𝑜𝑠𝑡𝑜𝑗𝑖 𝑣𝑒𝑧𝑎 𝑖𝑧𝑚𝑒đ𝑢 𝑛𝑗𝑖ℎ
0, 𝑎𝑘𝑜 𝑣𝑒𝑧𝑎 𝑛𝑒 𝑝𝑜𝑠𝑡𝑜𝑗𝑖
Matrica A = [aij] predstavlja matricu incidencije grafa G [Barabási, 2012., str. 30].
Računalni programi koriste matrice incidencije za pohranu informacija o susjednim
čvorovima i bridovima te na temelju toga crtaju zadani graf. Matrice usmjerenih i neusmjerenih
mreža ponešto se razlikuju, kao što to vidimo u dolje navedenom primjeru. Kada govorimo o
matrici susjednosti za usmjerene mreže potrebno je napomenuti da:
Aij= iznosi 1 kada postoji veza koja kreće od čvora j prema čvoru i;
Aij = iznosi 0 ako čvorovi i i j nisu povezani jedan s drugim.
Matrica incidencije za neusmjerene mreže ima dvostruko definirane veze. Na primjer,
veza izmeĎu čvora v1 i čvora v2 prikazan je kao A12 i jednak je 1, a isto vrijedi i za A21 koji
takoĎer označava vezu izmeĎu čvorova v1 i v2 i iznosi 1 [Barabási, 2012., str. 31].
Prema tome, matrice incidencije za usmjerene grafove biti će simetrične. Ipak, kada je
riječ o matricama susjednosti za usmjerene grafove, to neće biti slučaj, kao što vidimo na slici
3.4.
9
Slika 3.4 Prikaz matrice incidencije za usmjerene i neusmjerene grafove[Barabási, 2012.,
str. 32]
10
4. Razvoj društvenih mreža kroz povijest
Iako se značajniji interes za društvene mreže javlja tek u zadnjoj polovini prošlog
stoljeća, početci njihova razvoja zabilježeni su mnogo prije, ali ne kao znanost već kao interesno
područje ondašnjih sociologa. U ovom radu spomenut ćemo neke važnije autore i radove koji su
postavili temelje znanosti društvenih mreža te značajnije utjecali na njihov razvoj.
4.1. Frigyes Karinthy (1929.)
Prvi objavljeni tekst o društvenim mrežama nije bio znanstveni članak, već kratka priča
pod imenom „Lanci“ u djelu „Sve se promijenilo“ autora Frigyes Karinthyja, izdana 1929.
godine. U svom djelu „Lanci“ ovaj maĎarski autor iznosi stav da se svijet smanjuje, ali ne u
fizičkom smislu već u onom socijalnom. Tvrdi da su ljudi sve povezaniji kroz meĎusobna
poznanstva i da se na temelju tih prijateljstava formira gusta mreža prijateljstva i dovodi do
svjetske meĎupovezanosti. Predlaže da je, zahvaljujući tome, svakoga na Zemlji moguće
povezati kroz najviše pet meĎupoznanstava. Tu tvrdnju podupire time što u djelu opisuje kako je
njega samoga, kroz maksimalno pet poznanika, moguće povezati s bilo kojim dobitnikom
Nobelove nagrade. TakoĎer, s obzirom da poznatije osobe poput Nobelovaca imaju mnogo
poznanstava i društveno su utjecajniji, tvrdi da se na isti način može povezati i s bilo kojim
radnikom u Fordovoj tvornici.
Tek dvadeset godina kasnije Milgram provodi svoj eksperiment malog svijeta čime
Karinthy potvrĎuje kako je bio znatno ispred svog vremena kad je tvrdio da je promjenjiva
priroda ljudskih poznanstava posljedica društvenih istraživanja, razbijanja geografskih
ograničenja i razvoja novih tehnologija koje nam omogućuju da ostanemo u kontaktu iako smo
udaljeni tisućama kilometara [Newman, Barabási i Watts, 2005., str. 10].
4.2. Jacob Moreno (1933.)
Moreno 1933. godine izdaje članak koji proučava dinamiku društvenih interakcija meĎu
grupama ljudi, čime zaslužuje titulu centralne ličnosti koja postavlja temelje moderne znanosti
društvenih mreža. Članak se smatra prvijencem na području analize društvenih znanosti, a
proučava interakcije izmeĎu učenika unutar pojedinog razreda od vrtićke generacije do osmog
11
razreda osnovne škole. Svakomdjetetu dano je na izbor da odabere suučenika s kojim bi željelo
nastaviti ići u razred i pored koga bi željelo sjediti.
Analizom prikupljenih podataka Moreno nam je uspješno prikazao evoluciju grupe te
otkrio da se unutar razreda kriju komplekse strukture koje su se bitno razlikovale od onoga što bi
se o grupi na prvi pogled moglo zaključiti. Osim toga izdvojio je i pojave različitih oblika
interakcije meĎu učenicima; neki od njih bili su potpuno izolirani, neki formirali parove, trokute
ili čak ulančane veze, a neki su bili dovoljno popularni da su bili centar zvjezdane
formacije.kako možemo vidjeti na slici 4.1.
Slika 4.1 Morenova zapaţanja o evoluciji grupe [Moreno, 1934., str. 30-42]
12
Osvrnimo se ukratko na Morenova zapažanja o evoluciji grupe. Zanimljivo je primijetiti
kako u grupi od 21 dječaka i 14 djevojčica prvog razreda ima relativno velik broj „zvijezda“
odnosno popularnije djece koji na sebe privlače velik broj veza, te velik broj prijateljstava
izmeĎu različitih spolova, dok pronalazimo mali broj parova. Već u trećem razredu osnovne
škole na jako sličnom uzorku možemo primijetiti kako se broj „zvijezda“ i prijateljstava izmeĎu
različitih spolova značajno smanjuje, kao što vidimo na donjem dijelu slike 4.1,te se taj trend
nastavlja sve do osmog razreda osnovne škole gdje ponovno vidimo da se formiraju prijateljstva
izmeĎu različitih spolova, iako u znatno manjem broju. Zanimljivo je kako se u istom razdoblju
stabilno povećava broj parova, odnosno uzajamnih prijateljstava i povezanosti s djecom iz drugih
razreda, što sa socio-emotivnog stajališta pokazuje kako se s razvojem ličnosti produbljuju
prijateljstva i šire interesi.
Izradom ovih dijagrama Moreno otkriva jedan novi pojam koji nam kasnije, točnije 1934.
godine, detaljnije objašnjava u svojoj knjizi pod nazivom „Who shall survive?“ (Tko će
preživjeti?).Riječ je o pojmu sociometrija koji u svojoj knjizi opisuje kao metodu za
kvantitativnu analizu socijalnih i interpersonalnih odnosa unutar grupe. Ona je eksperimentalna
tehnika koja mjeri društveno ponašanje, odnosno socijalno-emotivneodnose unutar promatrane
skupine. Naglasak se daje odnosima baziranim na meĎusobnom privlačenju, indiferentnosti ili
odbijanju izmeĎu članova skupine, na osnovu kojih se uspostavlja emocionalna struktura grupe.
4.3. Solomonoff i Rapoport (1951.)
Ova dva znanstvenika 1951. godine prvi put sistemski definiraju komponentu koju danas
nazivamo nasumični graf. Njihov rad važan je ne samo zbog toga što nam prvi put predstavljaju
nasumične grafove već i zato što prikazuje jedno od ključnih osobina modela, a to je pojava koja
se javlja ako se brojčvorova i bridova povećava, tada mreža doseže točku u kojoj se naglo
mijenja iz velikog broja nepovezanih dijelova u jedan veliki povezani graf koji u današnjoj
terminologiji zovemo divovska komponenta. Tako postavljaju temelje za mnoga buduća otkrića i
modernu analizu društvenih mreža.
Iako se u tekstovima često može pronaći da su divovska komponenta i nasumični graf
otkriće Erdősa i Renyija iz 1960. godine, nedvojbeno je da su Solomonoff i Rapoport mnoge
ključne pronalaske otkrili gotovo desetljeće ranije. Ipak, Erdős i Renyi u svojim istraživanjima
otišli su dalje od Solomonoffa i Rapoporta te zadržali viši nivo stručnosti [Newman, Barabási i
Watts, 2005., str. 11-12].
13
4.4. Erdős i Renyi (1960.)
Vjerojatno najvažniji tekst za razvoj analize društvenih mreža je tekst Erdősa i Renyia iz
1960. godine koji se bavi evolucijom strukture nasumičnih grafova kako se povećava broj veza
meĎu čvorovima.
Unatoč ranim doprinosima Solomonoffa i Rapoporta, teorija o nasumičnim grafovima
doživljava pravi uzlet tek kasnih 50ih i ranih 60ih godina kada se na tu temu pojavljuje nekoliko
važnih radova i to gotovo simultano. Ipak, meĎu njima, najutjecajnijim pokazali su se radovi
Paula Erdősa i Alfreda Renyia koji se danas smatraju začetnicima moderne teorije o nasumičnim
grafovima. Dva autora su kroz period od 1959. do 1968. godine izdali 8 znanstvenih radova koji
su postavili temelje istraživanja mreža za sljedećih nekoliko desetljeća. Jedan od tih radova,
izdan 1960. godine najvažniji je od njih jer se bavi evolucijom strukture nasumičnih grafova
povećavanjem broja veza meĎu čvorovima. Osim toga dokazuju da se, kada se dovoljno bridova
doda na graf, mnoga važna svojstva pojavljuju iznenadno, a ne postepeno kako bi intuitivno
očekivali [Newman, Barabási i Watts, 2005., str. 12].
4.5. Pool i Kochen (1978.)
Iako je Milgram daleko poznatiji po svojim istraživanjima na temu eksperimenta malog
svijeta, rad Poola i Kochena, napisan godinama ranije, ali objavljen tek 1978. godine, prvi put u
znanstvenim terminima definira fenomen poznat kao efekt malog svijeta. Ova dva znanstvenika
u svom radu podižu pitanja koja će još godinama biti predmet istraživanja znanstvenika tog
područja. Njihov članak započinje skupom pitanja o čovjekovom statusu u mreži i ta pitanja
danas definiraju polje društvenih mreža. Ta pitanja su sljedeća:
1) Koliko ljudi pojedina osoba iz mreže poznaje? Koji je broj veza pojedine osobe u mreži?
2) Kako su te veze rasporeĎene? Koja im je prosječna vrijednost, koliko iznosi najmanji a
koliko najveći broj veza pojedine osobe?
3) Kakvi pojedinci imaju najveći broj poznanstava? Jesu li te osobe najutjecajnije u mreži?
4) Kako su točno kontakti organizirani? Kakva je struktura mreže?[Newman, Barabási i
Watts, 2005., str. 15]
Ipak, najbitnija pitanja postavljaju prilikom proučavanja interakcija izmeĎu dvoje ljudi
unutar mreže. Istražuju koja je vjerojatnost da se dvoje nasumično odabranih pojedinaca iz
mreže poznaje. Nadalje proučavaju kolika je vjerojatnost da imaju zajedničkog prijatelja ukoliko
14
se inicijalno ne poznaju, te koji je najkraći put u lancu poznanika koji povezuje dvije nasumično
odabrane osobe. Tako postavljaju temelje za proučavanje pojave koja se u suvremenoj teoriji
društvenih mreža naziva efekt malog svijeta.
4.6. Travers i Milgram (1969.)
Premda je ideja o društvenim mrežama 50ih i 60ih godina prošlog stoljeća postajala sve
popularnijom u sociološkim krugovima, upravo ih je Milgram osvijestio i meĎu manje stručnim
krugovima svojim eksperimentom malog svijeta. Jedno od njegovih najranijih i najpoznatijih
istraživanja o ovom eksperimentu objavljeno je 1967. godine, ali značajnija djela i eksperimenti
nastaju tek nakon ostvarivanja suradnje s Jeffreyem Traversom. Ovaj je znanstvenik ponovio
Milgramove eksperimente i podupro tvrdnje detaljnijom i opsežnijom kvantitativnom
analizom.Članak u kojem su Milgram i Travers koautori, izdan 1969. godine, jasno i detaljno
objašnjava na koji su način proveli eksperiment malog svijeta.Sudionicima eksperimenta poslan
je formular i od njih je zatraženo da, nakon što ispune svoje podatke, isključivo preko svojih
poznanika dostave taj formular osobi koja je unutar njega odreĎena. Svaka sljedeća osoba trebala
je učiniti isto i tako sve dok formular ne dosegne svoje odredište.
Eksperiment je završio s 29% uspješnosti, odnosno 64 lanca, od ukupnih 294, uspješno su
dostavile formular na njegovo odredište. Duljina lanaca varirala je od 1 do 11, dok je prosječna
vrijednost iznosila 5.2, te je na temelju tog izračuna odreĎen pojam šest stupnjeva meĎusobne
udaljenosti. Diskutabilno je koliko su precizno sudionici eksperimenta samostalno pronašli
najkraći put. U stvarnosti, oni su prosljeĎivali formulare poznatoj osobi za koju su mislili da je
najbliža odredišnoj, ali lako se moglo dogoditi da je postojao neki drugi poznanik koji je, bez
njihovog znanja, bio direktno povezan s osobom koja je bila krajnje odredište. Stoga bi realna
meĎusobna udaljenost izmeĎu sudionika mogla biti i manja nego li je to eksperimentom
prikazano [Newman, Barabási i Watts, 2005., str. 16].
4.7. Derek de Solla Price (1965.)
Otprilike u isto vrijeme kada je Milgram razvijao eksperiment malog svijeta, Price se
posvetio svome radu koji društvenim mrežama pristupa na malo drukčiji način. On je proučavao
jednu od najstarijih informacijskih mreža, mrežu citiranja unutar znanstvenih časopisa, u kojoj
15
svaki čvor predstavlja časopis a usmjerena veza od prvog čvora prema drugom označava da prvi
časopis citira drugog u svojoj bibliografiji.
Čini se da je Price bio prvi koji je sagledao uzorak citiranja kao mrežu i koji je
prezentirao detaljnu statističku analizu prikazane mreže. Zahvaljujući Eugeneu Garfieldu koji je
sastavio bazu podataka citata, i Priceu koji ih je prezentirao u svojoj analizi, kvaliteta podataka o
citatima znatno se poboljšala, što je rezultiralo time da i velik broj novijih istraživanja postane
kvalitetnijima [Newman, Barabási i Watts, 2005., str. 17].
4.8. De Castro i Grossman (1999.)
Posljednji u nizu povijesnih ličnostiza koje senavodi da su značajno utjecali na razvoj
znanosti društvenih mreža su autori De Castro i Grossman jer njihov rad sažima ideju koje su se
mnogi matematičari dotakli, ali je nikada nisu formalno istražili. Riječ je o Erdősovom broju,
tako nazvanom u čast maĎarskog matematičara Paula Erdősa, kojeg smo spomenuli ranije i koji
slovi za jednog od najproduktivnijih autora matematičkih radova. Erdősov broj je način
opisivanja suraĎivačke djelatnosti i godinama je bio popularna tema ležernih okupljanja u
matematičkim krugovima, a De Castro i Grossman su mu dali formalno značenje.
Broj se definira na sljedeći način: Kako bi mu bio dodijeljen Erdősov broj, autor mora
napisati znanstveni rad u suradnji s autorom koji ima konačan Erdősov broj. Sam Paul Erdős ima
Erdősov broj 0.Kako je za života napisao oko 1500 matematičkih članaka, uglavnom u suradnji s
drugim autorima, imao je 504 izravnih suradnika i to su ljudi s Erdősovim brojem 1. Autori koji
su suraĎivali s njima,ali ne i sa samim Erdősom, imaju Erdősov broj 2, a to je skupina od6 593
čovjeka. Dalje, analogno tome, oni koji su suraĎivali s ljudima koji imaju Erdősov broj 2, ali ne i
sa samim Erdősom ili bilo kime tko ima Erdősov broj 1, imaju Erdősov broj 3 i tako dalje. Osoba
koja ne sudjeluje ni u jednom takvom lancu suradništva koje ga povezuje s Erdősom ima
nedefiniran ili beskonačan Erdősov broj [Oakland University, 2010].
16
Slika 4.2 Prikaz načina dodjeljivanja Erdősovog broja
S porastom interesa za društvene mreže Erdősov broj se pomaknuo od matematičke
anegdote u ozbiljniju znanstvenu studiju. Na ovaj način demonstriran je još jedan prikaz efekta
malog svijeta, u kontekstu znanstvene zajednice.
17
5. Vizualizacija mreža
Nakon što prikupimo podatke o mreži koju promatramo potrebno ih je prezentirati na
načina koji je razumljiv kako bi sproveli rezultate analize. U tu svrhu koristimo vizualizaciju
društvenih mreža. Iako se vizualizacija može sprovoditi ručno, zbog velikog broja podataka to bi
u većini slučajeva bilo nemoguće zbog čega se istraživač odlučuje za neki od mnogobrojnih
softvera za vizualizaciju ovisno o prirodi i svrsi istraživanja koje provodi.
Tipični reprezentanti podataka o mreži su grafovi formirani u obliku mreže koji se
najčešće sastoje od jako velikog broja čvorova i veza. Sukladno tome, nisu lako čitljivi vizualni
prikazi i nije ih moguće intuitivno interpretirati. Zbog toga se koriste različite forme ne bi li se ti
kompleksni grafovi učinili što jasnijima i razumljivijima, kako čitatelju tako i samom
istraživaču. Prezentiranjepodataka izvršava se pomoću prikazivanja čvorova i veza izmeĎu njih u
različitim rasporedima. TakoĎer je moguće poslužiti se bojama koje opisuju svojstva pojedinih
čvorova, te veličinom i drugim naprednim opcijama prikazati vrijednosti odreĎenog čvora u
odnosu na ostale u mreži .
5.1. Softver za analizu društvenih mreža
Vizualno prikazivanje društvenih mreža važno je za razumijevanje prikupljenih podataka
i za provoĎenje rezultata analize. Vizualizacija se često koristi kao dodatna ili čak samostalna
metoda za analizu podataka. Softver za analizu društvenih mreža koristi se za prepoznavanje,
prezentiranje, analiziranje, vizualiziranje ili simuliranje čvorova i bridova iz različitih tipova
ulaznih podataka, uključujući i matematičke modele društvenih mreža. Korisno je što se izlazni
podaci mogu spremati na vanjskim datotekama što olakšava rad s jako velikim količinama
podataka koje je ponekad potrebno prikazati. Alati za analizu mreža omogućuju istraživačima da
proučavaju mreže svih veličina, od onih malih, poput obitelji ili projektnih timova, do jako
velikih poput, na primjer, Interneta ili širenja bolesti. Različiti alati pružaju matematičke i
statističke procedure koje se mogu primijeniti na modelu mreže. S obzirom na to što želimo
prikazati, alati za vizualizaciju mreža koriste se za promjenu izgleda, boja, veličina i drugih
svojstava prikaza mreže [Hogan, Carrasco i Wellman, 2007., str. 116].
Mnogo je primjera softvera za analizu mreža, te je velik broj njih specijaliziran za
odreĎeno područje istraživanja. U ovom radu korišten je Gephi, o kojem ćemo nešto više reći u
nastavku.
18
5.1.1 Gephi
Gephi je jedan od mnogobrojnih primjera softvera za analizu i vizualizaciju društvenih
mreža. Točnije, on je platforma za interaktivnu vizualizaciju i istraživanje svih vrsta mreža i
složenih sustava, dinamičnih i hijerarhijskih grafova, te ga mogu koristiti svi oni koji žele
istraživati i razumjeti grafove. Prilikom korištenja ovog programa korisnik aktivno mijenja
dobiveni prikaz, manipulira strukturu, boje i oblike kako bi prikazao, ili pak uvidio, svojstva
mreže, koja u početku možda nisu bila vidljiva. Koristi 3D render engine za prikaz velikih mreža
u realnom vremenu i za ubrzavanje istraživanja podataka. Fleksibilna i multi-tasking arhitektura
omogućava mu rad s kompleksnim skupovima podataka i prikaz vrijednih vizualnih rezultata.
Ovo je besplatan program koji se može pokrenuti na bilo kojem sustavu koji podržava Javu 1.6 i
OpenGL[Gephi Team, 2008].
19
6. Dinamička vizualizacija komunikacijskih trendova na blogovima
Za potrebe ovog rada odabranje prikaz komunikacije izmeĎu blogova kroz vrijeme. Svi
blogovi su sa stranice blog.hr, a pod komunikacijom razumijevamo komentare koje si ostavljaju.
Podaci o komentarima i pripadajućim blogovima prikupljaju se pomoću programa pretraživača i
spremaju u bazu podataka. Jednom prikupljeni podaci eksportiranisu u Gephi datoteku te je
pomoću Gephi alata za vizualizaciju napravljen njihov vizualni prikaz. Cilj je bio, u obliku
videa, prikazati kako se komunikacija na blogovima razvijala kroz vrijeme. Kako Gephi nema
mogućnost izrade videa, dodatnim malim programom napravljen je niz slika te su one spojene u
video kojim je prikazana komunikacija izmeĎu prikupljenih blogova.
6.1. Prikupljanje podataka pomoću programa pretraživača
Podaci o komunikaciji izmeĎu blogova prikupljeni su s blog.hr servisa, koji je jedan od
starijih servisa za blogging u Hrvatskoj. Kratko ćemo se osvrnuti na strukturu blog stranica koje
se na njemu nalaze. Pojedina blog stranica sastoji se od zapisa od strane korisnika, koje
nazivamo blog postovima, i komentara na pojedini zapis. Iako blog.hr servis pruža nekoliko
unaprijed sastavljenih izgleda, odnosno predložaka, sam izgled stranice, broj postova na stranici i
navigacija blogom odreĎeni su od strane korisnika što rezultira velikim brojem raznolikih
stranica. Ipak, stranica s komentarima na pojedini post odreĎena je od strane blog.hr servisa,
jednaka je za sve blogove, a možemo joj pristupiti preko linka koji se u pravilu nalazi na kraju
svakog blog posta. Slikom 6.1. prikazujemo izgled nekoliko vrlo različitih blog stranica koje
smo pronašli na spomenutom servisu.
20
Slika 6.1 Različiti blogovi na blog.hr servisu
Struktura blogova usmjerila je dizajn programa pretraživača. Prikupljanje podataka
napravljeno je tako da proces obrade jednog bloga generira dodatne blogove za obradu. Početni
blog odabran je nasumično meĎu trenutno predstavljenim blogovima na stranicama blog.hr-a.
Cilj je bio prilikom obrade bloga pronaći sve blog postove i sve komentare koji se na njemu
nalaze. Kako se struktura blog stranice uvelike razlikuje od bloga do bloga, program pretraživač
pomoću nekoliko jednostavnih pravila prolazi kroz sve dostupne stranice koje pripadaju
pojedinom blogu. Srećom, kako smo već spomenuli, svi blogovi imaju link na stranicu s
komentarima na pojedini blog post. Struktura ove stranice odreĎena je blog.hr servisom uvelike
olakšavajući prikupljanje podataka iz komentara. Na slici 6.2. možemo vidjeti izgled stranice s
komentarima koja je jednaka za sve blogove.
21
Slika 6.2 Stranica s komentarima ureĎena od strane blog.hr servisa
Program pretraživač je napisan u Javi. Koristi jsoup za parsiranje HTML-a (engl.
Hypertext Markup Language), te activejdbc za komunikaciju s MySQL bazom. Prilikom rada
prolazi kroz zadani blog prikupljajući sve stranice koje mu pripadaju, na taj način prikupljajući i
sve dostupne komentare. Prilikom skupljanja komentara, kako je već spomenuto, prikupljaju se i
novi blogovi za obradu. Pojednostavljeni prikaz rada programa pretraživača prikazan je slikom
6.1.
Slika 6.3 Pojednostavljeni rad programa pretraţivača
Rad programa pretraživača ukratko se može opisati na sljedeći način:
Ima li u bazi podataka u tablici blogova neobrađenih blogova?
Obradi prvi neobrađeni blog
Učitaj URL bloga
Obradi stranicu
Pronađi sve valjane linkove i upiši ih u tablicu link_todo
Pronađi sve komentare
Koji je blog autor komentara?
Ako taj blog ne postoji u tablici blogova dodaj ga
Dodaj komentar u tablicu komentara
Ima li valjanih linkova u tablici link_todo?
22
Obradi stranicu
Zapiši da je blog obrađeni i vrati se na početak
Započinjemo s petljom koja se izvršava dok u tablici blogova ima neobraĎenih blogova.
Prilikom svake iteracije te petlje iščita se URL (engl. Uniform Resource Locator) jednog
neobraĎenog bloga te se taj blog krene obraĎivati. Pritom se učita navedeni URL, te se na njemu
obavlja pronalaženje linkova i komentara. Kroz proces pronalaženja linkova učitana stranica se
pregledava za linkove koji ispunjavaju odreĎene uvjete, a ti su da pripada blogu kojeg
obraĎujemo ili da vodi na stranicu s komentarima. Ukoliko link ispunjava jedan od ovih uvjeta i
pritom nije već zapisan u link cache tablicu, dodaje se u tablicu link _todo. Postoji poseban
slučaj kada pronaĎeni link vodi na neki drugi blog. Tada ga zapisujemo u tablicu blogs odnosno
zapisujemo ga za buduću obradu. Nakon pronalaženja linkova na stranici se izvršava
pronalaženje komentara. Proces pronalaženja komentara traži specifične HTML elemente koji
odgovaraju strukturi komentara na stranici s komentarima odreĎenima od strane blog.hr servisa.
Nakon što pronaĎemo komentar, podatke o njemu upisujemo u tablicu komentari (comments).
Isto tako, ukoliko pronaĎemo neki blog s kojim se dosada nismo susreli i njega zapisujemo u
tablicu blogova za buduću obradu. Time završavamo pronalaženje komentara. Nakon obrade
ovog prvog URL-a ulazimo u drugu petlju koja se izvršava dok god ima još linkova u tablici
link_todo. Ukoliko ima, učita se URL iz link_todo i ponovno se na njemu izvršava pronalaženje
linkova i pronalaženje komentara. Zatim se taj link izbriše iz tablice list_todo. Završetkom ove
petlje prazni se link_cache te se blog navodi kao obraĎen.
6.2. Eksport u Gephi
Kako bi vizualno prikazali podatke o komunikaciji meĎu blogovima prikupljene pomoću
programa pretraživača, bilo je potrebno podatke spremljene u bazu podataka pretvoriti u format
razumljiv Gephi programu. To je .gexf format datoteke. Eksportiranje se obavlja tako da se šalje
upit u bazu podatakakojim se učitavaju svi zapisani blogovi, te stvaraju čvorovi počevši od
onoga kojem je datum nastajanja najstariji. Nakon toga eksporter prolazi kroz sve komentare iz
baze i zapisuje ih kao vezeu .gexf formatu. Na taj način nastaju novi čvorovi i veze izmeĎu njih.
Veze izmeĎu blogova dodaju se na način da gledamo postoji li već veza izmeĎu čvora i i čvora j.
Ukoliko veza ne postoji dodajese. Ako je veza postojala prije, tada se mijenja težina tako da ae
povećava za jedan i zapisuje vrijeme kada se težina veze izmeĎu blogova promijenila. Na kraju
svi podaci se ispisuju u .gexf formatu datoteke.
23
6.3. Obrada u Gephi
Nakon pripreme u .gexf format podaci se mogu učitati u Gephi alatu za vizualizaciju. Naš
rad u Gephiju biti će spremljen kao Gephi projekt te će se taj oblik kasnije koristiti prilikom
stvaranja videa kojim je vizualno prikazana komunikacija kroz vrijeme. Prikupljeni podaci dalje
su obraĎivani ne bi li iz njih dobili što više informacija. Tako su za naš graf izračunati dodatni
atributi kao što su modularnost (engl. modularity) i blizina centriranosti (engl. closeness
centrality). Modularnost nam omogućuje lakše raspoznavanje podgrupa unutar grafa
dodavanjem različitih boja, pa su prikazani čvorovi različito obojani u boje skupine kojoj
pripadaju na osnovu izračuna modularnosti. Mjerom blizine centriranosti odreĎuje se veličina
čvora i to na način da što je neki blog veći označava da ima veći broj kratkih veza, odnosno da je
bolje povezan s drugim blogovima. Ove vrijednosti dodijeljene su pojedinom čvoru od samog
početka prikaza i ne mijenjaju se dalje kroz vrijeme. S druge strane, veze koje spajaju čvorove
mijenjaju se s obzirom na podatke zapisane u .gexf datoteci, te na grafu možemo vidjeti vrijeme
kada nastaju i promjene njihove težine ukoliko do nje dolazi. Osim postavljanja ovih vrijednosti,
učinjene su još neke dodatne male izmjene ne bi li naš graf bio pregledniji, pa je tako
pozadinapostavljena u crnu boju i omogućena je transparentnost veza.
6.4. Program za stvaranje prikaza dinamičke vizualizacije
Gephijeve mogućnosti za obradu dinamičkih grafova, u inačici koja je korištena u
vrijeme pisanja rada (0.8.2.-beta) su ograničene. Sam Gephijev modul za vizualizaciju nema
mogućnost izrade videa, i premda je moguće prikazati razvoj dinamičkog grafa unutar Gephijeve
radne površine, preciznost i kvaliteta prikaza su mnogostruko manji nego kada se koristi
Gephijev modul za vizualizaciju. Kako bi prikaz bio kvalitetan, iskorišten je taj Gephijev modul
kako bi se izgenerirao slijed od velikog broja slika koje su kasnije spojene u video.U realizaciji
je korištengephi toolkit library pomoću kojeg je moguće programski pristupiti svim
mogućnostima koje Gephi pruža. Za potrebe ovog rada korištena je nestabilnainačica (gephi-
toolkit-0.9-20130429.180226-105-all.jar) zbog nekoliko neispravnosti u aktualnoj stabilnoj
inačici. Program koji generira slike vizualizacije radi na jednostavan način; na početku se učitava
već pripremljeni Gephi projekt, postavlja se početni i krajnji datum vizualizacije, te radni datum
na početni datum. Pokreće se petlja koja će se izvršavati sve dok je radni datum raniji od
krajnjeg. Unutar petlje graf se filtrira na period od početnog datuma do radnog. Zatim se izvodi
50 iteracija algoritma za rasporeĎivanje – force atlas 2 – pri svakoj iteraciji izgenerira se .png
sličica prikaza grafa. Na kraju petlje radni datum se pomiče unaprijed za dan te se petlja
24
ponavlja. Jednom kada je proces gotov izgeneriran je slijed sličica koji prikazuje razvoj grafa u
intervalima od jednog dana pri čemu je jedan dan predstavljen s 50 sličica.
6.5. Rezultati obrade
Rezultat obrade prikupljenih podataka jest graf koji prikazuje kako se komunikacija
izmeĎu blogova mijenjala kroz period od 19.05. 2004. do 08.04.2013. Sadrži ukupno 11 152
čvora povezanih s 38 599 veza. Svaki čvor predstavlja jedan blog, a njegova veličina odreĎena je
vrijednosti blizine centriranosti koji sam Gephi izračunava za svaki pojedini čvor. Veza
predstavlja komentar izmeĎu dva bloga, a težina veze označava koliko je puta prvi blog ostavio
komentar na drugi blog. Što je veći broj komentara to će veza izmeĎu dva bloga biti deblja. Boja
koju odreĎeni blog nosi predstavlja pripadanje pojedinoj podskupini. Tu vrijednost nazivamo
modularnost, a izračunava je sam program. Konačan graf sa svim pripadnim česticama prikazan
je na slici 6.3.
25
Slika 6.4 Konačan graf
Rezultat dinamičke obrade komunikacijskih trendova meĎu blogovima je video isječak
kojim je prikazano kako se komunikacija razvijala kroz period od 19.05.2004. do 01.09.2006.
Razlog vizualizacije ovako skraćenogprikaza jest taj što je već i pri ovom isječku od otprilike
dvije godine, obrada podataka vremenski i memorijski poprilično zahtjevna, te je za prikaz ovih
28 mjeseci bilo potrebno dulje od jednog dana za obradu. Na ovaj način prikazan je usmjereni
graf koji se sastoji od 2 896 čvorova povezanih s 6 002 veze. I ovdje pojedini čvor predstavlja
blog čija je veličina odreĎena blizinom centriranosti koja je, kao i modularnost kojom je
odreĎena boja koja označava pripadnost skupini, konstantna za cijeli graf te se navedene
vrijednosti ne mijenjaju tijekom video prikaza. Promjene možemo vidjeti na debljinama veza
tako da pojedina veza postaje deblja kako se povećava broj komentara izmeĎu blogova. Razvoj
grafa od početnog do krajnjeg datuma video isječka možemo vidjeti na slici 6.4.
26
Slika 6.5 Razvoj grafa od početka do kraja video isječka
27
Već na prvi pogled uočavamo kako su pojedini blogovi formirali podgrupe.One su, radi
zornijeg prikaza, označne različitim bojama i predstavljaju povezanost unutar sebe. Ovdje je
važno napomenuti kako je formiranje podgrupa na prikazan način dijelom posljedica načina
prikupljanja podataka. Naime, od ukupnog broja čestica na cijelom grafu, potpuno ih je obraĎeno
samo 168. Prilikom obrade svakog pojedinog bloga čitaju se komentari koji mu pripadaju i u
listu blogova koje je tek potrebno obraditi zapisujemo blog koji šalje komentar. Dakle, blogovi
koji šalju komentare, ukoliko se nisu već ranije pojavili, u tom trenutku dospijevaju u bazu
podataka što znači da će biti prikazani na grafu, ali još nisu obraĎeni u punom smislu, s toga ne
znamo koji su blogovi njima ostavili komentare. Rezultat je da potpuno obraĎeni blogovi prema
sebi privlače velik broj onih koji su na njih komentirali, ali koji nisu obraĎeni u punom smislu, te
na taj način formiraju podgrupe koje možemo vidjeti na slici 6.4. Ipak, blogovi oko kojih se
formira podgrupa predstavljaju popularnije blogove meĎu onim obraĎenima.
28
7. Zaključak
Za potrebe ovog rada odabran je prikaz komunikacije izmeĎu blogova kroz period od 2004.
do 2013. godine.
Počevši s 19.05.2004. godine, s blog.hr servisa, pomoću programa pretraživača, prikupljeni
su komentari, odnosno podaci o autoru bloga koji komentira i vremenu komentiranja, te su ti
podaci spremljeni u bazu podataka.Iz baze podataka su eksportirani u Gephi datoteku, vizualno
prikazani u Gephiju te je dio njih obraĎen u konačan video prikaz. Kao početni blog nasumično
je odabran jedan od trenutno predstavljenih na stranicama blog.hr-a te se novi blogovi za obradu
pronalaze u komentarima. Ovaj način prikupljanja podataka u konačnici se pokazao manjkavim
zbog toga što finalna vizualna reprezentacija koja prikazuje graf od ukupno 11 152 čvora formira
podgrupe u čijem se centru nalaze blogovi koji su potpuno obraĎeni, odnosno oni blogovi čiji su
komentari u potpunosti pročitani. Ti blogovi na sebe privlače velik broj onih koji su na njih
komentirali, te iako su se blogovi koje nalazimo u centrima podgrupa filtrirali kao popularniji
meĎu obraĎenima, nije moguće tvrditi da su upravo oni najkomentiraniji blogovi upravo zbog
toga što se meĎu neobraĎenim blogovima možda kriju blogovi na koje je ostavljen znatno veći
broj komentara.
Iako su podaci o komunikacijskim trendovima prikupljeni za period od gotovo osam godina,
dinamička obrada prikazuje podatke za tek nešto više od dvije godine, točnije od 19.05.2004. do
1.09.2006. godine. Razlog tome je što je već i pri ovom, relativno malom vremenskom isječku
obrada podataka prilično zahtjevna te je za nju bilo potrebno dulje od jednog dana. Ipak, na
prikazanom isječku jasno vidimo kako pojedini blogovi nastaju, izmjenjuju komentare i s
vremenom formiraju podgrupe te nagovještavaju kako bi izgledao dinamički prikaz
komunikacijskih trendova za cjelokupan broj prikupljenih podataka.
29
Literatura
1. Barabási A. L., Network Science, PDF Version, November 2012., dostupno na
http://barabasilab.com/networksciencebook
2. Biggs N. (1993). Algebric Graph Theory, Second Edition, Cambridge University Press
3. Borgatti S. P., Mehra A., Brass D. J, Labianca G. (2009). Network analysis in the social
sciences. Science, 323(5916):892–895
4. Diestel R. (2005). Graph Theory, Third edition. Soringer-Verlag Heidelberg
5. Easley D., Kleinberg J. (2010). Networks, Crowds, and Markets: Reasoning about a
Highly Connected World, Cambridge University Press
6. Gephi Team, (2008). dostupno na https://launchpad.net/gephi
7. Gross J.L., Yellen J. (2003). Handbook of Graph Theory, CRC Press
8. Hogan B., Carrasco J., Wellman B. (2007). Visualizing Personal Networks: Working
with Participant-Aided Sociograms
9. Moreno J. (1934).Who shall Survive, Nervous and mental disease publishing co.
10. Newman M., Barabási A. L., Watts J. D. (2005). The Structure and Dynamics of
Networks, Princeton University Press
11. Oakland University, (2010). The Erdős Number Project, dostupno na
http://www.oakland.edu/enp/thedata/
12. Wasserman S., Faust K.(1994). Social network analysis: Methods and applications,
Cambridge University Press
30
Prilog – Programski kod
Work.java
1 package info.asy;
2
3 import info.asy.model.Blog;
4 import info.asy.model.Comment;
5 import info.asy.model.LinkCache;
6 import info.asy.model.LinkToDo;
7 import org.apache.commons.codec.digest.DigestUtils;
8 import org.apache.commons.validator.routines.UrlValidator;
9 import org.javalite.activejdbc.Base;
10 import org.javalite.activejdbc.Model;
11 import org.jsoup.Connection;
12 import org.jsoup.Jsoup;
13 import org.jsoup.nodes.Document;
14 import org.jsoup.nodes.Element;
15 import org.jsoup.select.Elements;
16
17 import java.io.IOException;
18 import java.text.ParseException;
19 import java.text.SimpleDateFormat;
20 import java.util.Date;
21 import java.util.List;
22 import java.util.Locale;
23
24 import static java.lang.System.out;
25
26
27 public class Work {
28
29 final int timeout = 10000; //timeout za spajanje na stranicu
30 final int fairPlayTime = 500; //koliko cekat izmedju dva dohvacanja
31 int retryLimit = 5; //koliko puta ce se pokusat spojit
32
33 List<Blog> blogs;
34 UrlValidator validator = new UrlValidator();
35
36 public void doStuff(){
37 Base.open("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/surfer_crawl",
"root", "cellar");
38
39 //ispisi sve neobradjene
40 blogs = Blog.find("processed = ?", false);
41 for(Blog blog : blogs){
42 out.println("unprocessed blog..." + blog.getString("url"));
43 }
44 //kreni obradjivat
45 int processedBlogCount = 0;
46 while(!Blog.find("processed = ?", false).isEmpty()){
47 processedBlogCount++;
48 Blog blog = (Blog) Blog.findFirst("processed = ?", false);
49 out.println("- - - N O V I B L O G - - -");
50 out.println("Obradjuem blog..." + blog.getString("url") + "\nkoji je
" + processedBlogCount + " obradjeni blog...");
51 obradiBlog(blog);
52 }
53 Base.close();
31
54 }
55
56 private void obradiBlog(Blog blog){
57 String blogUrl = blog.getString("url");
58 if(crawlPage(blogUrl, blog)){
59 while(LinkToDo.findFirst("") != null){
60 Model currentLink = LinkToDo.findFirst("");
61 crawlPage(currentLink.getString("url"), blog);
62 currentLink.delete();
63 }
64 blog.set("processed", true).saveIt();
65 clearLinkCache(blog);
66 LinkToDo.deleteAll();
67 }
68 else {
69 blog.set("error", true).saveIt();
70 out.println("Nije bilo moguce pristupiti blogu: " + blogUrl +
71 "\n napravit cu pauzu od 10 min i zatim pokusat sa slijedecim blogom...");
72 try {
73 Thread.sleep(600000);
74 } catch (InterruptedException e) {
75 e.printStackTrace();
76 }
77 }
78 }
79
80
81 private boolean crawlPage (String pageUrl, Blog blog){
82 String blogUrl = blog.getString("url");
83 out.println("\tCrawling page..." + pageUrl + "\n\ton blog..." + blogUrl);
84 //mali wait kako ne bi slali previse upita na blog.hr
85 try {
86 Thread.sleep(fairPlayTime);
87 } catch (InterruptedException e) {
88 e.printStackTrace();
89 }
90
91 Document page = null;
92 int retry = 0;
93 while (page == null && retry <= retryLimit){
94 try {
95 page = getPage(pageUrl);
96 } catch (IOException e) {
97 retry++;
98 out.println("Could not read page... retrying " + retry);
99 if (retry == retryLimit){
100 out.println("All retries have failed.");
101 out.println("Skipping page...");
102 return false;
103 }
104 }
105 }
106 extractLinks(blog, page);
107 extractComments(blogUrl, page);
108 return true;
109 }
110
111
112 private void extractComments(String blogUrl, Document page) {
113 Elements listComment = page.select("li[id^=comment]");
114 for(Element comment : listComment){
32
115 String fromBlog = null;
116 Date date;
117
118 out.println("\t\tComment:");
119 Element author = comment.select("a[href^=http]").first();
120 if (author == null){
121 out.println("\t\t\tNo author! Skipping...");
122 continue;
123 }
124 fromBlog = author.attr("href");
125 // provjerit ce je li blog s blog.hr i je li je validan url
126 // ovako izbjegava anonimne i ne-blog.hr komentare
127 if (!fromBlog.contains("blog.hr")){
128 out.println("\t\t\tBlog does not originate from blog.hr!");
129 continue;
130 }
131 else if (!validator.isValid(fromBlog)){
132 out.println("\t\t\tUrl is not valid! url:" + fromBlog );
133 continue;
134 }
135 out.println("\t\t\tfrom blog:" + fromBlog);
136 out.println("\t\t\tauthor: " + author.text());
137
138 String ispodPosta = comment.select("p.ispodposta").first().text();
139 try {
140 date = new SimpleDateFormat("dd.MM.yyyy. (HH:ss)",
Locale.ENGLISH).parse(ispodPosta);
141 out.println("\t\t\t date:" + date);
142 } catch (ParseException e) {
143 out.println("Could not parse date...");
144 continue;
145 }
146 addCommentToDatabase(fromBlog, blogUrl, date);
147 }
148 }
149
150 private void extractLinks(Blog blog, Document page) {
151 String blogUrl = blog.getString("url");
152 int currentDepth = blog.getInteger("depth");
153 Elements links = page.select("a[href]");
154 for (Element link : links) {
155 String href = link.attr("href");
156 if (validator.isValid(href)) {
157 if (!isLinkInCache(blog, href)) {
158 if (href.contains(blogUrl.replace("http://", ""))) {
159 LinkToDo.createIt("url", href);
160 } else if (href.contains("blog.hr/komentari")) {
161 LinkToDo.createIt("url", href);
162 } else if (href.contains("blog.hr/print") ||
href.contains("www.blog.hr") || href.contains("mailto:")) {
163 //linkOstali.add(link);
164 } else if (href.contains("blog.hr")) {
165 //bilo koji blog.hr url pretvorit u http://imebloga.blog.hr
166 out.println("\t\tHREF:" + href);
167 String[] splitHref = href.split("//");
168 String blogSubstring = href;
169 if (splitHref[1].contains("/")) {
170 /*ukoliko ima nastavak url npr. nekiblog.blog.hr/nesto/nesto.hr
171 izvuc samo nekiblog.blog.hr */
172 blogSubstring = href.substring(0, href.indexOf("/",
href.indexOf("//") + 2));
33
173 }
174 out.println("\t\tBLOG from href:" + blogSubstring);
175 addBlogToDatabase(blogSubstring, currentDepth + 1);
176 }
177 }
178 }
179 }
180 }
181
182 private Document getPage (String url) throws IOException{
183 out.println("Reading url " + url);
184 Connection soupCon = Jsoup.connect(url);
185 soupCon.timeout(timeout);
186 return soupCon.get();
187 }
188
189
190 private void addBlogToDatabase(String url, int depth){
191 if(Blog.find("url = ?", url).isEmpty()){
192 Blog.createIt("url", url, "processed", false, "error", false,
"depth", depth);
193 out.println("\tAdded blog " + url + " to database table blogs.");
194 }
195 else {
196 out.println("\tBlog " + url + "is already in the database table
blogs.");
197 }
198
199 }
200
201 private boolean isLinkInCache(Blog blog, String link){
202 if(LinkCache.find("md5 = ?", DigestUtils.md5Hex(link)).isEmpty()){
203 LinkCache.createIt("blog_id", blog.get("id"), "md5",
DigestUtils.md5Hex(link));
204 return false;
205 }
206 return true;
207 }
208
209 private void clearLinkCache(Blog blog) {
210 LinkCache.delete("blog_id = ?", blog.get("id"));
211 }
212
213 private void addCommentToDatabase(String fromBlog, String toBlog, Date date){
214 out.println("\t\t\tAdding comment to database from: " + fromBlog + " to:"
+ toBlog);
215 Model fromBlogFromDb = Blog.first("url = ?", fromBlog);
216 if (fromBlogFromDb == null){
217 out.println("fromBlog is not valid (no hits in db!)");
218 return;
219 }
220 Object fromBlogId = fromBlogFromDb.get("id");
221 Object toBlogId = Blog.first("url = ?", toBlog).get("id");
222 Comment.createIt("from_blog", fromBlogId, "to_blog", toBlogId, "date",
date);
223 }
224 }
ExportToGEXF.java
1 package info.asy.export;
34
2
3 import info.asy.model.Blog;
4 import info.asy.model.Comment;
5 import it.uniroma1.dis.wiserver.gexf4j.core.Edge;
6 import it.uniroma1.dis.wiserver.gexf4j.core.EdgeType;
7 import it.uniroma1.dis.wiserver.gexf4j.core.Gexf;
8 import it.uniroma1.dis.wiserver.gexf4j.core.Graph;
9 import it.uniroma1.dis.wiserver.gexf4j.core.Mode;
10 import it.uniroma1.dis.wiserver.gexf4j.core.Node;
11 import it.uniroma1.dis.wiserver.gexf4j.core.data.*;
12 import it.uniroma1.dis.wiserver.gexf4j.core.dynamic.TimeFormat;
13 import it.uniroma1.dis.wiserver.gexf4j.core.impl.GexfImpl;
14 import it.uniroma1.dis.wiserver.gexf4j.core.impl.StaxGraphWriter;
15 import it.uniroma1.dis.wiserver.gexf4j.core.impl.data.AttributeListImpl;
16
17 import java.io.File;
18 import java.io.FileWriter;
19 import java.io.IOException;
20 import java.io.Writer;
21 import java.util.ArrayList;
22 import java.util.Calendar;
23 import java.util.Date;
24 import java.util.List;
25
26 import org.apache.commons.validator.routines.UrlValidator;
27 import org.javalite.activejdbc.Base;
28 import org.javalite.activejdbc.LazyList;
29 import org.javalite.activejdbc.Model;
30 import org.joda.time.DateTime;
31
32 public class ExportToGEXF {
33
34 int nodeCount = 0;
35 int edgeCount = 0;
36
37 public void export(String fileName){
38 Base.open("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/surfer_crawl",
"root", "cellar");
39
40 List<Comment> allComments = Comment.findBySQL("SELECT * FROM comments
ORDER BY date ASC;");
41 List<Blog> allBlogs = Blog.find("processed = true");
42
43 Gexf gexf = new GexfImpl();
44 Calendar date = Calendar.getInstance();
45
46 gexf.getMetadata().setLastModified(date.getTime()).setCreator("Asy")
47 .setDescription("Prikaz blogova");
48
49 Graph graph = gexf.getGraph();
50 graph.setDefaultEdgeType(EdgeType.DIRECTED).setMode(Mode.DYNAMIC)
51 .setTimeType(TimeFormat.DATE);
52
53 AttributeList attrList = new AttributeListImpl(AttributeClass.EDGE);
54 attrList.setMode(Mode.DYNAMIC);
55 graph.getAttributeLists().add(attrList);
56 Attribute attWeight = attrList.createAttribute("weight",
AttributeType.FLOAT, "weight");
57
58 System.out.println("Found " + allBlogs.size() + " blogs...");
59 int currentBlog = 0;
35
60 for (Blog blog : allBlogs) {
61 System.out.println("Blog " + ++currentBlog);
62 List<Comment> listaKomentara = Comment.find("to_blog = ?",
blog.getInteger("id")).limit(1).orderBy("date ASC");
63 if (listaKomentara.isEmpty()){
64 continue;
65 }
66 DateTime prviKomentar = new
DateTime(listaKomentara.get(0).get("date"));
67 createNode(graph, blog.getString("url"), prviKomentar.toDate());
68 }
69
70 UrlValidator validator = new UrlValidator();
71
72 int currentComment = 0;
73 System.out.println("Found " + allComments.size() + " comments...");
74 for (Comment comment : allComments) {
75 System.out.println("Current comment:" + ++currentComment);
76 String fromNode = ((String)
(Blog.findById((comment.get("from_blog"))).get("url")));
77 String toNode = ((String)
(Blog.findById((comment.get("to_blog"))).get("url")));
78 if (validator.isValid(fromNode)) {
79 DateTime commentDate = new DateTime(comment.get(("date")));
80
81 if (findNode(graph, fromNode) != null) {
82 System.out.println("Node exists! " + fromNode);
83 } else {
84 System.out.println("Creating new node...");
85 createNode(graph, fromNode, commentDate.toDate());
86 }
87
88 if (findEdge(graph, findNode(graph, fromNode), findNode(graph, toNode)) != null)
{
89 Edge edge = findEdge(graph, findNode(graph, fromNode),
findNode(graph, toNode));
90 AttributeValueList edgeAtributi = edge.getAttributeValues();
91 AttributeValue dynWeight =
edgeAtributi.get(edgeAtributi.size() - 1);
92 DateTime datum = new DateTime(dynWeight.getStartValue());
93
94 int currentWeight = Integer.decode(dynWeight.getValue());
95 currentWeight++;
96
97 if (datum.getYear() == commentDate.getYear() && datum.getMonthOfYear() ==
commentDate.getMonthOfYear()
98 && datum.getDayOfMonth() == commentDate.getDayOfMonth()) {
99 System.out.println("Same date attribute detected!");
100 dynWeight.setValue("" + currentWeight);
101 } else {
102 AttributeValue newWeight =
edgeAtributi.createValue(attWeight, "" + currentWeight);
103 newWeight.setStartValue(commentDate.toDate());
104 }
105 } else {
106 Edge edge = findNode(graph, fromNode).connectTo("" +
edgeCount, findNode(graph, toNode));
107 edge.setEdgeType(EdgeType.DIRECTED);
108 AttributeValue dynWeight =
edge.getAttributeValues().createValue(attWeight, "1");
109 dynWeight.setStartValue(commentDate.toDate());
36
110 edgeCount++;
111 }
112
113 } else {
114 System.out.println("Url is malformed, skipping " + fromNode);
115 }
116 }
117
118 Base.close();
119
120 StaxGraphWriter graphWriter = new StaxGraphWriter();
121 File f = new File(fileName);
122 Writer out;
123 try {
124 out = new FileWriter(f, false);
125 graphWriter.writeToStream(gexf, out, "UTF-8");
126 System.out.println(f.getAbsolutePath());
127 } catch (IOException e) {
128 e.printStackTrace();
129 }
130 }
131
132 private Node createNode(Graph graph, String label, Date date){
133 Node newNode = graph.createNode("" + nodeCount);
134 newNode.setLabel(label);
135 newNode.setStartValue(date);
136 nodeCount++;
137 return newNode;
138 }
139
140 private Node findNode(Graph graph, String nodeName){
141 for(Node node: graph.getNodes()){
142 if(node.getLabel().equals(nodeName)){
143 return node;
144 }
145 }
146 return null;
147 }
148
149 private Edge findEdge(Graph graph, Node fromNode, Node toNode){
150 for(Edge edge : graph.getAllEdges()){
151 if(edge.getSource().equals(fromNode) && edge.getTarget().equals(toNode)){
152 return edge;
153 }
154 }
155 return null;
156 }
157 }
158
DynamicGephi.java
1 package info.asy.pictury;
2
3 import org.gephi.dynamic.api.DynamicController;
4 import org.gephi.dynamic.api.DynamicGraph;
37
5 import org.gephi.dynamic.api.DynamicModel;
6 import org.gephi.filters.api.FilterController;
7 import org.gephi.filters.api.Query;
8 import org.gephi.filters.api.Range;
9 import org.gephi.filters.plugin.dynamic.DynamicRangeBuilder;
10 import org.gephi.filters.spi.FilterBuilder;
11 import org.gephi.graph.api.Graph;
12 import org.gephi.graph.api.GraphController;
13 import org.gephi.graph.api.GraphModel;
14 import org.gephi.graph.api.GraphView;
15 import org.gephi.io.exporter.api.ExportController;
16 import org.gephi.io.exporter.preview.PNGExporter;
17 import org.gephi.io.importer.api.ImportController;
18 import org.gephi.layout.plugin.AutoLayout;
19 import org.gephi.layout.plugin.forceAtlas2.ForceAtlas2;
20 import org.gephi.layout.plugin.forceAtlas2.ForceAtlas2Builder;
21 import org.gephi.preview.api.PreviewController;
22 import org.gephi.preview.api.PreviewModel;
23 import org.gephi.project.api.ProjectController;
24 import org.gephi.project.api.Workspace;
25 import org.joda.time.DateTime;
26 import org.openide.util.Lookup;
27
28 import javax.imageio.ImageIO;
29 import java.awt.*;
30 import java.awt.image.BufferedImage;
31 import java.io.File;
32 import java.io.IOException;
33 import java.net.URISyntaxException;
34 import java.nio.file.Files;
35
36 public class DynamicGephi {
37
38 final Font consolasFont = new Font("Consolas", Font.PLAIN, 12);
39 int fileCount = 0;
40
41
42 public void run(){
43 //pokreni projekt - workspace
44 //dijelovi ovog koda su adaptirani sa gephi toolkit wikija
45
46 ProjectController pc =
Lookup.getDefault().lookup(ProjectController.class);
47 pc.newProject();
48
49 if (pc.getCurrentProject() != null) {
50 pc.closeCurrentProject();
51 }
52 try {
53 File file = new
File(getClass().getResource("/resource/limitGephi1.gephi").toURI());
54 pc.openProject(file).run();
55 } catch (URISyntaxException e) {
56 e.printStackTrace();
57 }
58
59 Workspace workspace = pc.getCurrentWorkspace();
60
61 //kontoleri i model
62 ImportController importController =
Lookup.getDefault().lookup(ImportController.class);
38
63
64 //graph
65 GraphModel graphModel =
Lookup.getDefault().lookup(GraphController.class).getModel();
66
67 DynamicController dc =
Lookup.getDefault().lookup(DynamicController.class);
68 PreviewModel model =
Lookup.getDefault().lookup(PreviewController.class).getModel();
69
70 DynamicModel dynamicModel= dc.getModel();
71 DynamicGraph dynGraph =
dynamicModel.createDynamicGraph(graphModel.getGraph());
72 getDynamicInfo(dynamicModel, dynGraph);
73
74 DateTime startDatum = new DateTime(2004, 5, 19, 0, 0);
75 DateTime endDatum = new DateTime(2013, 4, 9, 0, 0);
76 DateTime curDate = startDatum;
77
78 FilterController filterController =
Lookup.getDefault().lookup(FilterController.class);
79 FilterBuilder[] builders =
Lookup.getDefault().lookup(DynamicRangeBuilder.class).getBuilders();
80 DynamicRangeBuilder.DynamicRangeFilter dynamicRangeFilter =
(DynamicRangeBuilder.DynamicRangeFilter) builders[0].getFilter();
81 Query dynamicQuery = filterController.createQuery(dynamicRangeFilter);
82 filterController.add(dynamicQuery);
83
84
85 while(curDate.isBefore(endDatum)) {
86 dynamicRangeFilter.setRange(new Range(startDatum.getMillis(),
curDate.getMillis()));
87 GraphView view = filterController.filter(dynamicQuery);
88 Graph filteredGraph = graphModel.getGraph(view);
89 System.out.println("filter range: " +
startDatum.toString("dd.MM.YYYY.") + " - " + curDate.toString("dd.MM.YYYY."));
90 System.out.println("filteredgraph info: \nEDGE COUNT:" +
filteredGraph.getEdgeCount()
91 + "\nNODE COUNT:" + filteredGraph.getNodeCount());
92 layoutGraph(graphModel, workspace, startDatum, curDate);
93 curDate = curDate.plusDays(1);
94 }
95 }
96
97 private void getDynamicInfo(DynamicModel dynamicmodel, DynamicGraph dynGraph) {
98 System.out.println("\tDa li je dynamic?" +
dynamicmodel.isDynamicGraph());
99 System.out.println("\tDynamic edges?" + dynamicmodel.hasDynamicNodes());
100 System.out.println("\tMIN: " + dynamicmodel.getMin() + " MAX:" +
dynamicmodel.getMax());
101 System.out.println("\tHIGH:" + dynGraph.getHigh());
102 System.out.println("\tLOW:" + dynGraph.getLow());
103 System.out.println("\tINTERVAL:" + dynGraph.getInterval());
104 System.out.println("\tNORMAL graph info: \n\tEDGE COUNT:" +
dynGraph.getUnderlyingGraph().getEdgeCount()
105 + "\n\tNODE COUNT:" +
dynGraph.getUnderlyingGraph().getNodeCount());
106 }
107
108 private void layoutGraph(GraphModel graphModel, Workspace workspace, DateTime
startDatum, DateTime curDatum) {
39
109 //vrti force atlas
110 System.out.println("Running forceAtlas");
111 ForceAtlas2 atlas2 = new ForceAtlas2Builder().buildLayout();
112 atlas2.setGraphModel(graphModel);
113 atlas2.setOutboundAttractionDistribution(true);
114 atlas2.setScalingRatio(2.0);
115 atlas2.setGravity(1.0);
116 atlas2.setThreadsCount(3);
117 atlas2.setJitterTolerance(1.0);
118 atlas2.setBarnesHutOptimize(false);
119 atlas2.setAdjustSizes(false);
120 atlas2.setLinLogMode(true);
121 AutoLayout.DynamicProperty dissuadeHubsProperty =
AutoLayout.createDynamicProperty("forceAtlas2.distributedAttraction.name",
Boolean.TRUE, 1f);
122 atlas2.initAlgo();
123 for (int i = 0; i <50 && atlas2.canAlgo(); i++) {
124 atlas2.goAlgo();
125 exportGraph(workspace, startDatum, curDatum);
126 }
127 atlas2.endAlgo();
128 }
129
130 private void exportGraph(Workspace workspace, DateTime startDatum, DateTime
curDatum) {
131 ExportController ec = Lookup.getDefault().lookup(ExportController.class);
132 PNGExporter pngExporter = (PNGExporter)ec.getExporter("png");
133 pngExporter.setWorkspace(workspace);
134 pngExporter.setWidth(1920);
135 pngExporter.setHeight(1080);
136 System.out.print(".");
137 File file = new File("imgs/test" + fileCount++ + ".png");
138 try {
139 ec.exportFile(file, pngExporter);
140 } catch (IOException e) {
141 e.printStackTrace();
142 }
143
144 //cekanje jer ponekad ne stigne pristupit upravo eksportiranom png-u
145 while(!Files.isReadable(file.toPath())) {
146 System.out.println("File could not be read, will wait 100ms and try
again...");
147 try {
148 Thread.sleep(100);
149 } catch (InterruptedException e) {
150 e.printStackTrace();
151 }
152 }
153 try {
154 BufferedImage image = ImageIO.read(file.toURI().toURL());
155 Graphics g = image.getGraphics();
156 g.setFont(consolasFont);
157 g.drawString("Vizualizacija 1 - Asja Stermsek", 10, 10);
158 g.drawString(startDatum.toString("dd.MM.YYYY.") + " - " +
curDatum.toString("dd.MM.YYYY."), 10, 24);
159 g.dispose();
160 ImageIO.write(image, "png", file);
161 } catch (IOException e) {
162 e.printStackTrace();
163 }
164 }
40
165 }
166