Dobrica Pavlinušić <dpavlin@rot13.org> 28.01.2002.
Narodne novine (u nastavku NN), izdavač službenog glasila Republike Hrvatske, odlučile su od 15. rujna 2001. godine naplaćivati pristup web izdanjima Narodnih Novina.
Zbog toga su pokrenute mnoge inicijative (uključujući HrOpen-ovu i GONG-ovu) da bi se osigurao pristup i pretraživanje elektroničkog izdanja NN (jer po nekim interpretacijama to ograničava prava građana Republike Hrvatske na pristup zakonima koji se objavljuju službeno u NN). Nakon toga NN ponovo omogućuju pristup elektroničkom izdanju uz navođenje točne godine izdanja i broja NN.
Na taj način postoji mogućnost da pogledate zakon ako znate točan broj NN, ali ako trebate pronaći zakon bez poznavanja broja i godine izdanja (kao što većina povremenih posjetitelja web stranica NN i radi) tada vam je taj "klasični" (kao u knjižnici) način pretraživanja NN jednostavno nezadovoljavajući.
Sama prednost NN u digitalnom obliku je, naravno, pretraživanje. Uklanjanjem te mogućnost (radi financijske dobiti od pretplatnika koji su takvu uslugu spremni platiti) NN su sebi stvorile mogućnost zarade (i pružanja boljih usluga pretplatnicima), ali istovremeno onemogućile povremene korisnike NN da pronađu zakon koji ih zanima.
To je bila motivacija za implementaciju pretraživača sadržaja NN.
Kako se ne bi ponovila priča sa originalnim pretraživanjem NN, odlučio sam da sam pretraživač bude objavljen pod Open Source licencom. To je od početka značilo da mogu koristiti gotove dijelove koda koje su razni autori (čiji je popis dan na kraju članka) napisali tokom godina, a mogu biti korisne pri implementaciji pretraživača.
Osim jasnog sinergijskog efekta takve odluke, on omogućava da bilo tko može kasnije prepraviti pretraživač tako da odgovara njegovim potrebama, ali da istovremeno ta poboljšanja vrati Open Source zajednici, tako da svi možemo profitirati od toga. S druge strane, to također znači da originalni autor ne može ni u jednom trenutku proglasiti pretraživač samo njegovim i početi naplaćivati njegovo korištenje.
Kako se koriste gotove i javno raspoložive komponente, mogu se koristiti znanja koja su drugi ljudi ugradili u njih. Iskreno, na početku ovog projekta, 24.01.2002. moje znanje o načinima pretraživanja teksta bilo je prilično oskudno.
Prvi korak je bilo traženje da li na mreži već postoji neki primjer implementacije pretraživača u praksi. Nakon dužeg traženja, shvatio sam da članaka o samoj implementaciji zapravo nema, ali da ima pretraživača koji rade, licencirani su pod jednom od Open Source licenci i rade dobro.
Međutim, lista zahtjeva za pretraživač je bila donekle specifična, ne toliko za Narodne novine, koliko za Hrvatski jezik:
Međutim, kako je svaki početak težak, sama implementacija odvijala se u fazama, jer je jednostavnije početi sa manjim problemom i onda proširivati funkcionalsnost.
Prvi i logičan način pretraživanja je bio po naslovima zakona. Ako sve naslove pospremimo u RDBMS, logičan način pretraživanja je SQL upit oblika
SELECT * FROM NN WHERE NASLOV LIKE '%riječ%'
gdje je "riječ" ono što je korisnik pretraživača upisao. Međutim, to nije i najbolji način pretraživanja jer ako imamo zakon koji se zove
"Zakon o posebnom porezu na kavu"
korisnik će imati problema jer će morati upisati točan dio naslova (npr. "porezu na kavu" a ne samo ključne riječi (npr. "porez kava").
Treba naglasiti da se ne pretražuje zapravo originalni naslov, već njegova kopija koja je pretvorena u samo mala slova i kojoj su hrvatski palatali (čćžšđ) zamjenjeni s ekvivalentima bez kvačica. Zbog toga će u daljnjem tekstu pod naslov biti podrazumjevan ovaj oblik prilagođen za pretraživanje. Originalni naslov koristi se samo za prikazivanje rezultata (da bi ispisani naslov imao velika i mala slova kao i naše znakove).
Slijedeći logičan korak bio je pokušaj da se riječi upisuju u posebnu tablicu, a da se korisnikov upit pretvori u višestruke upite u bazu. To je nužno kako bi se mogle upisati riječi za pretraživanje u bilo kojem redoslijedu.
NN NASLOVI RIJECI ---------------- ---------------- ---------------- ID NASLOV ID RIJEC_ID ID RIJEC ---------------- ---------------- ---------------- 10 Zakon o posebnom... 10 101 101 zakon 10 102 102 posebnom 10 103 103 porezu 10 104 104 kavu
Sve riječi upisuju se u posebnu tablicu, dodaje se vezna tablica koja povezuje tablicu s riječima i tablicu s brojevima NN, a upiti izgledaju kao:
SELECT * FROM NN WHERE ... ID IN ( SELECT NASLOVI.ID FROM NASLOVI WHERE RIJEC_ID IN ( SELECT ID FROM RIJECI WHERE RIJEC IN ('porezu','kavu') ) GROUP BY NASLOVI.ID )
Osim što takav pristup rješava naš problem i tražene riječi se mogu upisivati bilo kojim redoslijedom, on također ima i nekoliko problema. SQL upiti su prilično složeni i moraju se dinamički generirari. Pravilo rule-of-the-thumb za SQL upite je da sub-selecti i operator IN obično nisu dobra ideja što se tiče performansi. Drugi problem je u tome što sub-selecti nisu podržani u svim slobodno dostupnim bazama podataka. Iako to nije bio problem za PostgreSQL, bolje je implementirati rješenje koje ne zahtjeva toliku funkcionalnost jer bi kasnije prenošenje na neku drugu bazu moglo predstavljati ozbiljan problem.
Međutim, rješnje koje omogućuje takvo pretraživanje (bez obzira na redoslijed riječi u originalnom naslovu) je jednostavno nužno te sam već bio spreman implementirati takav pristup kada sam (pretražujući Internet u potrazi za dosadašnjim iskustvima u implementaciji pretraživača) na CPAN-u (Comprehensive Perl Archive Network, www.cpan.org, cpan.linux.hr, arhiva modula za PERL) pronašao modul Text::Query koji tom problemu pristupa na drugi način.
Modul Text::Query pristupa problemu pretraživanja na drugačiji način: definira gramatiku pretraživanja (slično AltaVista-i) gdje je podrazumijevani operator ili (or), a može se eksplicitno zahtjevati prisutnost neke riječi (korištenjem znaka + ispred riječi) ili njezina odsutnost (korištenjem znaka - isprijed riječi). Moguće je koristiti i zagrade za grupiranje dijelova upita. Nakon specificiranja upita, on se prevodi u regular expression kojim se onda pretražuje string. To zapravo znači da se pretražuje jedno polje u bazi korištenjem regex-pa. Rezultat je puno jednostavniji upit koji izvršava sam RDBMS. Takvi upiti su donekle specifični za pojedine RDBMS-ove, ali Text::Query::BuildSQL podržava PostgreSQL, MySQL i Fulcrum. Korištenjem tog modula mogli smo se "vratiti" na jednostavan model s samo jednom tablicom koja se onda pretražuje jednostavnim SQL upitom koji ima regex.
Sam postupak pronalaženja svih mogućih oblika riječi je nešto u što se nisam želio upuštati sam: ipak se ja ne bavim lingvistikom. Međutim, imao sam sreće: upravo prije nekog vremena pojavio se hrvatski riječnik za ispell. Taj riječnik dolazi i s tzv. affix datotekom koja opisuje prefixe i sufixe koji se pojavljuju u nekom riječniku.
Implementacija čitanja affix file u perlu je bila relativno jednostavna. Nakon toga dobili smo mogućnost generiranja svih mogućih oblika riječi koji se nalaze u affix datoteci. Nažalost, osnovna funkcija affix datoteke je da se smanji veličina dictionary datoteke, a ne da dobijemo sve moguće gramatičke oblike neke riječi. Drugi problem je da je affix datoteka ograničena na samo 26 različitih kombinacija jer se svaki nastavak definira svojim slovom.
U ovom trenutku je veoma pomogao Denis Lacković, originalni autor affix datoteke za hrvatski jezik koji je poslao raw file koji je rezultat programa findaffix i koji sadrži mnogo više od 26 različitih nastavaka. Pomoću takvih podataka mogu se generirati sve moguće varijacije za neku riječ. Na taj način naš pretraživač je postao još primjenjiviji i jednostavniji za korištenje jer korisnici ne moraju razmišljati o obliku riječi koju su upravo upisali.
Ono što ostaje za napraviti u vezi pretraživača je:
Kao test koliko je ovaj pretraživač bolji, i da li je ova implemetacija uopće imala smisla, otišao sam na GONG-ov pretraživač NN i tamo upisao riječi "kava zakon". Rezultat je bio: "Traženi podaci nisu pronađeni !". Sa druge strane, moj pretraživač je ispisao veliki broj zakona u kojima se pojavljuju riječi "zakon" ili "kava" u bilo kojem obliku. Da bi dobili samo zakone u kojima se pojavljuju obje riječi moramo upisati to kao: "+zakon +kava". Tako ćemo dobiti točno tri zakona koji se time bave.
Napokon, 12. veljače 2002. modul Lingua::Spelling::Alternative je poslan na CPAN. Na taj način će svi korisnici perl-a imati koristi od dijela koda koji je napisan za potrebe ovog pretraživača.
Naravno, i sam pretraživač je prepravljen da koristi sam modul, a kako modul omogućava i učitavanje datoteka koje su rezultat findaffix programa (dakle bez limita na broj zapisa kao affix datoteke) sama mogućnost pretraživanja je time povećana.
Modul možete dohvatiti iz CVS-a, sa CPAN-a ili direktno sa mojih stranica.
Ovo poglavlje je sa razlogom na kraju. Napisano je nakon cijelog članka (i nekoliko mjeseci nakon početne implementacije) da bi ukazao na smjernice kamo ide ovaj projekt.
Početna implementacija korištenjem Text::Query modula i relacijske baze zamjenjena je korištenjem SWISH-E indeksera. To je omogućilo nekoliko promjena koje korisnci jako cijene: višestruko veća brzina pretraživanja i promjena podrazumjevanog operatora sa or na and. Na taj način naš poznati primjer može se dobiti tako da se upiše samo "zakon kava".
Primjer kako natjerati SWISH-E da indeksira bilo kakve podatke (u ovom slučaju podatke iz NN) je html2xml.pl; skripta koja konvertira html skinut sa NN u XML format pogodan za SWISH. Naravno, pretraživač ne bi bio koristan bez dijela za pretraživanje koji se zove nn-swish.cgi i koji je zapravo sama skripta koja postavlja upite SWISH-E-u (uz zgodan trik da prepiše upite obika +nešto1 -nešto2 u nešto1 and not nešto2.
Citat iz uputa za "jednostavno" pretraživanje:
Pretraživač nema mogućnosti deklinacije pa neće naći "Zakon o novčanim poticajima u poljoprivredi i ribarstvu" bilo da napišete "ribarstvo" ili "poljoprivreda". Da biste to izbjegli, upišite samo korijen ili dio riječi npr. "riba", "ribarst" odnosno "poljopriv" ili "poljoprivre".
Prilikom pretraživanja možete upisati više riječi. Tada riječi trebaju biti odvojene zarezom. Navedeni zakon ćete najlakše i najtočnije naći ako upišete "zakon, poticaj, ribar". Fraze, kao i riječi upisuju se bez navodnika.
Prilikom pretraživanja riječi koje sadrže naša slova možete koristiti i "univerzalno slovo" * koje zamjenjuje bilo koji niz slova.
Za usporedbu, pokušajte upisati "ribarstvo poljoprivreda" u našem pretraživaču.
Naravno, velika prednost komercijalnog pretraživača je mogućnost pretraživanja oglasa i pretraživanja cijelog teksta zakona (što se s obzitom na to da ne prepoznaje oblike riječi od upitne koristi).
Tokom sada već više godina korištenja ovog pretraživača pojavila se potreba za dvije nove mogućnosti: pretraživanje ograničeno na godine (da bi bilo moguće potražiti zakone samo od npr. ove godine) i pretraživanje kroz cijeli tekst zakona.
Sama implementacija je zapravo bila prilično jednostavna. Dodana su dvije gdbm datoteke od kojih jedna sadrži broj zakona u svakog godini (i koristi se za odabir godine kod pretraživanja) a druga sprema broj Narodnih novina i naslov zakona (što se dobiva iz popisa zakona) u odnosu na samo ime datoteke (koje swish-e vraća kao rezultat pretraživanja).
Sada zapravo postoje dva swish-e indeksa: jedan koji je generiran skriptom html2xml.pl i drugi koji se generira iz punog teksta zakona. Oba indeksa vraćaju rezultate u istom obliku, ali se za prikaz broja narodnih novina i naslova zakona kod pretraživanja punog teksta koriste gdbm datoteke koje također generira html2xml.pl dok generira xml za swish (suput generira i listu novih URL-ova na pun tekst zakona koji treba tek skinuti).
Ovo je statistika korištenja za prvih mjesec dana... Jasno se vidi skok 13.02.2002. kada je izašao članak na Internet monitoru.
get upiti su zapravo samo pristupi na prvu stranicu, dok su post upiti sama pretraživanja. Vidi se da post upita ima prosječno dva puta više, što znači da svaki posjetilac strane prosječno izvrši dva upita na ovaj pretraživač.
_*_|________[press release/pozivnica]___[ lasttuesday ] @ [mama]>26.2.>20.00 Pozivamo vas na jos jedan LastTuesday u mami, Preradoviceva 18, 26.02.2002. u 20.00 sati. Ovaj put govorit cemo o gradjanskom neposluhu u slucajevima povrede javnoga interesa, s posebnim naglaskom na slucaj Narodnih novina i objavljivanja zakonskih propisa RH na Internetu. Pozvani su predstavnici Narodnih novina, GONG-a, HrOpena, Dobrica Pavlinusic (autor najnovijeg pretrazivaca baze podataka Narodnih novina), Ivan Sprajc (profesor upravnog prava na Pravnom fakultetu u Zagrebu), te drugi istaknuti pojedinci hrvatske internet zajednice. LastTuesday je. . socijalna refleksija na komercijalizaciju Interneta i novih tehnologija . forum za problematiziranje upotrebe tehnologija u edukacijske, medijske, umjetnicke i druge neprofitne svrhe . propitivanje dihotomija i suceljavajucih smjerova u suvremenom drustvu prozetom novim tehnologijama: : prosumer < - -> consumer : korporacijski < - -> non-profit : trzisna kompeticija < - -> kooperacija u zajednici : sadraj < - -> tehnologija LastTuesday je forum za redovite mjesecne diskusije i teorijske radionice koji okuplja osobe iz medijskih, umjetnickih, teorijskih, tehnoloskih i aktivistickih neprofitnih krugova. Za LastTuesday, Marcell Mars andrija Kontakt: 0916272355, m@rcell.net; 0915747602, andrija@mi2.hr 4856400 mama; net.culture club mama preradoviceva 18, zagreb Opis slucaja : Narodne novine 16. srpnja 2001. HrOpen, Hrvatski forum korisnika otvorenih sustava izdao je Priopcenje za javnost u kojem ostro osudjuje odluku Narodnih novina da pocne naplacivati pristup sluzbenom listu putem internet-stranice http://www.nn.hr. Od 17. srpnja 2001. onemoguceno je besplatno pregledavanje Narodnih novina na Internetu odnosno pregledavanje je omoguceno samo korisnicima koji se upisu i doznace pretplatu od 850 kuna godisnje. 24. srpnja Nevladina udruga GONG poslala je prosvjed Narodnim novinama s molbom da i dalje omogucavaju gradjanima besplatan pristup svojim stranicama, a s obzirom na to da se jedino u Narodnim novinama nalaze svi propisi koje izdaje Republika Hrvatska. Time je prema misljenju GONG-a ugrozena pravna sigurnost gradana i znatno otezano informiranje o pravima i obvezama gradjana utvrdenima Ustavom i zakonima RH. 31. kolovoza - Udruga GONG priopcila je da je izradila Web stranicu pod nazivom Novine narodu, na kojoj se nalaze svi pravni propisi doneseni u Hrvatskoj od 1990. do danas, isticuci da sve zainteresirane osobe imaju mogucnost besplatnog pristupa, pretrazivanja i koristenja tekstova pravnih propisa sa te stranice. 15. rujna 2001. Narodne novine su nakon javne reakcije ipak omogucile besplatan pristup svojim stranicama, ali je za pretrazivanje potrebno platiti pretplatu. GONG je na svojim stranicama ostavio pretrazivac. 28. sijecnja 2002. Dobrica Pavlinusic, istaknuti clan hrvatske Linux zajednice, pokrenuo je Open source (otvoreni kod) projekt NN: pretrazivac za hrvatski jezik. Dobrica je koristio vec postojece Open source projekte i napravio izvrstan pretrazivac, a pri tom je vazan dio projekta vracen Open source zajednici na nacin da je na CPAN-u, bazi Open source modula za programski jezik perl, moguce skinuti i besplatno koristiti Dobricin modul Lingua::Spelling::Alternative. To je dokaz kako kvalitete Dobricina rada, tako i uspjesnosti Open source modela i kulture nesebicne razmjene informacija. Linkovi: http://nn.rot13.org http://www.gong.hr/novine_narodu http://www.open.hr/priopcenja/priopcenje20010716.html http://www.nn.hr