Dotazovací jazyk korpusového manažeru Bonito
Michal KřenI. Regulární výrazy
Ještě než začneme s výkladem o regulárních výrazech, je třeba přesně vysvětlit pojmy pozice, atribut a strukturní značka. Pozicí rozumíme libovolné jedno slovo nebo interpunkční znaménko, zjednodušeně řečeno cokoli, co lze najít korpusovým manažerem. Pro korpusový manažer Bonito je každý korpus sledem mnoha pozic, jejichž celkový počet pak vlastně určuje velikost korpusu. Tento počet je udáván v menu Korpus > Souhrnné informace. Každý korpus může mít dále definováno několik atributů, nejméně však jeden - tímto základním atributem je word a jeho hodnotou je vlastní slovní tvar, který je zobrazován v nalezených konkordancích. Korpus SYN2000, jehož se budou týkat všechny příklady v této kapitole, má například atributů pět: word (slovní tvar), lemma (základní slovníkový tvar), tag (morfologickou značku), lc (slovní tvar psaný malými písmeny) a pos (slovní druh - jde vždy o první pozici atributu tag). Každá pozice v korpusu musí mít určeny hodnoty všech atributů, definovaných pro daný korpus, což je vidět na následujícím úryvku z korpusu SYN2000, kde každý řádek odpovídá jedné pozici a každý sloupec jednomu atributu. Značky </s> a <s> označují konec a začátek věty a jsou příklady strukturních značek. Tyto značky stojí mimo pozice s jejich atributy a typicky člení text na jednotlivé hierarchicky uspořádané části, například korpus SYN2000 se skládá z mnoha dokumentů (<doc>) a každý dokument pak ještě z jednotlivých vět (<s>).
Úryvek z korpusu SYN2000 tak, jak je interpretován
korpusovým manažerem:
| číslo pozice | atribut word | atribut lemma | atribut tag | atribut lc | atribut pos |
| # 27 121 778 | světě | svět | NNIS6-----A---- | světě | N |
| # 27 121 779 | . | . | Z:------------- | . | Z |
| </s> | |||||
| <s> | |||||
| # 27 121 780 | Konference | konference | NNFP1-----A---- | konference | N |
| # 27 121 781 | se | se | P7-X4---------- | se | P |
| # 27 121 782 | staly | stát | VpTP---XR-AA--- | staly | V |
| # 27 121 783 | důležitým | důležitý | AAIS7----1A---- | důležitým | A |
| # 27 121 784 | článkem | článek | NNIS7-----A---- | článkem | N |
| # 27 121 785 | komunikačního | komunikační | AAIS2----1A---- | komunikačního | A |
| # 27 121 786 | procesu | proces | NNIS2-----A---- | procesu | N |
| # 27 121 787 | . | . | Z:------------- | . | Z |
| </s> | |||||
| <s> | |||||
| # 27 121 788 | Po | po | RR--6---------- | po | R |
| # 27 121 789 | druhé | druhý | AAFS6----1A---- | druhé | A |
Korpusový manažer Bonito umožňuje při vyhledávání používat tzv. regulárních výrazů. Zjednodušeně řečeno se jedná o vkládání určitých speciálních znaků se zvláštním významem do slov, která chceme vyhledat. S podobnou, i když velmi primitivní formou se můžeme setkat třeba při hledání souborů ve Windows (pomocí menu Start > Hledat), při kterém nemusíme znát přesně celý název souboru. Pokud si například u souboru seznam.txt nepamatujeme jeho příponu, stačí pro hledání zadat seznam.* - hvězdička v tomto případě zastupuje libovolnou koncovku. Podobně lze postupovat i při vyhledávání pomocí korpusového manažeru, jeho možnosti jsou však daleko širší. Chceme-li tedy například v korpusu vyhledat všechny tvary slova bobule, nechceme je všechny vypisovat a nechceme ani používat lemmatizaci, je možné zadat dotaz bobul.* - tečka zde zastupuje libovolný znak a hvězdička libovolný počet opakování předchozího (tj. libovolného) znaku. Musíme však počítat s tím, že manažer vyhledá všechna slova začínající bobul, tedy například i adjektivum bobulovité apod. Sekvence .* zastupuje tedy libovolnou část slova a je zřejmě vůbec nejčastěji používanou součástí regulárního výrazu. Může se vyskytnout samozřejmě i na začátku nebo uprostřed slova. V regulárních výrazech lze kromě běžných znaků používat všechny následující speciální znaky:
- tečka (.) - představuje jeden libovolný znak,
- interval ({n, k}) - představuje n až k opakování předchozího znaku nebo výrazu; je-li k vynecháno, odpovídá intervalu nejméně n opakování, pokud má interval tvar {n}, odpovídá mu přesně n opakování;
- hvězdička (*) - představuje libovolný počet (0 a více) opakování předchozího znaku nebo výrazu, totéž co {0,}
- plus (+) - představuje 1 nebo více opakování předchozího znaku nebo výrazu, totéž co {1,}
- otazník (?) - představuje žádný nebo jeden výskyt předchozího znaku nebo výrazu, totéž co {0,1}
- seznam ([]) - představuje alternativu - libovolný jeden znak z těch, které jsou uvedeny v seznamu uvnitř hranatých závorek; pokud je prvním znakem seznamu stříška (^), jde o negovaný seznam a představuje tedy libovolný jeden znak kromě těch uvedených uvnitř závorek; v rámci seznamu je možné používat také pomlčku (-) jako operátor rozsahu,
- svislá čára (|) - představuje také alternativu, ne ovšem mezi jednotlivými znaky, ale celými řetězci,
- kulaté závorky - libovolnou část výrazu je možné seskupit do kulatých závorek a ovlivnit tak prioritu jeho vyhodnocování,
- zpětné lomítko (\) - pokud některý speciální znak předchází zpětné lomítko, ztrácí tento znak svůj zvláštní význam; následuje-li však za zpětným lomítkem číslice, považuje se číslo za lomítkem za oktalový kód znaku v ISO Latin 2 - to je výhodné zejména pro uživatele v zahraničí, kteří nemají k dispozici českou klávesnici.
Příklady regulárních výrazů najdete v následující
tabulce:
| Příklad | regulární výraz |
| všechny tvary slova ptakopysk | ptakopys.* |
| slovo kdy s malým nebo velkým počátečním písmenem | [kK]dy |
| tečka jako interpunkční znaménko | \. |
| infinitivy předponových sloves od nést | .+nést |
| různě dlouhé varianty citoslovce ratata | ra(ta)+ |
| pravopisnou dubletu: diskuze psané i se s | diskuse|diskuze nebo disku[sz]e |
| morfologické varianty slova smích (s vyloučením tvarů odvozených od slov Smíchov a smíchat) | [Ss]mích[^oaá].*|[Ss]mích |
| libovolná čísla skládající se ze tří nebo čtyř cifer | [0-9]{3,4} |
II. Dotazovací jazyk korpusového manažeru
Celý dotazovací jazyk korpusového manažeru je vlastně rozšířením výše uvedených možností regulárních výrazů a jejich aplikací na vyhledávání v korpusu. Klíčem k němu je porozumění rozdílu mezi dotazy bobul.*, "bobul.*" a [word="bobul.*"]. Ve všech případech jde o dotaz na jednu pozici. Podstatné však je, že máme-li nastevený jako implicitní atribut word, jsou všechny tři výše uvedené dotazy ekvivalentní, tj. dávají přesně týž výsledek. Není-li implicitním atributem word, výsledky stejné nebudou, protože první dva dotazy jsou příkladem zjednodušeného zápisu dotazu na implicitní atribut korpusu (tímto atributem je po spuštění manažeru vždy word, ale obecně jím být nemusí). První z těchto dotazů je však zjednodušen natolik, že je lze použít v případě víceslovných výrazů jen někdy, často je třeba hledané slovo uzavřít do uvozovek. Konečně poslední, třetí případ s explicitním uvedením atributu je naopak nejobecnější a funguje vždy stejně bez ohledu na nastevení implicitního atributu. Rozdíl mezi těmito třemi případy nyní demonstrujeme na příkladu hledání frazému držet krok. Chceme-li jej najít v této podobě, stačí zadat do manažeru dotaz držet krok.V tomto případě je však výhodné využít lemmatizace, a tedy se ptát nikoli pouze na infiintiv, ale na všechny tvary slovesa. K tomu je ovšem třeba již použít zápis [lemma="držet"] [word="krok"] nebo jednodušeji - je-li implicitním atributem word - [lemma="držet"] "krok". Protože však jde o dotaz na dva různé atributy (nejen word, ale i lemma), není v tomto případě možné dotaz ještě více zjednodušit a napsat krok bez uvozovek. Uvedený dotaz je dále možné rozšiřovat a zobecňovat, přičemž uvnitř uvozovek je samozřejmě možné použít libovolný regulární výraz.
Další možnosti uvádí následující tabulka:
| Příklad | dotaz |
| výraz držet krok | držet krok |
| jeden z výrazů držet krok nebo udržet krok | u?držet krok |
| dtto, ale sloveso nemusí být v infinitivu | [lemma="u?držet"] "krok" |
| dtto, ale i substantivum může být v libovolném tvaru | [lemma="u?držet"] [lemma="krok"] |
| dtto, navíc je možný výskyt až pěti slov mezi nimi | [lemma="u?držet"] []{0,5} [lemma="krok"] |
| ekvivalentní s předchozím dotazem | [lemma="držet" | lemma="udržet"] []{0,5} [lemma="krok"] |
Předchozí tabulka si zaslouží několik vysvětlujících komentářů. V první řadě je třeba zdůraznit, že vždy platí (s výjimkou výše popsaného zjednodušeného zápisu bez explicitního uvedení atributu), že každé pozici odpovídá hranatá závorka, ve které je určena podmínka, kterou musí splňovat určitý atribut (nulovou podmínku prázdných hranatých závorek splňuje libovolná pozice). Dále si všimněte, že některé ze speciálních znaků regulárních výrazů mají stejný nebo analogický význam i mimo regulární výrazy, jinými slovy fungují nejenom v rámci slov, ale i mimo něj. Těmito znaky jsou složené závorky označující interval ({n,k}) a jejich speciální případy, tj. hvězdička (*), plus (+) a otazník (?), a dále kulaté závorky a svislá čára (|), jak je vidět v posledním příkladu. Ta značí disjunkci, pro konjunkci lze dále použít ampersand (&) a pro negaci vykřičník (!).
Na závěr příklady složitějších dotazů pro fajnšmekry,
které ukazují bohaté možnosti dotazovacího jazyka:
| Příklad | dotaz |
| infinitivy nekončící na -t | [tag="Vf.*" & lemma!=".*t"] |
| aktivní participium sloves koupit nebo prodat se subst. v akuzativu | [(lemma="koupit" | lemma="prodat") & tag="Vp.*"] [tag="N...4.*"] |
| posloupnost adverbia a verba v libovolném pořadí; mezi slovy mohou být vložena 1- 3 libovolná slova; výrazy se musí vyskytnout v jedné větě | ([tag="V.*"] []{1,3} [tag="D.*"]) | ([tag="D.*"] []{1,3} [tag="V.*"]) within <s id=".*"/> |
| spojení typu bez chuti a bez zápachu | "bez" [pos="N"] [] "bez" [pos="N"] |
| dvě různá citoslovce za sebou | 1:[tag="I.*"] 2:[tag="I.*"] & 1.lemma!=2.lemma |
| spojení typu bylo rozhodnuto na konci věty (včetně interpunkce) | [word="byl[ao]?"] [tag="Vs.*"] [tag="Z.*"]* </s> |
| celé věty typu O ošklivém kačátku (včetně případné interpunkce) | <s> "O" [tag="A...6.*"] [tag="N...6.*"] [pos="Z"]* </s> |
| věty obsahující slova šprochu a trochu (v tomto pořadí) | [word="šprochu"] []* [word="trochu"] within <s id=".*"/> |
| superlativy z Čapkova Krakatitu | [tag=".........3.*"] within <doc opus="krakatit"/> |
| citoslovce z románů ze 60. let, které jsou v korpusu | [tag="I.*"] within <doc txtype="NOV" & temp="196."/> |
Poznámka: při dotazu na subkorpus definovaný jistou podmínkou se de facto za každý dotaz na původní korpus, ze kterého subkorpus vznikl, připojuje táž omezující podmínka ve formě within <podmínka/>. To znamená, že stejný výsledek jako v poslední řádce tabulky bychom dostali také tehdy, kdybychom si nejprve nadefinovali subkorpus podle strukturní značky <doc> s podmínkou txtype="NOV" & temp="196." a poté na tento subkorpus aplikovali dotaz [tag="I.*"].
Upozornění: strukturní značky se v jednotlivých korpusech liší, uvedené příklady se vztahují ke korpusu SYN2000. Odkazy na seznam všech strukturních značek korpusu SYN2000 včetně jejich významu najdete zde, popis morfologických značek (tagů) zde.