Obsah | Dal¹à | Pøedchozà |
Filtry jsou souèástà vyhledávacÃho serveru. Jejich úkolem je pøevod dat (dokumentù i dotazù) do jednotného formátu. Jedná se o pøevod na termy, se kterými potom pracuje databázové jádro vyhledávacÃho serveru. Termem nazýváme slovo zÃskané z dokumentu a ohodnocené váhou. Váha termu je hodnota urèujÃcà èetnost výskytu a význam termu v dokumentu. Vìt¹à váhu majà zvýraznìná nebo opakujÃcà se slova.
Dokumenty, které zadá u¾ivatel k indexaci, jsou rùzných typù, ale i v rùzných typech kódovánÃ. Také termy lze upravit èi nevhodné odstranit. Proto je pøevod dat na termy rozdìlen na nìkolik èástÃ. Ka¾dou specifickou èást provádà jeden filtr. NapøÃklad filtr "Code" dokument pøekóduje zatÃmco filtr "CutHTML" zÃská slova z HTML dokumentu. Ka¾dý filtr má tedy svùj úkol a teprve zøetìzenÃm v¹ech filtrù dostaneme termy v po¾adované formì.
Zpracovánà dokumentu (i dotazu) je rozdìleno na nìkolik èástÃ. Ka¾dý filtr obstarává pouze urèitou èást. O existenci ostatnÃch filtrù nemá ¾ádné informace a je na nich zcela nezávislý. Ka¾dý filtr je realizován krátkým programem, který plnà urèitou èinnost pøi zpracovávánà dokumentu nebo dotazu. Jedná se o program, který na vstupu dostane data, ty zpracuje a po¹le na výstup. Vhodným zøetìzenÃm (spu¹tìnÃm) vÃce filtrù pak dostaneme potøebný výsledek pro databázové jádro vyhledávacÃho serveru. Ka¾dý filtr mù¾e mÃt vlastnà konfiguraci, která je ulo¾ena v pøÃslu¹ném souboru. Filtr si tento soubor naète a podle konfigurace zpracuje data, která obdr¾à na vstupu. NapøÃklad filtr zÃskávajÃcà jednotlivá slova z dokumentu si naète tabulku, kde zjistÃ, které znaky se mohou ve slovech vyskytovat (ostatnà znaky jsou pova¾ovány za oddìlovaèe). ZÃskaná slova posÃlá na výstup. Dal¹à filtry tak mohou pracovat ji¾ se slovy (lematizace, stoplist,...).
Ke ka¾dému dokumentu pøÃslu¹à hlavièka dokumentu. Hlavièka obsahuje základnà informace o dokumentu. Podle nastavenà polo¾ek v hlavièce se rozhoduje o tom, které filtry se spustÃ. Hlavièka také mù¾e slou¾it pro pøedávánà informacà dal¹Ãm filtrùm. Pøi volánà filtru je tedy potøeba zadat datový vstup, datový výstup a také hlavièku. NapøÃklad filtr pro pøekódovánà si v hlavièce zjistà druh kódovánÃ, naète si pøÃslu¹nou kódovacà tabulku a dokument pøekóduje. Nìkteré polo¾ky v hlavièce nastavà na zaèátku aplikaènà server, dal¹à pak mù¾e vyplnit libovolný filtr. Nastavenà mù¾e ovlinit i u¾ivatel zadánÃm pøÃslu¹ných hodnot (napøÃklad lze specifikovat v jakém jazyce u¾ivatel dotaz zadává, èi jaký dokument posÃlá k indexaci,...).
Polo¾ky obsa¾ené v hlavièce:
Prvnà tøi polo¾ky obsahujà doplòujÃcà informace o dokumentu a jsou s termy ulo¾eny v databázi. Dal¹à polo¾ky jsou potøebné pro správnou èinnost filtrù. Polo¾ka charset urèuje druh kódovánÃ. Se systémem Agent jsou dodávány následujÃcà tabulky: iso-8859-2 (pou¾Ãvané na systémech Unix - støednà Evropa), win-1250 (kódovánà pro Windows - støednà Evropa) a MacCE (kódovánà na poèÃtaèÃch Macintosh - støednà Evropa). Typ dokumentu (type) urèuje o jaký textový dokument se jedná. NapøÃklad HTML, T602, Word nebo pouze èistý TEXT. Dokument mù¾e být vÃcejazyèný. Jazyk dokumentu (language) je tedy øetìzec obsahujÃcà zkratky jazykù, které se v dokumentu vyskytujÃ. Doporuèuji tøÃpÃsmené mezinárodnà zkratky (napø. "ENG CZE FRA SVK RUS GER SPA ..."). Dal¹Ãmi polo¾kami v hlavièce jsou volné polo¾ky (free1, free2 a free3). Tyto polo¾ky filtry nevyu¾ÃvajÃ, ale mohou je pou¾Ãt novì vzniklé filtry. Buï pro pøedávánà informacà mezi jednotlivými filtry nebo pro nastavanà dal¹Ãch informacà o dokumentu (napøÃklad velikost dokumentu, poèet slov, ...). Pøedposlednà polo¾kou je parametr path. Ten mù¾e být nastaven vyhledávacÃm serverem nebo pomocà pøÃkazu SET v konfiguraènÃm souboru pro FilterManager (viz. dále). Polo¾ka obsahuje adresáøovou cestu k adresáøi urèenému pro filtry. Filtry tuto polo¾ku pou¾Ãvajà pøi hledánà konfiguraènÃch souborù a tabulek. Poslednà polo¾ka (error) je pro zapisovánà chyb. Pokud nìjaký filtr zaznamená chybu pøi své èinnosti, tak ji zapùe do této polo¾ky.
Jak bylo øeèeno, pro zpracovánà dokumentu se pou¾Ãvá nìkolik filtrù v urèitém poøadÃ. Kdy a jaký filtr bude zavolán urèuje správce filtrù - FilterManager. FilterManager podle zadané konfigurace volá filtry jeden po druhém. Konfigurace (tj. poøadà v jakém se filtry volajÃ) je v konfiguraènÃm souboru. Cesta k tomuto souboru je jednÃm ze tøà parametrù, které FilterManager dostane pøi volánÃ. Poøadà volánà jednotlivých filtrù je následujÃcÃ:
Nìkteré filtry mohou být vynechány, nìkteré mohou být spu¹tìny i vÃcekrát. NapøÃklad je-li znám typ kódovánà nenà tøeba volat filtr pro urèenà typu kódovánÃ. Filtr pro sluèovánà termù mù¾eme zavolat vÃcekrát, aby se po ka¾dém volánà zmen¹il objem dat. Na stejné úrovni se mù¾e objevit nìkolik filtrù, volá se v¾dy jen ten správný. NapøÃklad u filtrù pro zÃskávánà slov (termù) se pou¾ije filtr podle typu dokumentu (HTML, TEXT). V jiném pøÃpadì se pou¾ije i vÃce filtrù. NapøÃklad pro dvojjazyèný dokument se zavolajà dva stoplisty (filtry vyhazujÃcà "nevhodná" slova). Pokud o dokumentu nic nevÃme, spustà se témìø v¹echny filtry. Pokud je dokument vÃcejazyèný spustà se i v¹echny Stoplisty a Lematizátory (v podstatì se spustà úplnì v¹echny filtry). Bì¾ný HTML dokument má velikost do 10KB a pøefiltrovánà trvá øádovì desÃtky milisekund (100-200 ms). Pokud se spustà v¹echny filtry, tak pøefiltrovánà trvá maximálnì 500 ms. Chceme-li pøefiltrovat vìt¹à dokument, tak èasová nároènost roste, nebo» proudy dat (class strstream) zpomalujà èinnost filtrù. Vìt¹à dokumenty (o velikosti pøibli¾nì 100KB) se pøefiltrujà do nìkolika vteøin. Filtrace pøi pøidávánà dokumentu do databáze tolik nepodléhá rychlostnÃm nárokùm, ale vyhodnocenà dotazu musà být co nejrychlej¹Ã. To filtry splòujÃ, nebo» krátký dotaz je pøefiltrován okam¾itì. Je¹tì jeden faktor ovlivòuje rychlost filtrù. Prvnà spu¹tìnà filtrù je pomalej¹Ã, nebo» se musà naèÃst DLL knihovny. Ka¾dé dal¹à volánà je ji¾ mnohem rychlej¹Ã.
Urèenà filtrù, které se pou¾ijà pro filtraci, a následné urèenà jejich poøadÃ, s sebou pøiná¹à urèité problémy.
Konfiguraènà soubor vhodný pro velké dokumenty nemusà být vhodný pro velmi krátký dokument èi dotaz. Je mo¾né vytvoøit nìkolik konfiguraènÃch souborù a zále¾à na konfiguraci FilterManageru, který si zvolÃ. Postup vytváøenà a editace konfiguraènÃho souboru je uveden v PøÃruèce administrátora (kapitola 9.4).
Fomát dat je pevný a musà ho dodr¾ovat v¹echny filtry. Syntaxe vycházà z jazyka SGML. Jedná se o vkládánà takzvaných "tagù" mezi data textového dokumentu. Termy zÃskané z dokumentu se oznaèujà tagem <T>. Na zaèátku se nevyskytujà ¾ádné tagy <T>. Nìkteré filtry zÃskávajà z dokumentu jednotlivé termy (vkládajà tag <T>) a ty jsou následnì vyu¾ity dal¹Ãmy filtry. Jedná se o filtry, které pracujà s termy (lematizace, stoplist). Tyto filtry mezi daty hledajà tagy <T> a ty dále zpracovávajÃ. Data, která si filtry pøedávajÃ, majà nasledujÃcà formát:
<DATA> <T WEIGHT=2>krabice</T> <T WEIGHT=1>internet</T> <T>and</T> <T WEIGHT=12>house</T> </DATA>
- Jediný povinný "tag" je <DATA>, ostatnÃ
tagy jsou nepovinné.
- V souèasné dobì filtry znajà pouze dva tagy: <DATA> a
<T>.
- Je mo¾né zavést dal¹à tagy i parametry, ale na¹e filtry
je budou ignorovat (napø. pro oznaèenà vÃceslovných termù).
- Filtry zpracovávajà pouze data uzavøená tagem <DATA>.
Parametry tagù:
Slovo ignorovat chápu, tak ¾e se neznámé tagy èi parametry budou pouze pøedávány na výstup (ale neztratà se). I pøidánÃm parametru u tagu <T> se nic nezmìnÃ.
Proè jednotný formát dat ?
V¹echny filtry majà stejné chovánÃ. NaèÃtajà data ze
vstupu a zapisujà na výstup. Data jsou v textové podobì a
datová struktura je proto pro v¹echny filtry stejná. Filtry
tedy nepotøebujà vìdìt o existenci ostatnÃch filtrù. NevÃ
ani, v jakém poøadà budou spu¹tìny. Filtr hledá v datech
to, co umà zpracovat, ostatnà ignoruje. Pokud chce u¾ivatel
pøidat nový filtr, jednodu¹e podle tagù dokument
pøefiltruje. NapøÃklad pokud spustÃme jako prvnà filtr
StopENG, tak ten ¾ádné termy nenajde a pouze data pøedá na
výstup v nezmìnìné podobì (ale datùm vlastì rozumìl).
Pøidánà nového filtru.
U¾ivatel si mù¾e vytvoøit vlastnà filtr a v konfiguraènÃm
souboru specifikovat, kdy se má zavolat. Filtr nesmà ru¹it
¾ádné tagy a ani jemu nesrozumitelná data by nemìl mazat.
JednÃm z filtrù, který pøipadá v úvahu, je napøÃklad
filtr pro zpracovánà vÃceslovných termù. Dal¹Ãm je
napøÃklad filtr, který se bude sna¾it v dokumentu hledat
autora nebo datum vzniku, èi poslednà aktualizace.
Filtr zji¹»uje, zda se jedná o HTML dokument. Filtr pouze ète data a hledá tag <HTML>. Pokud je tag nalezen, tak se nastavà v hlavièce typ dokumentu na "HTML", jinak se hlavièka dokumentu nezmìnÃ. Data se pøedávajà na výstup nezmìnìna. Tento filtr nemá ¾ádný konfiguraènà soubor. Pokud se v HTML dokumentu hledaný tag nevyskytuje, tak zÃskávánà termù z dokumentu by mìl provádìt filtr pro èistý text (CutTEXT). Ten samozøejmì slova z dokumentu zÃská, ale k nim pøipojà i slova pøedstavujÃcà HTML tagy. Dnes se v¹ak ji¾ chybné HTML dokumenty na Internetu prakticky nevyskytujÃ.
Filtr zji¹»uje kódovánà dokumentu (tj. o jakou znakovou sadu se jedná).
Filtr si naète v¹echny kódovacà tabulky. Ka¾dé kódovánà má své vlastnà poèÃtadlo znakù. V konfiguraènÃm souboru si filtr zjistÃ, které znaky jsou "dobré" a které "¹patné" (viz. konfiguraènà soubor). Potom ji¾ filtr ète data (znak po znaku). Ka¾dý znak pøekóduje podle v¹ech tabulek a zjistÃ, jestli se znak pøekóduje na "dobrý". Pokud ano, tak se zvý¹à hodnota poèÃtadla pøÃslu¹ného kódovánÃ. Mezi kódovánà patøà i "win-1250". V tomto pøÃpadì se znak nepøekódovává, ale pouze se testuje, zda patøà mezi "dobré". Nakonec se vybere kódovánÃ, které zÃská nejvÃce "dobrých" znakù (v pøÃpadì rovnosti vÃce kódovánà má pøednost kódovánà "win-1250"). Pokud bude konfiguraènà soubor obsahovat velké mno¾stvà dobrých znakù, mù¾e se stát, ¾e filtr správnì nerozpozná kódovánà a èasto bude upøednostòovat kódovánà "win-1250" (nebo» dokument bude dobrý podle jakékoli kódovacà tabulky). Proto¾e filtr ka¾dý znak porovnává se v¹emi tabulkami, nenà vhodné mÃt v adresáøi velké mno¾stvà tabulek, nebo» by zpomalovaly èinnost filtru. Kódovánà lze zjistit i z HTML dokumentu (z META tagu), ale to nemusà být správné, nebo» dokument se vìt¹inou pøekódovává buï na stranì serveru nebo na stranì klienta. Toto øe¹enàtedy v systému Agent nenà zahrnuto.
Filtr pøekóduje dokument ze zadaného kódovánà do "win-1250". V hlavièce je nastaveno kódovanà dokumentu. Filtr si podle jména kódovánà najde pøislu¹nou tabulku na disku. Jméno kódovánà v hlavièce musà pøesnì odpovÃdat jménu souboru na disku (bez koncovky ".tab"). Potom podle tabulky pøekóduje celý dokument.
Filtr z HTML dokumentu zÃská termy (odstranà HTML tagy). Velká pÃsmena se pøevedou na malá (pokud chce u¾ivatel velká pÃsmena zachovat tak staèà v konfiguraènÃm souboru pøepsat kódy pøÃslu¹ných znakù na hodnotu "Y"). Teèka slou¾à jako oddìlovaè. To znamená, ¾e datum 24.12.1998 se rozpadne na tøi èÃsla. To mù¾e nìkdo pova¾ovat za nevýhodu, ale pokud hledáme dokument obsahujÃcà text "December 1998", tak dokument obsahujÃcà datum 24.12.1998 bude mezi nalezenými dokumenty a to je spravné. To samé platà pro URL adresy. Výsledkem dotazu "mff.cuni.cz" budou v¹echny dokumenty, obsahujÃcà libovolnou URL adresu z domény mff. Pokud se v dokumentu vyskytne tag <TITLE>, tak z nìj zÃská název dokumentu a nastavà ho do hlavièky.
Nejprve si filtr naète pøÃslu¹né konfiguraènà soubory. Soubor "usechar.cfg" obsahuje informace o tom, které znaky slou¾à jako oddìlovaèe. Soubor "easytags.cfg" obsahuje váhy jednotlivých tagù a soubor "entita.cfg" obsahuje pøepis HTML entit (napø í znamená "Ã").
Filtr ète dokument - znaky patøÃcà do textu (objevà se po zobrazenà HTML prohlþeèem) si uchovává v bufferu. Kdy¾ pøijde znak, který slou¾à jako oddìlovaè, tak ze znakù v bufferu vytvoøà nový term a po¹le ho na výstup. Váhu termu urèà aktualnà váha, která se mìnà v závislosti na HTML tazÃch. Pokud pøijde na vstupu tag HTML jazyka, tak se filtr podÃvá do svého seznamu. Pokud pøÃslu¹ný tag najde, upravà aktualnà váhu. Pokud má tag nastaveno zalomenà (viz. PøÃruèka administrátora), vyprázdnà se buffer (term se po¹le na výstup). Neznámé tagy se zahazujÃ. U¾ivatel si ale mù¾e pøidat i vlastnà metodu na zpracovánà slo¾itìj¹Ãho HTML tagu. Musà ji v¹ak naprogramovat a potom znovu zkompilovat DLL knihovnu. Takto byla vytvoøena metoda na zpracovánà tagu <IMG> (HTML tag pro vlo¾enà obrázku). Metoda v tagu najde alternativnà text (zobrazuje se mÃsto obrázku) a ten zaøadà mezi termy. Jestli¾e filtr narazà na HTML entitu, tak ji hledá v seznamu. Pokud ji najde, pøidá do bufferu znak, který entita vyjadøuje. Jinak se nejedná o HTML entitu a v¹echny pøeètené znaky se pøidajà do bufferu.
Filtr z textového dokumentu zÃská termy.
Nejprve si filtr naète konfiguraènà soubor, aby vìdìl, které znaky slou¾à jako oddìlovaèe (soubor "usechar.cfg"). Podrobnosti naleznete u filtru CutHTML. Filtr ète dokument a znaky nepatøÃcà mezi oddìlovaèe si uchovává v bufferu. Kdy¾ pøijde znak, který slou¾à jako oddìlovaè, tak ze znakù v bufferu vytvoøà nový term a po¹le na výstup. Buffer se vyprázdnà a ètenà pokraèuje a¾ do konce.
Filtr zji¹»uje, zda se jedná o dokument v èe¹tinì. Filtr si naète z konfiguraènÃho souboru èeská slova. Potom ète ze vstupu termy (tag <T>) a porovnává je se slovy v konfiguraènÃm souboru. Jakmile najde term shodný s nìjakým slovem, tak se ji¾ pouze pøefiltrujà data na výstup a do hlavièky se pøidá èeský jazyk - hodnota je "CZE". Filtr tedy hledá zadaná slova v dokumentu a pøi prvnÃm úspìchu èinnost ukonèÃ.
Filtr zji¹»uje, zda se jedná o dokument v angliètinì. Filtr má stejné chovánà jako filtr TryCZE. Pouze v pøÃpadì úspìchu se do hlavièky pøidá anglický jazyk - hodnota je "ENG".
Filtr lematizuje termy (odstranà koncovky u èeských slov). Filtr ète jednotlivé termy (tag <T>) a ty lematizuje. Tento filtr nepou¾Ãvá ¾ádný konfiguraènà soubor.
Pøi vyhledávánà slova v textu vìt¹inou nepotøebujeme rozli¹ovat jeho jednotlivé tvary (pády, osoby), ale zajÃmá nás pouze výskyt slova v textu. K nalezenà základnÃho tvaru slova se v DIS pou¾Ãvá filtr zvaný lematizátor. Pou¾ità tohoto filtru pøiná¹à podstatné zmen¹enà objemu indexovaných slov.
Nalezenà základnÃho tvaru slova v èe¹tinì je pomìrnì nesnadná úloha. Potþe souvisà s bohatostà jazyka, která se projevuje pøedev¹Ãm velkým mno¾stvÃm koncovek a následnou neschopnostà rozli¹it, zda shluk pÃsmen je koncovka, nebo souèást kmene (napø. koncovka -em : objem, objemem). Dal¹Ãm problémem je napø. zmìna kmenové souhlásky, tvarová nejednoznaènost (napø. hrách mù¾e být tvarem slova hrách nebo hry), atd. Vytvoøenà dokonalého lematizátoru by proto samo o sobì zøejmì staèilo na samostatný projekt. Na¹Ãm cÃlem tedy bylo vytvoøit lematizátor, který by i pøes svou jistou nedokonalost pøiná¹el alespoò dÃlèà výsledky.
Lematizaci je zpravidla mo¾né provádìt dvìma základnÃmi pøÃstupy:
SlovnÃk je sice pomìrnì pøesný, ale nezpracuje neznámá slova, proto by vy¾adoval urèitou údr¾bu. Gramatika (soubor pravidel reprezentovaný koneèným automatem) doká¾e správnì lematizovat skoro v¹echna slova, vèetnì novotvarù, ale obvykle je neúplná a tÃm i nepøesná.
V na¹à implementaci je lematizátor realizován gramatikou doplnìnou o nìkteré výjimky. Pøi lematizaci se slovo procházà od konce a hledá se nejdel¹à mo¾ná koncovka podstatného nebo pøÃdavného jména, která se následnì odtrhne. Hlavnà výhodou této metody je rychlost, nebo» lematizátor nepotøebuje ¾ádná pomocná data a pracuje v lineárnÃm èase. Pøi testovánà bylo zji¹tìno, ¾e v¹echny pùvodnà tvary jednoho slova v jednotném i mno¾ném èÃsle se lematizacà redukujà na jeden, dva, pøÃpadnì tøi tvary (vÃce tvarù vzniká hlavnì v dùsledku zmìny kmenové souhlásky). Nevýhody této metody spoèÃvajà pøedev¹Ãm v tom, ¾e lematizacà se dvì rùzná slova mohou pøevést na stejný tvar a dále ¾e lematizátor prakticky nefunguje pro slovesa (podle tìch se ale v èe¹tinì pøÃli¹ nevyhledává).
Filtr lematizuje termy (odstranà koncovky u anglických slov).
Filtr ète jednotlivé termy (tag <T>) a ty lematizuje. Proto¾e vyhledávánà se provádà nejèastìji podle podstatných jmen, filtr pouze odstraòuje koncovku -s, pomocà které se tvoøà mno¾né èÃslo (odstranit vhodným zpùsobem koncovky u sloves je velmi obtþné). Ve vìt¹inì pøÃpadù se odøÃzne koncovka -s. Pouze u slov konèÃcÃch na -uses, -shes -sses, -ches se oøÃzne koncovka -es. Koncovky -xes a -zes jsou sporné. Ve vìt¹inì pøÃpadù je spravné odøÃznout pouze -s. Podrobnìj¹à rozbor je pøÃmo ve zdrojovém programu (LemENG.cpp). Tento filtr nepou¾Ãvá ¾ádný konfiguraènà soubor.
Filtr odstraòuje "nevhodná slova". Filtr ète jednotlivé termy (tag <T>) a zji¹»uje zda nejsou obsa¾eny ve "Stoplistu" (seznam nevhodných slov). Nevhodná slova jsou velmi frekventovaná nebo slova bez "významu" (napøÃklad pøedlo¾ky, spojky, sloveso být, ...). Termy obsa¾ené ve Stoplistu nejsou zapsány na výstup. Tento filtr nepou¾Ãvá ¾ádný konfiguraènà soubor.
V ka¾dém dokumentu se nìkterá slova vyskytujà vÃcekrát. OpakujÃcà se slovo je tøeba slouèit do jednoho výsledného termu. Také po lematizaci vznikajà shodné termy (napø. pod hradem, u hradu) a i tyto termy je potøeba slouèit. Filtr Count tedy spojà stejné termy a slouèà jejich váhu. Filtr hledá tagy <T>, které obsahujà stejná slova. Výsledkem je jediný term, který obsahuje v¹echny pùvodnà parametry a jediný parametr WEIGHT, který je souètem pùvodnÃch hodnot. V¹e je patrné z následujÃcÃho pøÃkladu.
<T PARAM1=value WEIGHT=3 PARAM2=value>radio</T> <T WEIGHT=2 PARAM3=value>radio</T>
pøevede se na:
<T WEIGHT=5 PARAM1=value PARAM2=value PARAM3=value>radio</T>
Souèasný návrh obsahuje pouze parametr WEIGHT, ale pokud si v budoucnu nìkdo pøidá dal¹à parametr, pak tento filtr nové parametry zachová a objevà se ve výsledném tagu <T>. V¹echny ostatnà tagy jsou propou¹tìny na výstup (tedy i novì pøidané). Tento filtr nepou¾Ãvá ¾ádný konfiguraènà soubor.
1999-03-04 | Radek Weisfeit |