Český lemmatizátor Proč a hlavně jak?

Představte si, že chcete například pomocí některého z celé řady českých plnotextových vyhledávačů nabízející...


Představte si, že chcete například pomocí některého z celé řady českých
plnotextových vyhledávačů nabízejících se na internetu najít něco na téma
"sběrný dvůr". Můžete být úspěšní, může ovšem nastat situace, kdy žádné takové
stránky nenajdete...
Pokud je tomu tak prostě proto, že žádné takové stránky neexistují, samo o sobě
by to stále ještě nebyl důvod k přemýšlení. Možná ale zato existují stránky
jiné, ve kterých se v nějaké souvislosti zmiňují "sběrné dvory", komentuje se
"umístění sběrných dvorů", jen tak mimochodem se sděluje, čeho byste se měli
zbavovat "ve sběrném dvoře" a podobně. Všechny takové texty by pro vás mohly
být zajímavé a koneckonců, právě od toho je plnotextový vyhledávač, aby vám
našel to, co hledáte, ať už je to v textech dokumentů schováno kdekoliv.
Jak řešit vlastně právě popsaný problém? Klasický nástroj, nabízený snad každým
vyhledávacím strojem či databázovým systémem, operátor pravostranného rozšíření
vyhledávaného výrazu, vám tady příliš nepomůže: Pokud chcete najít všechny
tvary slova "dvůr", museli byste zadat něco jako "dv*" (kde "*" je operátor
rozšíření) a pak byste vyhledávali mimo jiné všechny texty, kde se zmiňují
"dveře", "dvojčata", "dvojice" nebo třeba "dva". (V zájmu objektivity je ovšem
třeba dodat, že tohle ještě není tak hrozné, slov začínajících na "dv" v
češtině přece jen není tolik. Nicméně pokud byste se snažili obdobným způsobem
hledat "sůl kamennou", to už by vám asi opravdu nebylo pomoci.)
Navíc v systémech indexujících skutečně obrovské objemy textů za tím účelem,
aby uživatel nalézal pokud možno nejrelevantnější dokumenty ke svému požadavku,
nejde obvykle jen o to, zda se v textu vyskytuje hledaný výraz, ale také o to,
jak významně se tam vyskytuje což mimo jiné zahrnuje otázku, kolikrát se tam
vyskytuje. Odpovědět opravdu smysluplně na tento dotaz znamená dokázat zjistit,
že se v textu například vyskytuje třikrát slovo "dvůr", bez ohledu na to, v
jakém pádě a čísle, a ne jenom, že je tam jedenkrát řetězec znaků "dvory",
jedenkrát "dvorů" a jedenkrát "dvoře".

Lemmatizátor přichází
Indexovat texty s tím, že různé gramatické tvary téhož slova jsou rozpoznávány
jako stále stejné slovo (a ne jako formálně odlišné řetězce znaků), umožňuje
nástroj obecně nazývaný lemmatizátor. Někteří autoři ne zcela přesně ztotožňují
lemmatizátor s tím, co se v angličtině běžně nazývá "stemmer". Důvod tohoto
chronického zmatení a celé řady dalších mylných představ spojených s
problematikou lemmatizace ve vztahu k češtině zřejmě částečně spočívá v
odlišnosti anglického a českého tvarosloví. Podívejme se tedy na tento problém
trochu podrobněji.
Termín "lemma", od kterého se odvozuje "lemmatizace" a "lemmatizátor", se v
jazykovědné terminologii obvykle definuje jako "systémová, reprezentativní
forma slovníkové jednotky". To má poměrně široké spektrum možných interpretací.
Lemma určitého slova může být první pád jednotného čísla, ale také kmen slova
tj. to, co zbude, když se odstraní koncovka. No a právě tady je problém: kmen
je anglicky stem, anglické slovo stemmer tedy v doslovném chápání označuje
nástroj, který převádí slova na jejich kmeny.

Co je to stemmer?
V angličtině se v drtivé většině nedá rozeznat kmen a základní (slovníkový)
tvar slova. V angličtině je totiž koncovka něco, co se přidává na konec slova,
když se chce utvořit nějaký jiný než základní tvar. Zde je typický příklad
používaný jako ilustrace pojmu tvarosloví v anglických knihách: anglické slovo
"cat" (česky "kočka") má tvar množného čísla "cats" připojila se koncovka "-s".
Podívejte se na významově odpovídající příklad v češtině. Základní tvar slova
je "kočka", první pád množného čísla "kočky". Zde nedošlo k přidání koncovky,
ale k nahrazení jedné koncovky jinou! Kmen slova "kočka" je pak "kočk-", ale
ani to ještě není všechno. Ono totiž toto české slovo má kmeny tři. Ve tvaru
třetího nebo šestého pádu jednotného čísla "kočce" je tzv. změkčený kmen
"kočc-" (a koncovka "-e"). Ve tvaru druhého pádu množného čísla je pro změnu
rozšířený kmen "koček-", následovaný prázdnou koncovkou. A slovo "dvůr", kterým
jsme začali? To má také tři kmeny: "dvůr-" (který se vyskytuje jen s prázdnou
koncovkou), "dvor-" (pro většinu ostatních koncovek) a "dvoř-" (před koncovkou
"-e"). Už z toho by mělo být vidět, že zaměňovat "lemmatizaci" a "stemming",
pokud se bavíme o češtině, je dosti podivné, protože odstraněním koncovek se v
češtině obecně nedojde k žádné jednotné reprezentativní formě slova.
Pokud by však někomu uvedený argument nestačil, lze nabídnout druhý, ještě
závažnější. Slova každého lidského jazyka jsou občas homonymní neboli
nejednoznačná, např. v českém slovním tvaru "tancích" se těžko pozná, zda jde o
tance nebo o tanky. Ovšem pokud každé slovo nějakého českého textu prostě
"oholíme" o jeho koncovku, vytvoříme homonymii i na mnoha místech, kde původně
nebyla. Například ze slovních tvarů "pastí" a "pastou" tak vytvoříme v obou
případech lemma "past". Uživatel hledající něco o pastách pak nebude mít jinou
možnost než zároveň obdržet i všechny texty o pastích.

Data vs. algoritmus
Je tedy zřejmé, že český lemmatizátor by měl převádět slova na základní
slovníkové tvary, nikoli na kmeny. Je vůbec možné toho nějakým efektivním
algoritmem dosáhnout, když vidíme, jak je české tvarosloví složité? Možné to
je, a není to ani tak otázka dobrého algoritmu, jako spíš dobrých datových
struktur, které je třeba tomu algoritmu dodat. Především musí být vytvořena
řídicí tabulka, obsahující řadu pravidel typu "koncovku X nahraď koncovkou Y".
Ale protože, jak jsme si ukázali, některé koncovky u některých slov mění kmen,
je třeba také tuto skutečnost do lemmatizačních pravidel vhodně zakódovat.
Univerzální řešení problému spočívá jedině v tom, že se lemmatizátor vybaví
kompletním slovníkem a naprogramuje tak, aby po aplikaci každého pravidla
zkontroloval, jestli to, co vytvořil, je ve slovníku (a pro jistotu také,
jestli tomu slovník připisuje stejný ohýbací vzor, jaký je poznamenán u
lemmatizačního pravidla: jen tak se vyhneme mylné lemmatizaci tvaru "pasty" na
lemma "past"). Jednodušším, ale trochu riskantnějším řešením je připsat ke
každému lemmatizačnímu pravidlu určité podmínky na zbytek slova, např. ve formě
množiny písmen, která musejí nebo naopak nesmějí být vlevo od "pseudokoncovky".
Tyto podmínky je třeba pečlivě formulovat na základě znalosti slovní zásoby,
kterou má být lemmatizátor schopen zpracovávat. Nejvážnější problém asi je, že
to těžko někdo zvládne napoprvé dokonale. Lemmatizátor bez řídicího slovníku je
tedy zvlášť důležité nějakou dobu důkladně testovat, než se předá k rutinnímu
používání.

Nejen koncovky
Mimochodem, víte, že čeština má vlastně ještě dost štěstí, že při lemmatizaci
stačí (víceméně) pracovat s koncovkami? Je sice pravda, že to platí pro mnoho
(možná většinu) jazyků světa, nicméně existují i takové, ve kterých může být na
kmen slova přilepeno třeba deset gramatických přípon jedna za druhou (k těmto
jazykům patří např. turečtina). A existují jazyky, ve kterých se slova ohýbají
na obou koncích zároveň (do této skupiny patří např. irština nebo gruzínština).
Máme-li být důslední, ono i v češtině existuje pár čistě gramatických předpon,
které by se měly při lemmatizaci odstraňovat. Asi nejlepším příkladem je
předpona "nej-", kterou se tvoří třetí stupeň přídavných jmen a příslovcí. Ty
ostatní se v podstatě omezují na tvary sloves, což je vůbec ve většině jazyků
nejsložitější část tvarosloví. Ale tady máme štěstí ještě jednou. Jisté
statistické rozbory češtiny věcného stylu totiž už dávno ukázaly, že jen asi
12-13 % délky textů představují tvary sloves a to ještě asi polovina z toho
jsou taková slovesa jako být, mít, moci, muset a několik desítek dalších, která
nemají pro indexování a vyhledávání prakticky žádný význam.

Vodáci a vodníci
I tak tu stále zůstává jeden otevřený problém. Možná by ideální lemmatizátor
měl někdy převádět slova ještě dál než na jejich základní slovníkové tvary.
Není snad pravda, že text obsahující slovo "počítačový" je také svým způsobem
relevantní k vyhledávacímu požadavku vyjádřenému slovem "počítač"? To už ale
není řeč ani o odstraňování koncovek. V tomto případě bychom chtěli, aby
lemmatizátor odstranil příponu, která vytváří z jednoho slova jiné slovo. A
opět pochopitelně nejde jen o odstraňování, nýbrž o nahrazení obecného
zakončení zakončením hledaného lemmatu: např. přídavné jméno "vodní" by se mělo
analogicky převést na základní tvar podstatného jména "voda", a přídavné jméno
"knižní" na základní tvar podstatného jména "kniha". Někdy se v této
souvislosti, opět poněkud nepřesně, hovoří o potřebě převádět tvary slov až na
jejich "kořeny" (anglicky "roots"). K takovým koncepcím je ale třeba
přistupovat velmi opatrně. Kdyby lemmatizátor převáděl všechna česká slova
opravdu až na jejich kořeny (ve smyslu "od čeho bylo slovo odvozeno"), pak by
např. slova "vodák", "vodník" i "vodnice" musel všechna převést na lemma
"voda". To by ale jistě z hlediska většiny uživatelů vyhledávacích systémů
nepřijatelně snižovalo přesnost vyhledávání.

Analýza textu
Posledním problémem, který lemmatizátor nemůže v pravém smyslu slova vyřešit,
ale musí se s ním nějak rozumně vypořádat, jsou homonymní slovní tvary jako
např. výše uvedený tvar "tancích". Solidní lemmatizátor, ať už s řídicím
slovníkem nebo bez něj, by měl rozpoznat, že může jít o obě slova, "tanec" i
"tank". A protože lemmatizátor sám to nemůže s jistotou rozhodnout, indexující
systém by měl s oběma možnostmi počítat s určitou mírou nejistoty. Tato
"lokální nejistota" se mimochodem v konečném výsledku indexování, resp.
vyhledávání, vůbec nemusí projevit, pokud bude použit nějaký pokročilejší
nástroj umožňující alespoň částečnou obsahovou analýzu celého textu ale to už
by bylo téma na úplně jiný článek.

Co je co?
Lemmatizátor: Nástroj, který převádí slova na jejich základní slovníkovou
jednotku, nejčastěji 1. pád jednotného čísla.
Stemmer: Nástroj, který převádí slova na jejich kmeny. V češtině není funkce
lemmatizátoru a stemmeru totožná, protože odstraněním koncovky často nedojde k
jednotné reprezentaci určitého slova.
Homonymie: Víceznačnost slov, kdy jeden výraz může být odvozen od více různých
slov ("o tancích" může souviset buď s tancem nebo s tankem). Příbuzným pojmem
je polysémie, která označuje více významů jediné slova.









Komentáře
K tomuto článku není připojena žádná diskuze, nebo byla zakázána.