Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
SVEUČILIŠTE U ZAGREBU
FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA
ZAVRŠNI RAD br. 4463
Personalizirano filtriranje toka s društvene
mreže Twitter
Lovro Vidović
Zagreb, lipanj 2016.
Sadržaj
Uvod ....................................................................................................................... 1
1. Twitter................................................................................................................ 2
1.1. Povijest Twittera .......................................................................................... 3
1.2. Funkcionalnosti Twittera .............................................................................. 4
1.3 Različitost Twittera u odnosu na druge društvene mreže ............................. 5
1.4. Programska podrška za Twitter API – Twitter4j ........................................... 6
2. Lucene................................................................................................................ 7
2.1 Pregled komponenata aplikacije za pretraživanje ......................................... 8
2.2 Proces indeksiranja .................................................................................... 12
2.2.1 Struktura podataka Documents ............................................................ 13
2.2.2 Postupak analize dokumenta ............................................................... 16
2.2.3 Direktorij spremanja stvorenih indeksa ................................................. 18
2.3 Proces pretraživanja ................................................................................... 19
2.3.1 Izračun koeficijenata sličnosti prilikom pretraživanja ............................ 21
3. Razvijena aplikacija .......................................................................................... 22
3.1 Implementirana aplikacija ........................................................................... 23
3.1.1 Razred TwitterClass ............................................................................. 24
3.1.2 Razred Indexer ..................................................................................... 25
3.1.3 Razred Searcher .................................................................................. 27
3.1.4 Razred Email ........................................................................................ 28
3.1.5 Razred AppConstants .......................................................................... 30
3.2 Funkcionalni zahtjevi sustava ..................................................................... 31
3.3 Primjer rada aplikacije................................................................................. 35
3.4 Upute za instalaciju ..................................................................................... 40
Zaključak .............................................................................................................. 43
Literatura .............................................................................................................. 44
Sažetak ................................................................................................................ 45
Summary .............................................................................................................. 46
1
Uvod
Zadatak završnog rada jest implementirati programsku podršku koja će
omogućiti korisniku personalizirano filtriranje poruka (tweets) s društvene mreže
Twitter te isporuku samih poruka (tweets) korisniku u njegov sandučić elektroničke
pošte. Filtriranje se vrši na temelju ključnih riječi koje korisnik navodi. Ideja je da
korisnik periodički dobiva poruke s društvene mreže Twitter u sandučić
elektroničke pošte. Poruka će biti isporučena u korisnikov sandučić elektroničke
pošte ako do toga trenutka nije bila isporučena korisniku, a na temelju raznih
parametara je rangirana kao poruka koja odgovara najbolje ključnim riječima
unesenim od strane korisnika sustava. Ako se unutar definiranog vremenskog
perioda ne pojavi niti jedna nova poruka s Twittera koja pripada unutar k-najboljih
poruka (detaljan izračun koeficijenata i način pretraživanja poruka je objašnjen u
poglavlju o Luceneu, drugom poglavlju) ili se pojavi poruka koja je već bila
isporučena korisniku, korisnik ne dobiva nikakvu poruku elektroničke pošte. U
izradi praktičnog dijela rada korištene su Javine programske knjižnice otvorenog
koda Apache Lucene, Twitter4J i javax.mail. Apache Lucene je Javina programska
knjižnica namijenjena indeksiranju i pretraživanju teksta. Twitter4J je Javina
programska knjižnica koja omogućuje integraciju Java aplikacije s društvenom
mrežom Twitter čime je omogućeno dohvaćanje poruka s Twittera, objavljivanje
statusa i brojne druge mogućnosti koje su korisniku omogućene tijekom korištenja
društvenih mreža. Javax.mail je Javina programsku knjižnica za slanje
elektroničke pošte. U prvom poglavlju biti će opisana društvena mreža Twitter i
razne njegove pogodnosti te sama programska podrška (tj. bit će dan detaljniji
uvid u Javinu programsku knjižnicu Twitter4J). U drugom poglavlju biti će pobliže
prikazan sadržaj Javine programske knjižnice Apache Lucene te metode
indeksiranja i pretraživanja koje su korištene. Treće poglavlje daje detaljan uvid u
samu aplikaciju gdje se može vidjeti praktična primjena spomenutih Javinih
programskih knjižnica.
2
1. Twitter
Twitter je društvena mreža koja omogućuje registriranim korisnicima da
čitaju i objavljuju tekstualne poruke, takozvane tweetove. Tweetovi se mogu
primati preko Web stranice Twittera, SMS-a, elektroničke pošte ili iz određene
aplikacije koja ima mogućnost dohvaćanja tweetova i njihovo slanje. Također
između registriranih korisnika je moguće izmjenjivati direktne poruke koje su
vidljive samo korisnicima između kojih se poruka šalje. Korisnici koji nisu
registrirani imaju mogućnost čitanja tweetova ali nemaju mogućnost objavljivanja
istih niti slanja direktnih poruka drugim korisnicima. Twitter može biti korišten kako
u društvene tako i u poslovne svrhe. Vrlo je jednostavno objavljivanje vlastitih
informacijama o radnjama iz života i posjećenim lokacijama kako bi vaši prijatelji
mogli imati što više informacija o vama. Također, gledajući s poslovne strane,
Twitter kao društvena mreže se može koristiti za razašiljanje raznih novosti o
određenoj kompaniji, za interakciju između zaposlenika čime se na vrlo
jednostavan način postiže nekakva unutarnja integracija kompanije. Twitter
trenutno broji oko tristo milijuna korisnika čime spada u najpopularnije društvene
mreže današnjice [1]. Također, postoji programska podrška za brojne programske
jezike (u koje spada i Java) koji omogućuju integraciju osnovnih funkcionalnosti
Twittera u samu aplikaciju. Sama kompanija Twitter ima sjedište u San Franciscou
te broji oko 3 900 zaposlenika. Broj zaposlenika u zadnjih par godina znatno je
porastao čemu svjedoči rast popularnosti Twittera (Slika 1.2) [2].
Slika 1.1 Logo Twittera [1]
3
Slika 1.2 Rast zaposlenika kompanije Twitter [2]
1.1. Povijest Twittera
Društvena mreža Twitter je došla na tržište 2006 godine. Osnivači Twittera
su Jack Dorsey, Evan Williams, Biz Stone i Noah Glass [3] tadašnji zaposlenici
kompanije Odeo. Početna ideja je bila implementirati SMS (Short message servis)
koji bi omogućio komunikaciju između jedne osobe i grupe ljudi te je i samim time
bio namijenjen državama koje ne šalju mnogo SMS poruka. Raznovrsnim
istraživanjima i inovacijama pretvorio se u društvenu mrežu s brojnim drugim
funkcionalnostima osim samog slanja poruka. Početno ime društvene mreže je
bilo Status koje se ubrzo promijenilo u Twitter. Originalno ime proizvoda je bilo
twtrr. Prvi tweet je objavljen 21.3.2006 te je glasio: „just setting up my twtrr“.
Prototip Twittera je bio testiran kao poseban unutarnji servis za zaposlenike
kompanije Odeo. Javnosti je predstavljen u sedmom mjesecu 2006. godine. Ubrzo
nakon što je Twitter stekao široku popularnost, osnivači Twittera kao i ostali
zaposlenici kompanije Odeo koji su radili na tome projektu su preuzeli kompaniju
od raznih investitora te je nastala kompanija Twitter.
4
1.2. Funkcionalnosti Twittera
Tweet je poruka koja se sastoji od maksimalno 140 znakova. Razlog takvog
ograničenja proizlazi iz činjenice što je Twitter u početku bio usmjeren najviše
prema primanju i slanju poruka koristeći prijenosni telefon, te je i samim time u
tome ležala njegova posebnost i različitost od drugih sličnih proizvoda. Kako je
širom svijeta standardna veličina SMS poruka 160 znakova, osnivači Twittera su
se odlučili na takvo ograničenje kako korisnici ne bi dobivali više poruka za samo
jedan tweet. U tih 160 znakova, 20 znakova odlazi na korisničko ime pošiljatelja te
140 znakova za sam tweet [4].
Praćenje (Following)
Ukoliko se želi ući u interakciju s drugim članovima (registriranim
korisnicima) Praćenje je nužno. Ukoliko određeni korisnik „prati“ drugog
korisnika onda mu se pojavljuju raznovrsni tweetovi, koje objavljuje praćen
korisnik, na njegovoj početnoj stranici. Praćenje se izvodi pritiskom na
gumb Prati koji se nalazi na profilnoj stranici traženog korisnika ispod
profilne slike. Kako bi se došlo do traženog korisnika koristi se Twitterova
tražilica gdje se može pretraživati po imenu, prezimenu ili korisničkom
imenu tražene osobe. Također, traženje određenog korisnika može se
izvesti i preko drugih mreža jer Twitter uparuje određeni profil s adresom
elektroničke pošte te se tako mogu pronaći korisnici iz nekih drugih
domena. Možemo pronaći Twitter profil osobe za koju znamo adresu
elektroničke pošte ako je ujedno i ta adresa korištena prilikom registracije
na društvenu mrežu Twitter.
Odgovaranje (@ Replies)
Korisniku je omogućeno odgovaranje i sudjelovanje u diskusiji ukoliko
pročita zanimljiv (za njega) tweet. Normalni odgovori su korisnikova
mogućnost da sudjeluje u javnoj raspravi oko određenog tweeta. Mogu se
izvesti na dva načina. Korisnik može objaviti tweet koji započinje sa
@korisničkoime_autora_tweeta čime se referencira na određen tweet te
autor tweeta dobiva obavijest o referenciranju na njegov tweet te mu se taj
tweet pojavljuje na početnoj stranici. Također, kako bi se odgovorilo na
5
tweet može se pritisnuti na sivu strelicu na desnoj strani ispod tweeta.
Druga vrsta odgovora na tweet jest ugrađeni odgovor. Ugrađeni odgovor je
kombinacija normalnog tweeta i normalnog odgovora. Počinje sa tekstom
(kao običan tweet), a ne sa @korisničkoime_autora_tweeta. Unutar samog
teksta odgovora nalazi se @korisničkoime_autora_tweeta samo nije na
početku.
Slanje direktnih poruka (Direct Messages)
Direktne poruke predstavljaju privatne poruke koje su dostupne samo
pojedincima između kojih se šalju. Ne mogu se slati privatne poruke onim
korisnicima kaj nas ne prate.
Prosljeđivanje tweet-ova (Retweeting)
Retweeting se koristi ako želimo proslijediti određen tweet vlastitim
pratiteljima. Može se izvesti pritiskom na ikonu ili kopiranjem cijelog
tweeta i stavljanjem RT na početak.
Hashtags
Hashtag je posebna oznaka koja započinje sa znakom #. Twitter koristi
hashtagove kako bi se kategorizirali tweetovi te se samim time omogućuje
lakša pretraga tweetova koristeći Twitterovu tražilicu. Pritiskom na riječ koja
se nalazi odmah iza hashtag simbola prikazuju se svi drugi tweetovi
označeni s tom ključnom riječi. Hashtag se može naći bilo gdje unutar
tweeta (početak, kraj ili sredina) [5].
1.3 Različitost Twittera u odnosu na druge društvene mreže
Twitter, kao društvena mreže, je puno otvoreniji od ostalih društvenih
mreža, točnije, korisnici nisu ograničeni samo na one korisnike koji vežu iste
aktivnosti i poznanstva. Vrlo je lagano doći do informacija o bilo kojoj osobi koja je
registrirana na Twitteru, svejedno je radi li se o nekoj poznatoj ličnosti ili o nekom
6
drugom korisniku Twittera. Twitter predstavlja više nekakav profesionalan nego
osoban prostor za dijeljenje informacija stoga je i poslovna strana izraženija,
točnije mogućnost grupiranja zaposlenika i reklamiranja raznih podataka mnogih
kompanija. Najveća razlika u odnosu na druge društvene mreže je tekstualno
ograničenje od 140 znakova prilikom stvaranja tweeta u čemu leži i jedna od
najvećih posebnosti Twittera. Prilikom slanja privatnih poruka može se poslati
poruka veća od 140 znakova (tek je nedavno uvedeno otklanjanje ograničenja od
140 znakova za privatne poruke).
1.4. Programska podrška za Twitter API – Twitter4j
Kako bi se omogućila integracija funkcionalnosti društvene mreže Twitter u
Java aplikaciju nužno je uključenje Javine programske knjižnice otvorenog koda
Twitter4j u samu aplikaciju. Spomenuta programska knjižnica nudi ostvarenje
mnogobrojnih funkcionalnosti iz same aplikacije bez otvaranje službene početne
stranice Twittera odnosno bez korištenja grafičkog sučelja Twittera koje se
uobičajeno koristi za normalan rad sa Twitterom. Neke od osnovnih
funkcionalnosti koje su nam dostupne uključenjem Javine programske knjižnice u
projekt su: objavljivanje novih osobnih statusa (ne dužih od 140 znakova),
odnosno objavljivanja javnih poruka koje su svima dostupne (tweet), dohvaćanje
određenog broja javnih poruka s korisnikove početne stranice (gleda se zadnjih
nekoliko javnih poruka kronološki raspoređeno), slanje i primanje privatnih poruka
te pretraživanje javnih poruka na temelju unesenih ključnih riječi. Detaljan uvid u
programsku izvedbu spomenutih funkcionalnosti dostupan je na službenoj stranici
za programsku knjižnicu Twitter4j [6].
Prilikom pretraživanja javnih poruka na temelju ključnih riječi važnu ulogu
ima razred Query iz programske knjižnice Twitter4j koji predstavlja upit po kojemu
se pretražuje. Pretraživanje se vrši pomoću instance razreda Twitter koristeći
njegovu metodu search koja kao parametar prima instancu razreda Query. Ako
se ne navedu nikakvi parametri za upit, metoda search razreda Twitter vraća
određen broj javnih poruka (kronološki gledano). Za navedeni upit, osim ključnih
7
riječi po kojima se pretražuju javne poruke, mogu se postaviti i razni drugi
parametri upita poput: broja javnih poruka koje se mogu vratiti upitom (ograničenje
je na 100 poruka), određivanje krajnjeg datuma do kojeg se gledaju javne poruke
ili određivanje početnog datuma od kojeg se gledaju javne poruke koje se vraćaju.
Za pohranu povratne vrijednosti rezultata pretraživanja koristi se sučelje
QueryResult koje nudi metodu getTweets koja vraća kolekciju javnih poruka
koristeći razred Status (također iz Javine programske knjižnice Twitter4j).
2. Lucene
Lucene je Javina programska knjižnica koja nudi vrlo učinkovit mehanizam
pretraživanja teksta te je omogućena laka integracija samog pretraživanja u
raznovrsne aplikacije (web aplikacije, desktop aplikacije itd.). Mehanizam
pretraživanja i cjelokupni koncept Lucene je pisan u programskom jeziku Java.
Moguća je integracija Lucenea u druge programske jezike (C/C++, C#, Ruby, Perl,
Python itd.). Izuzev vrlo učinkovitog mehanizma pretraživanja Lucene je u
današnje vrijeme vrlo popularan među mnogobrojnim korisnicima zbog
jednostavnosti korištenja API-ja. Korisnik koji u svoju aplikaciju integrira Lucene
može komotno koristiti sve funkcionalnosti API-ja bez poznavanja pozadine
pretraživanja, odnosno bez poznavanja detalja o postupcima indeksiranja i
pretraživanja teksta. Također, Lucene nudi mogućnost pretraživanja raznovrsnih
formata datoteka (PDF, XML, Microsoft Word, HTML, tekstualnih), točnije, mogu
se pretraživati svi oblici datoteka iz kojih se može izvaditi tekstualna informacija.
Lucene je pokrenuo Doug Cutting, poznati programer i promotor tehnologija
otvorenog koda.
Ukoliko želimo unutar velikoga broja datoteka pronaći one datoteke koje
sadrže određene ključne riječi, intuitivan pristup bi bio iterativno prolaženje po
svakoj datoteci i određivanja sadrži li datoteka ključnu riječ ili nekakav izraz.
Naravno, takav pristup je vrlo neučinkovit i dugotrajan ukoliko imamo velik broj
datoteka za koje moramo odrediti sadrže li ključnu riječ ili ne. Mehanizam
pretraživanja teksta koji nudi Lucene je znatno napredniji od ovog intuitivnog
8
pristupa. Pretraživanje možemo podijeliti u dva osnovna djela, točnije u procese
indeksiranja i pretraživanja. Prilikom indeksiranja potrebno je doći do samog teksta
zapisanog u datotekama te ga pretvorit u oblik dokumenta koji je pogodan za rad
Lucenea. Indeksiranjem se pretvara tekst unutar datoteka u posebnu podatkovnu
strukturu koja omogućuje brzo pretraživanje čime se eliminira (intuitivan) proces
iterativnog pretraživanja sadržaja datoteka Proces pretraživanja je moguće raditi
nakon što je indeksiranje završeno. Lucene, prilikom pretraživanja, koristi
raznovrsne algoritme kako bi izračunao koeficijente sličnosti dokumenata koji
sadrže tekstualni sadržaj. Na temelju izračunatih koeficijenta Lucene izdvaja one
dokumente koji imaju najveću sličnost gledavši prema unesenim ključnim riječima
odnosno izrazima. Procesi indeksiranja i pretraživanja su detaljno opisani u
poglavljima 2.2 i 2.3.
2.1 Pregled komponenata aplikacije za pretraživanje
Slika 2.1 prikazuje „lanac“ komponenti i aktivnosti koje svaka aplikacija, koja
koristi mehanizam pretraživanja teksta implementiran u Javinoj programskoj
knjižnici Apache Lucene, mora implementirati.
9
Slika 2.1 Temeljne komponente mehanizma pretraživanja [8]
Dohvaćanje sadržaja dokumenata (Acquire Content)
Tijekom ove faze nužno je skupiti sve datoteke iz korisnikovog datotečnog
sustava koje trebaju proći proces indeksiranja, a samim time i proces
pretraživanja. Proces dohvata navedenih datoteka može biti jednostavan
ako su datoteke za koje se radi indeksiranje pohranjene u istom direktoriju
u datotečnom sustavu. U suprotnom slučaju (datoteke su raspršene na
raznim mjestima u datotečnom sustavu ili je za pristup određenim
10
datotekama i direktorijima potrebna autentifikacija) ova faza je dosta
složena za implementaciju. Lucene kao alat za pretraživanje teksta nema
ulogu u prikupljanju dokumenata iz datotečnog sustava koji će se indeksirati
već o tome mora voditi brigu ostatak aplikacije.
Stvaranje strukture podataka nužne za indeksiranje (Build Document)
Razred Document predstavlja strukturu podataka odnosno posebnu
jedinicu koju koristi Lucene prilikom indeksiranja. Svaka datoteka čiji tekst
se pretražuje mora prije procesa indeksiranja biti pretvoren u instancu
razreda Document. Struktura podataka tipa Document sastoji se od
posebnih polja koja specificiraju dodatna usmjerenja prilikom procesa
pretraživanja odnosno indeksiranja. Neka važnije polja su contents,
filename, filepath i title. Prilikom izvršavanja procesa indeksiranja,
ako se drugačije ne specificira, Lucene gleda polje contents koje
predstavlja tekstualni sadržaj dokumenta.
Postupak analize teksta koji je izložen indeksiranju (Analyze
Document)
Zadnji korak prije izvršavanja procesa indeksiranja je rastavljanje
tekstualnog sadržaja datoteke (sadržaj polja contents u strukturi
podataka Documents) na manje dijelove koje nazivamo tokeni. Svaki token
predstavlja riječ jezika u kojem je pisan dokument te se za svaki token
pamti redni broj riječi u dokumentu (position), redni broj početnog znaka
riječi odnosno tokena (offset) te duljina tokena (length). Postupak
određivanja riječi koja se smatra tokenom ovisi o vrsti „analizatora“ koji se
koristi prilikom analize teksta.
Proces indeksiranja dokumenata (Index document)
Tijekom indeksiranja stvara se posebna struktura podataka indeks u koju se
stavlja dokument. Indeks je posebna struktura podataka koju Lucene koristi
11
kako bi se omogućilo brzo pretraživanje teksta dokumenta. Detaljan
postupak indeksiranja je opisan u poglavlju 2.2.
Korisničko sučelje za pretraživanje (Search user interface)
Korisničko sučelje je vrlo važan dio aplikacije koja ima omogućen
mehanizam pretraživanja. Sučelje bi trebalo biti što jednostavnije
napravljeno kako bi korisnik uz što manje probleme mogao koristiti
aplikaciju za pretraživanje. Lucene ne nudi nikakvo osnovno korisničko
sučelje za pretraživanje već se korisničko sučelje mora izgraditi koristeći
neke druge metode Jave ili nekog drugog programskog jezika.
Izgradnja upita za pretraživanje (Build query)
Korisnik aplikacije unosi ključne riječi prema kojima se vrši pretraživanje.
Na temelju unesenih ključnih riječi stvara se instanca razreda Query koji za
Lucene predstavlja upit. Postupak parsiranja odnosno prevođenja unesenih
ključnih riječi izvršavaju metode razreda QueryParser čime se dobiva
Query odnosno upit kakvog ga vidi Lucene.
Pretraživanje na temelju upita (Search query)
Prilikom izvršavanja procesa pretraživanja Lucene koristi strukture
podataka izgrađene procesom indeksiranja te se na temelju upita (Query) i
njegovih ključnih riječi vrši pretraživanje. Lucene koristi dva teorijska
modela pretraživanja. Jednostavniji model, čisti Boolean model (engl. Pure
Boolean model) je onaj u kojem se određeni dokument prihvaća ako
zadovoljava upit ili ne prihvaća ako ne zadovoljava upit, nema nikakvih
izračuna koeficijenata sličnosti. Složeniji model pretraživanja je model
vektorskog prostora
(engl. Vector space model) gdje su upit i dokument modelirani kao vektori
te se sličnost vektora upita i vektora dokumenta računa kao udaljenost
12
između ta dva vektora. Lucene nudi mogućnost izbora korištenog modela
tijekom pretraživanja.
Prikaz rezultata korisniku (Render results)
Faza koja predstavlja prikaz dokumenata (koji zadovoljavaju upit) korisniku.
Dokumente dobivene procesom pretraživanja je pogodno sortirati po
koeficijentu sličnosti (ako se koristi model vektorskog prostora).
2.2 Proces indeksiranja
Slika 2.2 prikazuje postupak indeksiranja razdvojen u osnovne dijelove.
Prvo se tekstualni sadržaj dokumenta uzima iz datoteka i stavlja u polje (Field)
razreda Document. Zatim se provodi postupak analize dokumenta, odnosno
postupak razdvajanje teksta na tokene te se na kraju stvoreni tokeni dodaju u
indeks.
Slika 2.2 Tijek procesa indeksiranja [8]
13
2.2.1 Struktura podataka Documents
Kao što je već navedeno, ako želimo pretraživati datoteke datotečnog sustava,
odnosno njihov tekstualni sadržaj, proces indeksiranja je nužan. Kod indeksiranja
vrlo važnu ulogu ima struktura podataka tipa Document koja sadrži više
raznovrsnih polja (Field), ta polja sadrže tekstualni sadržaj dokumenata koji se
pretražuju. Lucene može učiniti 3 stvari sa svakim poljem unutar strukture
Document.
1. Indeksirati sadržaj polja (samo tekstualna polja se mogu indeksirati)
2. Ako je polje indeksirano, može sadržavati vektore pojmova (engl. Term
Vector) za dokument. Samim time se omogućuju neke naprednije
mogućnosti od izdvajanja dokumenata koji sadrže određenu riječ. Može se
gledati sličnost dokumenata računajući koeficijente sličnosti (računanje
koeficijenata je detaljno objašnjeno u poglavlju 2.3.1).
3. Odvojeno se zapisuje kopija sadržaja polja dokumenta u inačici koja nije
prošla proces analize (proces razdvajanja teksta na tokene). Ova
mogućnost je pogodna za ona polja dokumenta koja se prikazuju korisniku
nepromijenjena (npr. polje titles).
Polje unutar dokumenta, odnosno razred Field, je jedan od najvažnijih dijelova
procesa indeksiranja jer izravno sadrži vrijednosti koje će se indeksirati. Razred
Field nudi niz konstanti koji predstavljaju opis načina na koji će se tekstualni
sadržaj indeksirati.
Field.Index.ANALYZED
Konstanta navedena prilikom stvaranja objekta razreda Field koja
specificira analizatoru da rastavi tekstualni sadržaj dokumenta na tokene
koji se koriste za pretraživanje.
Field.Index.NOT_ANALYZED
14
Konstanta koja specificira da se radi indeksiranje teksta dokumenta ali da
se ne provodi tekst kroz postupak analize (rastavljanje na tokene) već da se
cjelokupni sadržaj polja gleda kao jedan token.
Field.Index.ANALYZED_NO_NORMS
Značenje ove konstante se poistovjećuje sa značenjem konstante
Field.Index.ANALYZED izuzevši spremanje informacija o važnosti
određenih polja, te informacije se ne spremaju u indeks.
Field.Index.NOT_ANALYZED_NO_NORMS
Značenje ove konstante se poistovjećuje sa značenjem konstante
Field.Index.NOT_ANALYZED izuzevši spremanje informacija o važnosti
određenih polja, te informacije se ne spremaju u indeks.
Field.Index.NO
Konstanta koja specificira da se polje ne može pretraživati.
Prilikom stvaranja indeksa Lucene (ako mu se drugačije ne specificira) zapisuje
sve informacije kako bi se stvorio model vektorskog prostora (broj pojavljivanja
traženog izraza i njegova pozicija u dokumentu). U slučaju izrade mehanizma
pretraživanja koji koristi čisti Boolean model nije potrebno zapisivati komponente
bitne za model vektorskog prostora što se može jednostavno specificirati u radu
Lucenea.
Prilikom stvaranja objekta razreda Field možemo odrediti da li želimo da se
vrijednost teksta koji se nalazi u polju zapiše u indeks. Za to su zaslužne
konstante Field.Store.YES i Field.Store.NO. Ako je vrijednost zapisana u
indeksu (Field.Store.YES), vrijednost se može ujedno i vratiti prilikom procesa
pretraživanja, u suprotnom slučaju originalna vrijednost se ne može vratiti.
Kako kod stvaranja indeksa Lucene koristi model vektorskog prostora za
pretraživanje, kod stvaranja instance razreda Field možemo, pomoću konstanti,
15
specificirati i način na koji se vektori riječi (engl. Term Vector) računaju, točnije
možemo specificirati što sve ulazi u njihov izračun. Svako polje (Field) ima
vlastiti vektor riječi koji sadrži određenu listu pojmova teksta unutar polja. Svaki
vektor pojmova sadrži identifikacijski broj dokumenta koji se indeksira i izraze,
odnosno tokene koji su nastali postupkom analize. Za svaki token vektor riječi
može sadržavati poziciju u dokumentu, udaljenost od početka dokumenta (engl.
offset) i broj ponavljanja same riječi u dokumentu. Navođenje podataka koje će
sadržavati vektor riječi za svaki token određuje se konstantama razreda Field
navedenih unutar konstruktora.
Field.TermVector.YES
Konstanta koja specificira pamćenje tokena unutar vektora pojmova te
spremanje informacije o broju ponavljanja riječi u dokumentu. Pozicija riječi
i udaljenost od početka dokumenta se ne pamte.
Field.TermVector.WITH_POSITIONS
Konstanta koja specificira pamćenje tokena unutar vektora pojmova te
spremanje informacije o broju ponavljanja riječi u dokumentu i poziciji riječi
unutar dokumenta. Udaljenost od početka dokumenta se ne pamti.
Field.TermVector.WITH_OFFSETS
Konstanta koja specificira pamćenje tokena unutar vektora pojmova te
spremanje informacije o broju ponavljanja riječi u dokumentu i udaljenosti
od početka dokumenta. Pozicija riječi se ne pamti.
Field.TermVector.WITH_POSITIONS_OFFSETS
Konstanta koja specificira pamćenje tokena unutar vektora pojmova te
spremanje informacije o broju ponavljanja riječi u dokumentu, udaljenosti od
početka dokumenta i poziciji riječi unutar dokumenta.
Field.TermVector.NO
Konstanta koja određuje da se ne zapisuje niti jedna informacija unutar
vektora pojmova.
16
2.2.2 Postupak analize dokumenta
Analiza dokumenta je postupak kojim se tekstualni sadržaj dokumenta rastavlja
na osnovne izraze korištene kod indeksiranja, odnosno tokene. Tokeni dobiveni
postupkom analize dokumenta se koriste prilikom pretraživanja teksta kako bi se
odredilo odgovara li dokument ključnim riječima po kojima se vrši pretraživanje.
Analizator vrši analizu dokumenta izdvajanjem riječi iz teksta, izbacivanjem
interpunkcijskih znakova, brisanjem naglasaka s pojedinih znakova, izbacivanjem
zaustavnih riječi (engl. stopwords, semantički siromašne riječi poput zamjenica,
prijedloga ili veznika) te reduciranjem riječi na korijenski oblik. Tokeni, posebna
struktura podataka dobivena procesom analize, u kombinaciji s imenom polja
(razred Field) dokumenta u kojem se nalaze čine specifičan izraz (engl. term).
Postupak analize odvija se prilikom indeksiranja i pretraživanja dokumenta.
Razdvajanje teksta na tokene je različito od jedne vrste analizatora do druge.
Najčešće korišteni analizatori koje koristi Lucene su:
WhitespaceAnalyzer
Vrsta analizatora koji razdvaja tekst na tokene na temelju razmaka unutar
teksta. Također, ne pretvaraju se sva slova u dokumentu u mala slova
tijekom procesa analize.
SimpleAnalyzer
Vrsta analizatora koji razdvaja tekst na tokene na temelju znakova koji nisu
slova te se tekst svakog tokena prebacuje u mala slova. Tim postupkom se
brojevi izbacuju iz teksta.
StopAnaylzer
Analizator koji na isti način razdvaja tekst kao i SimpleAnalyzer samo
što izbacuje zaustavne riječi (engl. stopwords) iz teksta (zamjenice,
prijedloge, veznike itd.).
StandardAnalyzer
StandardAnalyzer je najsofisticiraniji analizator koji Lucene posjeduje.
Posjeduje određenu logiku pomoću koje identificira specifične tokene poput
17
imena različitih kompanija ili adresa elektroničke pošte. Također pretvara
tekst svakog tokena u mala slova, briše iz dokumenta zaustavne riječi
(engl. stopwords) i interpunkcijske znakove.
Lucene ne prikazuje proces analize dokumenta korisniku. Token se dodaje u
indeks što prikazuje i slika 2.3.
Slika 2.3 Proces analize [8]
Polja Field 1 i Field 2 su podvrgnuta procesu analize te se stvoreni tokeni zapisuju
u indeks dok polje Field 3 ne prolazi proces analize već se cjelokupna vrijednost
polja indeksira kao pojedinačan token (Slika 2.3).
Kod procesa pretraživanja također se provodi proces analize teksta kojeg čine
ključne riječi prema kojima se vrši pretraživanje. Razred QueryParser koristi
18
analizator kako bi ključne riječi preveo u specifične strukture podataka koje se
koriste prilikom pretraživanja dokumenta.
Token je osnovna struktura podataka koja je stvorena procesom analize
dokumenta. Analiza dokumenata stvara skup tokena za čiji prikaz i pohranu se
brine razred TokenStream. Primjer rezultata procesa analize teksta „the quick
brown fox“ prikazuje slika 2.4.
Slika 2.4 Primjer tokena nastalih procesom analize [8]
Svaki token predstavlja pojedinačnu riječ teksta. Uz tekst riječi koju predstavlja,
token još sadrži i početak i kraj pozicije riječi u dokumentu (engl. offsets) te
poziciju riječi u dokumentu.
2.2.3 Direktorij spremanja stvorenih indeksa
Apstraktni razred Directory predstavlja programsko sučelje (engl.
Application Programming Interface) koje Lucene koristi za zapis sadržaja u
datoteke na tvrdom disku (engl. Hard Disk). Razredi IndexReader i
IndexWritter koriste programsko sučelje koje nudi Directory. IndexReader
ga koristi kako bi došao do sadržaja nastalog procesom indeksiranja dok ga
IndexWritter koristi za zapis novostvorenih indeksa. Postoji više vrsta
direktorija za pohranu indeksa: SimpleFSDirectory, NIOFSDirectory,
MMAPDirectory, RAMDirectory i FileSwitchDirectory. Najveća razlika
između RAMDirectory-a i ostalih je u tome što su kod RAMDirectory-a indeksi
19
pohranjeni u radnu memoriju, a kod ostalih inačica direktorija na tvrdome disku.
Takvim načinom pohrane podataka RAMDirectory ima puno brži pristup
indeksima kod procesa pretraživanja. Ako je potrebno proučavanje i prikaz
sadržaja indeksa (koristeći razne Javine programske knjižnice) nakon izvršavanja
programa onda RAMDirectory nije pogodan zbog gubitka podataka u indeksima.
2.3 Proces pretraživanja
Proces pretraživanja ulazi u drugu fazu cjelokupnog koncepta efikasnog
pretraživanja teksta. Nakon što je tekstualni sadržaj dokumenata indeksiran,
pretraga određenog pojma na temelju stvorenih indeksa zaprima zamjetnu brzinu
izvođenja. Središnji razred Javine programske knjižnice Apache Lucene za
pretragu po indeksima je IndexSearcher te on sadrži metode za pretraživanje.
Treba uzeti u obzir da je tekstualni sadržaj dokumenata koji se pretražuju već
prošao proces analize te su prisutne neke promjene u odnosu na originalni
dokument (izbačene su zaustavne riječi, riječi su prepisane u mala slova itd.).
Proces analize je potreban i u fazi pretraživanja. Ključne riječi prema kojima se
vrši pretraživanje moraju biti prevedene u oblik pogodan za proces pretraživanja,
taj oblik opisan je razredom Query. Prilikom parsiranja unesenih ključnih riječi
glavnu ulogu ima razred QueryParser čije akcije rezultiraju oblikovanjem upita
(razred Query) koji se dalje koristi za efikasno pretraživanje teksta.
QueryParser mora koristiti analizator kako bi razdvojio unesene ključne riječi na
posebne jedinice koje se koriste u daljnjem procesu pretraživanja. Vrste
analizatora koje može koristiti QueryParser su jednake onima koji se koriste
prilikom procesa analize kod indeksiranja teksta (opisano u poglavlju 2.2.2).
20
Slika 2.5 Proces stvaranja upita za pretraživanje [8]
Prilikom stvaranja razreda IndexSearcher potrebno je doći do indeksa stvorenih
tijekom procesa indeksiranja. Kako bi došli do tih indeksa potrebni su nam razredi
Directory i IndexReader. Metoda search razreda IndexSearcher vraća
objekt tipa TopDocs koji predstavlja rezultat pretraživanja.
Slika 2.6 Prikaz odnosa između spomenutih razreda kod pretraživanja [8]
21
2.3.1 Izračun koeficijenata sličnosti prilikom pretraživanja
Prilikom svakog izvođenja procesa pretraživanja Lucene računa koeficijente
sličnosti dokumenata i unesenih ključnih riječi prema kojima se vrši pretraživanje.
Izračunati koeficijent određuje koliko je upit sličan dokumentu koji se pretražuje,
veći koeficijent sličnosti predstavlja veću sličnost dokumenta i upita. Računanje
koeficijenta sličnosti kod Lucenea bazirano je na TF - IDF (engl. term frequency –
inverse document frequency) vektorima. TF komponenta predstavlja broj
pojavljivanja ključne riječi u dokumentu koji se pretražuje, a IDF komponenta
predstavlja mjeru koja govori koliko je ključna riječ jedinstvena, točnije, koliko je
riječ važna za semantiku dokumenta. Riječ je manje važna za semantiku
dokumenta što se češće pojavljuje u drugim dokumentima. Izraz (1) prikazuje
formulu koju Lucene koristi za određivanje koeficijenata sličnosti između
dokumenta i upita.
∑ (𝑡𝑓(𝑡 𝑖𝑛 𝑑) × 𝑖𝑑𝑓(𝑡)2 × 𝑏𝑜𝑜𝑠𝑡(𝑡. 𝑓𝑖𝑒𝑙𝑑 𝑖𝑛 𝑑) × 𝑙𝑒𝑛𝑔𝑡ℎ𝑁𝑜𝑟𝑚(𝑡. 𝑓𝑖𝑒𝑙𝑑 𝑖𝑛 𝑑))𝑡 𝑖𝑛 𝑞
× 𝑐𝑜𝑜𝑟𝑑(𝑞, 𝑑) × 𝑞𝑢𝑒𝑟𝑦𝑁𝑜𝑟𝑚(𝑞) (1)
𝑡𝑓(𝑡 𝑖𝑛 𝑑) – broj pojavljivanja ključne riječi u dokumentu
𝑖𝑑𝑓(𝑡) – komponenta koja govori koliko je ključna riječ jedinstvena. Riječi
koje se često ponavljaju imaju nizak parametar IDF, dok riječi koje se rijetko
pojavljuju imaju visok parametar IDF.
𝑏𝑜𝑜𝑠𝑡(𝑡. 𝑓𝑖𝑒𝑙𝑑 𝑖𝑛 𝑑) - parametar povećanja važnosti određenih polja u
dokumentu.
𝑙𝑒𝑛𝑔𝑡ℎ𝑁𝑜𝑟𝑚(𝑡. 𝑓𝑖𝑒𝑙𝑑 𝑖𝑛 𝑑) – normalizacijska vrijednost (engl. Normalization
value) polja dokumenta koja je izračunata tijekom procesa indeksiranja na
temelju broja riječi u polju.
𝑐𝑜𝑜𝑟𝑑(𝑞, 𝑑) – koordinacijski faktor (engl. Coordinate factor) baziran na broju
riječi upita koje se pojavljuju u dokumentu. Onaj dokument koji sadrži veći
broj riječi upita imat će veći koordinacijski faktor.
𝑞𝑢𝑒𝑟𝑦𝑁𝑜𝑟𝑚(𝑞) - normalizacijska vrijednost (engl. Normalization value)
upita.
𝑡 𝑖𝑛 𝑞 – riječ upita za koju se računa koeficijent sličnosti.
22
Koeficijent sličnosti je realan broj koji je veći ili jednak 0.0. Luceneov osnovni način
rada vraća dokumente sortirane silazno prema koeficijentu sličnosti (od najvećeg
koeficijenta do najmanjeg). Faktori povećanja važnosti određenih polja
dokumenata (engl. Boost factors) su uključeni u formulu izračuna koeficijenta
sličnosti kako bi polja dokumenta s većom važnosti imala veći utjecaj na izračun
koeficijenta sličnosti. Ako nije zabilježen nikakav faktor povećanja važnosti
određenih polja dokumenta, faktor 𝑏𝑜𝑜𝑠𝑡(𝑡. 𝑓𝑖𝑒𝑙𝑑 𝑖𝑛 𝑑) jednadžbe izračuna
koeficijenta sličnosti ima vrijednost 1.0. Svrha normalizacijske vrijednosti je
pridruživanje veće važnosti onim dokumentima za koje je riječ upita relevantnija.
Ako imamo dva dokumenta (sa različitim brojem riječi) za koje se provjerava
sličnost na temelju ključne riječi upita i oba dokumenta sadrže tu ključnu riječ,
veću normalizacijsku vrijednost će imati onaj dokument sa manjim brojem riječi jer
je za njega ta riječ „važnija“. Također, moguće je i povećanje važnosti specifičnih
dokumenata u odnosu na druge. U tome slučaju se svakom polju dokumenta
povećava važnost za Boost factor dokumenta.
3. Razvijena aplikacija
Razvijena aplikacija omogućuje personalizirano filtriranje poruka s
društvene mreže Twitter. Poruke koje se dohvaćaju s Twittera filtriraju se na
temelju ključnih riječi koje korisnik unosi prilikom pokretanja aplikacije. Za
dohvaćanje toka s društvene mreže Twitter korištena je Javina programska
knjižnica Twitter4j. Prilikom svakog dohvata toka podataka (javnih poruka) uzima
se zadnjih 100 poruka objavljenih od trenutka poziva programa. Dohvat toka može
ići u prošlost par minuta (ako se dohvaćaju neke javne poruke koje sadrže
poznate ključne riječi poput „New York“) jer je vrlo velika frekvencija objavljivanja
takvih javnih poruka. Također, dohvaćanje toka može ići i puno više u prošlost ako
se javne poruke filtriraju po ne toliko poznatim ključnim riječima. Dohvaćene javne
poruke se spremaju u kolekciju i parsiraju na korisniku pregledniji način (sam
prikaz parsirane javne poruke vidljiv je u poglavlju 3.3 Primjer rada aplikacije).
23
Nakon dohvata i parsiranja javnih poruka slijedi filtriranje poruka koje najviše
odgovaraju korisnikovom unosu, tu glavnu ulogu ima Javina programska knjižnica
Apache Lucene. Kolekcija dohvaćenih javnih poruka prvo se indeksira te potom
pretražuje i izdvaja se onih 10 javnih poruka (iz kolekcije) koje imaju najveći
koeficijent sličnosti sa samim upitom (ključne riječi koje je korisnik unio kako bi
filtrirao poruke koje će mu biti isporučene). Izdvojene poruke se isporučuju
korisniku u njegov sandučić elektroničke pošte. Dohvaćanje tweetova se odvija
periodički tijekom definiranog intervala (to vrijeme je moguće odrediti po izboru).
Kako bi se smanjila redundancija poslanih poruka, odnosno kako bi se spriječilo
slanje već poslanih javnih poruka, poslane poruke se pamte.
Princip rada aplikacije je sljedeći. Dohvaća se 100 javnih poruka s
društvene mreže Twitter te se poruke dodaju u kolekciju svih tweetova,
računanjem koeficijenta sličnosti izabire se 10 tweetova koji najbolje odgovaraju
korisnikovom unosu. Svaki tweet se šalje korisniku u sandučić elektroničke pošte
ako već nije bio poslan. Nakon definiranog vremenskog perioda dohvaća se novih
100 tweetova. Tweetovi se dodaju u kolekciju svih tweetova te se iz cjelokupne
(povećane) kolekcije dohvaća 10 tweetova koji najbolje odgovaraju korisnikovom
unosu. Za svaki od dobivenih 10 tweetova gleda se je li već poslan korisniku u
sandučić elektroničke pošte ili nije. Ako nije poslan šalje se, u suprotnom se ne
šalje. Ako je vremenski period između dohvaćanja tweetova kratak (manji od
minute) može se dogoditi da korisnik ne dobije nikakvu poruku elektroničke pošte
zbog česte frekvencije istih (već poslanih) tweetova koji prema izračunu spadaju u
najsličnije korisnikovom upitu. Nakon određenog broja dohvata tweetova (može
biti nakon pola dana, cijelog dana ili nekog drugog perioda) kolekcija tweetova se
briše i postupak počinje ispočetka.
3.1 Implementirana aplikacija
Slika 3.1 prikazuje Dijagram razreda, dijagram koji spada u statičke UML
dijagrame (ne razmatra se vremenska komponenta). Dijagramom je prikazana
čitava struktura sustava.
24
Slika 3.1 Dijagram razreda
Sa slike vidimo da se aplikacija sastoji od razreda: Indexer, TwitterClass,
Searcher, LuceneConstants, SMTPAuthenticator i Email.
3.1.1 Razred TwitterClass
TwitterClass je razred koji predstavlja „mozak“ aplikacije. Dohvaća
tweetove, pokreće procese indeksiranja, pretraživanja i slanja poruka elektroničke
pošte. Posjeduje privatne članske varijable kako bi pamtio direktorij čuvanja
indeksa, direktorij čuvanja kolekcije javnih poruka koje se indeksiraju, unesene
ključne riječi prema kojima se vrši pretraživanje, broj poslanih poruka elektroničke
pošte i kolekciju poslanih tweetova. Također, TwitterClass posjeduje logiku
periodičkog pokretanja rada programa. Za periodičko pokretanje programa koristi
razred Timer i njegovu metodu run. Slika 3.2 prikazuje inicijalizaciju Timer-a.
Slika 3.2 Inicijalizacija Timera
25
Metoda schedule prima vremenske parametre u milisekundama, točnije isječak
koda sa slike 3.2 specificira da će se program izvoditi svakih 30 sekundi. Ako
želimo da se program izvodi svakih 30 minuta umjesto 30000 ćemo napisati 1 800
000.
TwitterClass implementira postupak autentifikacije kako bi se omogućilo
dohvaćanje javnih poruka sa Twittera (postupak autentifikacije je detaljno
objašnjen u poglavlju 3.4 Upute za instalaciju).
Slika 3.3 predstavlja vrlo jednostavan isječak koda za dohvaćanje javnih poruka s
društvene mreže Twitter.
Slika 3.3 Dohvaćanje javnih poruka
Query je razred koji predstavlja upit prema kojemu se filtriraju javne poruke
Twittera. Metoda setCount specificira broj tweetova koje ćemo dobiti pozivom
metode search razreda Twitter. Također, ovaj razreda priprema direktorij s
kolekcijom javnih poruka koje će alat Lucene koristiti za indeksiranje i
pretraživanje teksta.
3.1.2 Razred Indexer
Razred Indexer, kao što njegovo ime govori, ima glavnu ulogu u indeksiranju
teksta koji se pretražuje, za aplikaciju to predstavlja niz dokumenata koji čine
javne poruke društvene mreže Twitter. Stvara posebnu strukturu podataka, indeks,
26
korištenu kod efikasnog pretraživanja teksta pomoću Lucenea. Razredi Javine
programske knjižnice Apache Lucene korišteni kod indeksiranja su:
IndexWriter
Razred koji predstavlja centralnu komponentu procesa indeksiranja. Služi
sa stvaranje novog indeksa (ili otvaranja već postojećeg) te za dodavanje
dokumenata u indeks. Za zapis novostvorenih indeksa na tvrdi disk (ili u
radnu memoriju ako je tako specificirano) koristi razred Directory.
Directory
Razred koji predstavlja programsko sučelje alata Lucene za zapis indeksa
unutar datoteka na tvrdom disku. Aplikacija koristi FSDirectory koji
zapisuje novostvorene indekse unutar datotečnog sustava. Navedena
inačica Directory-a se koristi kako bi mogli pregledati sadržaj direktorija
indeksa nakon završetka izvođenja programa (prikazano u poglavlju 3.3
Primjer rada aplikacije).
Analyzer
Prije samog procesa indeksiranja dokument mora proći kroz proces analize
(rastavljanja teksta na tokene). Unutar aplikacije korišten je
StandardAnalyzer.
Document
Razred koji predstavlja kolekciju polja (Field) koji izravno sadrže tekst koji
se indeksira.
Field
Razred unutar kojeg je izravno pohranjen sadržaj koji se indeksira.
Aplikacija koristi tri polja kod stvaranja indeksa: polje koje sadrži ime
datoteke, polje koje sadrži putanju do datoteke te polje koje sadrži sam
tekst koji se indeksira. Taj tekst predstavlja „čisti“ tekst javne poruke bez
korisničkog imena autora i poveznica sadržanih u javnoj poruci.
27
Slika 3.4 Odnos razreda kod procesa indeksiranja [8]
3.1.3 Razred Searcher
Razred Searcher ima glavnu ulogu kod pretraživanja indeksa i
specificiranju koji dokument najbolje odgovara unesenim ključnim riječima. U
pozadini koristi vektorski model pretraživanja. Razredi Javine programske
knjižnice Apache Lucene korišteni kod pretraživanja su:
IndexSearcher
Centralna komponenta kod procesa pretraživanja (poput razreda
IndexWriter kod indeksiranja) koja omogućava izravan pristup indeksima
kod pretraživanja.
Query
Razred koji izravno predstavlja upit kojeg Lucene koristi za pretraživanje.
QueryParser
Razred koji služi za parsiranje unesenih ključnih riječi u oblik upita koji
koristi Lucene (Query)
TopDocs
28
Razred koji predstavlja skup pokazivača na najbolje rangirane dokumente
prema izračunu koeficijenta sličnosti između upita i dokumenta. Za svaki
vraćeni dokument TopDocs sadrži identifikacijski broj dokumenta.
Slika 3.5 Isječak koda u kojem se vrši pretraživanje
Slika 3.5 prikazuje isječak koda u kojem se obavlja pretraživanje teksta na temelju
unesenih ključnih riječi (searchQuery). QueryParser koristi svoju metodu
parse kako bi parsirao upit u oblik kojeg koristi Lucene. Metoda search razreda
IndexSearcher obavlja pretraživanje, a kao parametre prima upit i broj najbolje
rangiranih dokumenata koji se vraćaju kao povratna vrijednost metode search.
3.1.4 Razred Email
Razred Email ima glavnu ulogu u slanju javnih poruka, koje najbolje
odgovaraju unesenim ključnim riječima, u korisnikov sandučić elektroničke pošte.
Za slanje poruka elektroničke pošte koristi se Javina programska knjižnica
javax.mail. Kako bi se poslala poruka mora se proći autentifikacija pošiljatelja, tu
ulogu obavlja razred SMTPAuthenticator koristeći metodu
getPasswordAuthentication (Slika 3.6) gdje se provjerava lozinka
(senderPassword) za danu adresu elektroničke pošte (senderEmail).
Slika 3.6 Autentifikacija pošiljatelja
29
Za slanje poruka elektroničke pošte koristi se SMTP protokol (Simple Mail
Transfer Protocol), odnosno SMTP poslužitelj i njegova vrata 587, (Slika 3.7).
Slika 3.7 Inicijalizacija SMTP poslužitelja
Slika 3.8 prikazuje metodu koja je odgovorna sa slanje elektroničke pošte u
korisnikov sandučić elektroničke pošte
Slika 3.8 Slanje elektroničke pošte
30
Za pohranu parametra elektroničke pošte koristi se razred Properties. Potrebno
je stvoriti novu sjednicu za što se brine razred Session i njegova metoda
getInstance. Poruka elektroničke pošte koja se šalje predstavljena je razredom
MimeMessage koji implementira apstraktne metode razreda Message i nudi
mogućnost definiranja vrste sadržaja koji se šalje elektroničkom poštom. Metoda
setText definira sadržaj poruke. Kao argumente prima sam tekst poruke i kodnu
stranicu koja se koristi (UTF-8). Kodnu stranicu je potrebno navesti kako bi se
mogli prikazati znakovi koji ne ulaze u osnovan skup ASCII znakova. Razred
InternetAddress predstavlja adresu elektroničke pošte s koje se šalje odnosno
prima poruka. Metodom setFrom određujemo adresu pošiljatelja dok metodom
addRecipient određujemo adresu primatelja. Kako bi poslali poruku
elektroničke pošte koristimo razred Transport (koji modelira transport poruke) i
njegovu statičku metodu send.
3.1.5 Razred AppConstants
Razred AppConstants predstavlja konstante korištene u aplikaciji. Korištene
konstante su:
CONTENTS – ime polja dokumenta koje izravno sadrži sadržaj za
indeksiranje
FILE_NAME – ime polja dokumenta koje sadrži ime datoteke koje se
indeksira
FILE_PATH - ime polja dokumenta koje sadrži putanju do indeksirane
datoteke
MAX_SEARCH – broj dokumenata koji se vraćaju metodom search razreda
IndexSearcher
31
SENDER_EMAIL – adresa elektroničke pošte pošiljatelja
SENDER_PASSWORD – lozinka elektroničke pošte pošiljatelja
EMAIL_SMTP_SERVER – korišteni SMTP poslužitelj
EMAIL_SMTP_PORT – korištena vrata SMTP poslužitelja
DATA_DIR – direktorij za pohranu podataka koji će se indeksirati
INDEX_DIR – direktorij za pohranu indeksa
3.2 Funkcionalni zahtjevi sustava
Osnovna zadaća aplikacije je personalizirano filtriranje toka s društvene
mreže Twitter i isporuka javnih poruka korisniku u pretinac elektroničke pošte.
Koristi se alat Lucene kako bi se filtrirale one javne poruke koje najviše odgovaraju
korisnikovom unosu.
Kako bi se omogućilo dohvaćanje toka s društvene mreže Twitter potrebno
je proći autentifikacijski proces (Slika 3.9)
32
Slika 3.9 Proces autentifikacije
Nakon što se uspostavila veza s Twitterom slijedi unos ključnih riječi i
dohvat javnih poruka društvene mreže Twitter koje sadrže te ključne riječi.
33
Slika 3.10 Dohvat javnih poruka
Nakon dohvata javnih poruka potrebno je pomoću alata Lucene filtrirati 10
tweetova koji najbolje odgovaraju korisnikovom unosu, točnije pronalaze se oni
tweetovi za koje je izračunati koeficijent sličnosti s unosom korisnika najveći.
34
Slika 3.11 Filtriranje javnih poruka
Zadnji korak aplikacije je slanje elektroničke pošte korisniku.
Slika 3.12 Slanje elektroničke pošte
35
3.3 Primjer rada aplikacije
Kako bi se omogućio rad aplikacije potrebno je projekt uvesti u Eclipse ili
NetBeans (platforme za pokretanje koda pisanog u programskom jeziku Java).
Nakon pokretanja programa u konzoli se nalazi ispis o broju indeksiranih datoteka
(svaka javna poruka spremljena je u jednu datoteku), broju datoteka koje u samom
sadržaju javne poruke sadrže ključne riječi (broj pronađenih datoteka), vrijeme
potrebno za rad alata Lucene (za indeksiranje i pretraživanje) te informacija o
uspješnosti poslane elektroničke pošte (Slika 3.13).
Slika 3.13 Konzolni ispis
Sa slike 3.13 vidimo da broj datoteka koje se indeksiraju nije jednak broju datoteka
koje je Lucene pronašao nakon procesa pretraživanja. Razlog tome leži u
parsiranju javne poruke i izdvajanju sadržaja javne poruke koji će biti indeksiran.
Slika 3.14 Primjer parsirane javne poruke (tweet)
Parsirana poruka sadrži vrijeme objave poruke, korisničko ime autora poruke,
poveznicu koju sadrži javna poruka te sam tekst javne poruke. Indeksiranje i
pretraživanje se vrši isključivo po tekstu javne poruke (u to ne spada korisničko
ime autora poruke ili naziv poveznice poruke). Metoda search razreda Twitter
radi pretraživanja prema unesenim ključnim riječima tako da pretražuje cjelokupan
sadržaj javne poruke (u što ulazi i korisničko ime autora i naziv poveznice koju
36
javna poruka sadrži). Zbog te razlike između načina pretraživanja metode search
razreda Twitter i implementiranog načina pretraživanja alata Lucene broj javnih
poruka koje se indeksiraju i broj javnih poruka koje su vraćene procesom
pretraživanja nije jednak.
Slika 3.15 Primjer parsirane javne poruke koja ne sadrži poveznicu
Nakon što su dohvaćene javne poruke parsirane i filtrirane pomoću računanja
koeficijenta sličnosti alata Lucene šalje se poruka elektroničke pošte.
Slika 3.16 Primjer primljene elektroničke pošte
Ako želimo vidjeti sadržaj vektora pojmova ili izračunate koeficijente sličnosti
dokumenata koji se pretražuju i upita potreban je alat luke [9]. Potrebno je skinuti
JAR datoteku te ju pokrenuti iz komandne linije (Slika 3.17).
37
Slika 3.17 Pokretanje JAR datoteke
Nakon pokretanja alata Luke potrebno je specificirati putanju do direktorija s
indeksima (Slika 3.18).
Slika 3.18 Određivanje putanje do direktorija s indeksima
Alat Luke možemo koristiti za pretraživanje dokumenata (istih dokumenata koji se
pretražuju u aplikaciji) uz unos ključnih riječi. Prije pretraživanja možemo
specificirati vrstu analizatora (Slika 3.19).
38
Slika 3.19 Izbor korištenog analizatora
Unosom ključnih riječi (New York) te pritiskom na gumb Search (Slika 3.19)
prikazuje se lista datoteka s najboljim koeficijentima sličnosti (Slika 3.20).
Slika 3.20 Rezultat pretraživanja
Za svaki dokument koji je ušao u skup najbolje rangiranih dokumenata prikazuje
se vrijednost koeficijenta sličnosti, identifikacijski broj dokumenta, sadržaj
dokumenta te ime datoteke i putanja do datoteke. Sadržaj dokumenta
(contents), ime datoteke (filename) te putanja do datoteke (filepath)
39
predstavljaju polja dokumenta razred Field. Za svaki dokument je moguće vidjeti
sadržaj i vektor pojmova (Slika 3.21 i 3.22).
Slika 3.21 Osnovne informacije o dokumentu
Slika 3.22 Vektor pojmova za odabrani dokument
40
3.4 Upute za instalaciju
Kako bi se aplikacija pokrenula na vlastitom računalu potrebno je napraviti
nekoliko jednostavnih koraka:
1. Instalacija platforme Eclipse ili NetBeans
2. Uvođenje cjelokupnog projekta u jednu od navedenih platformi
3. Napraviti korisnički račun na društvenoj mreži Twitter
4. Pokrenuti Application Management koji se nalazi na sljedećoj poveznici:
https://apps.twitter.com/
5. Pritisnuti na gumb Create New App (Slika 3.23)
Slika 3.23 Application Management
41
6. Popuniti potrebne informacije (Slika 3.24).
Slika 3.24 Ispuna potrebnih informacija
7. Pronaći informacije po pitanju autentifikacije (kartica Keys and Access
Tokens): Consumer Key, Consumer Secret, Access Token, Access Token
Secret. Pronađene informacije je potrebno dodati u sam kod
(autentifikacijske vrijednosti nisu prikazane na slici, Slika 3.25).
Slika 3.25 Unos autentifikacijskih vrijednosti
42
8. Specificiranje putanje do direktorija s datotekama koje se pretražuju te do
direktorija koji sadrži indekse. Putanja se određuje postavljanjem vrijednosti
varijabli DATA_DIR i INDEX_DIR u razredu AppConstants (Slika 3.26).
Slika 3.26 Određivanje direktorija pohrane podataka i indeksa
9. Određivanje ključnih riječi i adrese elektroničke pošte primatelja u datoteci
uvjeti.txt (Slika 3.27).
Slika 3.27 Određivanje ključnih riječi i adrese elektroničke pošte
10. Skidanje alata Luke s poveznice:
https://github.com/DmitryKey/luke/releases
43
Zaključak
Društvene mreže su postale svakodnevnost ljudskih života kako na
društvenoj tako i na poslovnoj sceni. Brojni portali i programi u svom radu se
oslanjaju na prikaz obavijesti i događanja diljem svijeta koristeći društvene mreže.
Razlog tome leži u velikoj popularnosti društvenih mreža te u cjenovno jeftinoj
platformi za prikaz obavijesti što i društvena mreža predstavlja. Kao posljedica
velike popularnosti društvenih mreža, brojni programski jezici nude laku integraciju
programskog sučelja koje omogućava obavljanje osnovnih funkcija društvenih
mreža iz samog koda programa bez korištenja ikakvog grafičkog sučelja. Mnoge
novorazvijene aplikacije imaju poveznicu s nekom od najpoznatijih društvenih
mreža zbog jednostavnosti implementacije osnovnih funkcionalnosti unutar
programske podrške aplikacije.
Današnje vrijeme karakterizira „eksplozija“ količine podataka koji se mogu
naći na internetu. Kao posljedica toga nastali su brojni alati za efikasno
pretraživanje velike količine teksta (među koje ubrajamo i Lucene). Svi alati za
pretraživanje teksta vide osnovni cilj u brzom lociranju određene informacije unutar
velike količine podataka. Algoritmi efikasnog pretraživanja (na nižoj razini
apstrakcije) mogu se naći i u našim računalima prilikom lociranja datoteka unutar
datotečnog sustava. Prilikom implementacije vlastitog algoritma za efikasno
pretraživanje najviše se mora paziti na vremensku komponentu izvršavanja upita
jer je korisnicima sustava najbitnije koliko će čekati da dobiju traženu informaciju.
Lucene je jedan od najučinkovitijih alata za pretraživanje teksta. U svom radu
(radi efikasnijeg pretraživanja) koristi indekse čime postiže zamjetne brzine
dohvata informacija. Važno je napomenuti da Lucene ne predstavlja gotovu
aplikaciju koju ćemo samo pokrenuti bez napisane ijedne linije programskog koda
već Lucene nudi niz razreda i metoda koji se jednostavno integriraju u većinu
današnjih aplikacija. Zbog svoje efikasnosti prilikom pretraživanja velikih količina
podataka i jednostavnosti integracije unutar programske podrške, Lucene postaje
jedan od poželjnijih alata za pretraživanje velikih količina podataka.
44
Literatura
1. About Twitter company, https://about.twitter.com/company
2. Number of Twitter employees from 2008 to 2015,
http://www.statista.com/statistics/272140/employees-of-twitter/
3. Twitter History, https://en.wikipedia.org/wiki/Twitter#History
4. Twitter Basic: Why 140 characters and how to write more,
http://www.adweek.com/socialtimes/twitter-basics-why-140-characters-and-
how-to-write-more/442608
5. Using hashtags on Twitter, https://support.twitter.com/articles/49309
6. Twitter4j code examples, http://twitter4j.org/en/code-examples.html
7. What is term vector in Lucene, http://makble.com/what-is-term-vector-in-lucene
8. Lucene in Action, Second Edition, https://www.manning.com/books/lucene-
in-action-second-edition
9. Luke, https://github.com/DmitryKey/luke/releases
45
Sažetak
Personalizirano filtriranje toka s društvene mreže Twitter
Lucene je jedan od najpoznatijih alata za pretraživanje teksta. Tijekom svog
rada koristi dva teorijska modela pretraživanja: čisti Boolean model (engl. Pure
Boolean model) i model vektorskog prostora (engl. Vector space model). Rad
Lucenea se može podijeliti u dva osnovna dijela: indeksiranje teksta i pretraživanje
koristeći stvorene indekse. Indeks je posebna struktura podataka koja omogućuje
brzo pretraživanje tekstualnog sadržaja dokumenata. Prije samog procesa
indeksiranja potrebno je obaviti analizu tekstualnog sadržaja dokumenta. Proces
analize je postupak razdvajanja teksta na posebne jedinice, tokene. Svaki token
predstavlja pojedinačnu riječ teksta. Uz tekst riječi koju predstavlja, token još
sadrži i početak i kraj pozicije riječi u dokumentu (engl. offsets) te poziciju riječi u
dokumentu. Prilikom pretraživanja računa se koeficijent sličnosti između upita
kojeg čine unesene ključne riječi i tekstualnog sadržaja dokumenata. Kao rezultat
procesa pretraživanja dobivaju se oni dokumenti koji su najsličniji ključnim riječima
upita.
Razvijena aplikacija omogućava personalizirano filtriranje toka s društvene
mreže Twitter, određivanje onih javnih poruka koje su najsličnije korisnikovom
unosu koristeći Javinu programsku knjižnicu Apache Lucene te isporuku filtriranih
javnih poruka u korisnikov sandučić elektroničke pošte. Program se poziva
periodički.
Ključne riječi: Lucene, Twitter, tweet, token, indeksiranje, pretraživanje teksta,
Luke, aplikacija za pretraživanje, koeficijent sličnosti, Java
46
Summary
Personalized stream filtering from social network Twitter
Lucene is one of the most famous tools for text searching. During its work,
Lucene uses two theoretical models of searching: Pure Boolean model and Vector
space model. Lucene's work can be divided into two primary parts: text indexing
and searching text using created indexes. Index is a special data structure which
enables fast search of document's textual content. Before indexing process starts,
document's textual content must go through analysis process. Analysis process is
a special procedure of dividing text to special units i.e. tokens. Every token
represents one single text's word. Along with a word it represents, every token
contains char number where word starts and char number where the word ends in
document (offset).It also contains position of the word in a document. During the
searching process, similarity coefficient of query and document on which the
search process is applied is calculated. Documents which are the most similar to
the key words of the query are given as the search result.
Developed application enables personalized stream filtering from social
network Twitter, determination of tweets which have the biggest similarity to the
user's key words using search engine library Apache Lucene and delivering e-mail
(electronic mail) to the user. Program is running periodically.
Key words: Lucene, Twitter, tweet, token, indexing, text searching, Luke, search
application, similarity coefficient, Java