NN: pretraživač za hrvatski

Information wants to be free

Pisanje pretraživača zakona objavljenih u Narodnim novinama sa podrškom za hrvatski jezik

Dobrica Pavlinušić <dpavlin@rot13.org> 28.01.2002.

Informacije moraju biti dostupne

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.

Open Source filozofija

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.

Implementacija pretraživača

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 pokušaj

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).

Drugi pokušaj

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.

Napredno pretraživanje

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.

Razni oblici riječi

Jedna od specifičnosti hrvatskog jezika su mnogobrojni oblici iste riječi. Zbog toga je naš primjer od prije bio donekle proizvoljan. Naime, upit "porez kava" zapravo ne bi našao zakon "Zakon o posebnom porezu na kavu", dok bi upit "porezu kavu" imao kao rezultat traženi zakon. Zbog toga je zanimljivo naći u kojim se sve oblicima neka riječ može zapisati i u bazu zapisati sve moguće oblike te riječi. To zapravo znači da će zakon "Zakon o posebnom porezu na kavu" zapravo biti zapisan kao "zakon o posebnom posebno posebna posebne posebnu posebni posebnoh posebn posebnim posebnih posebnog posebnoj porezu poreza poreze porezi porezom porez porezo porezim porezih porezog porezoj porezem na kavu kava kave kavi kavom kav kavo kavim kavih kavog kavoj kavem" da bi se mogao pronaći bilo koji oblik riječi u naslovu. Neke od tih kombinacija nisu ispravne, ali kako su nastale statističkom analizom, a ne gramatičkom, za početak ćemo se morati zadovoljiti time.

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.

Kreiranje savršenog affix-a

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.

Koraci za budućnost

Ono što ostaje za napraviti u vezi pretraživača je:

Praktična usporedba s GONG-ovim pretraživačem

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.

Vraćanje Open Source zajednici

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.

Zahvale ljudima iz Open Source zajednice

Budućnost je već počela

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.

Usporedba sa komercijalnim pretraživačem NN

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).

Pretraživanje cijelog teksta zakona

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).

Povijest ovog dokumenta

Statistika korištenja

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č.

graf posjeta

poziv na lasttuesday


_*_|________[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

Slični projekti