Skrýt
Nastavení

Toto je starší verze dokumentu!


4. lekce: Regulární výrazy

V předchozích lekcích jsme se naučili pokládat dotaz, zobrazovat a ukládat výsledky a vyhodnocovat výsledky pomocí frekvenční distribuce. V této lekci se podíváme na pokročilejší způsoby dotazování.

Tzv. regulárními výrazy rozumíme sekvence znaků, pomocí kterých můžeme vyhledat množinu slov. Regulární výrazy využívají jednak znaky se speciálním významem (například znak * se používá jako zástupný symbol pro libovolný počet opakování, znak | je symbolem pro výběr z alternativ, podrobněji viz níže), jednak běžné znaky, tj. znaky abecedy, číslice apod., které mají doslovný význam. Všechny speciální znaky si postupně představíme a zároveň si vyzkoušíme, jak fungují v rozhraní KonText.

Tečka: libovolný znak

Začněme tím nejuniverzálnějším znakem, tedy tečkou (.), která zastupuje právě jeden libovolný znak. Jakékoliv třípísmenné slovo tak lze v KonTextu najít (mimo jiné) pomocí sekvence tří teček za sebou (...). Zadáme-li takový dotaz jako Slovní tvar, zobrazí se ve výsledku slova jako: ale, pro, tak, jak apod.

Hledáme-li tečku jakožto interpunkční znaménko, využijeme zpětné lomítko (více viz níže). Dotaz pak bude vypadat takto: \.

Kvantifikátory

Hojně využívané jsou tzv. kvantifikátory, které určují, kolikrát se smí bezprostředně předcházející znak (nebo speciální symbol) v daném řetězci opakovat.

regulární výraz znak co zastupuje další informace
hvězdička * libovolný počet (0 a více) opakování předchozího znaku nebo celku ekvivalentní s {0,}
plus + 1 nebo více opakování předchozího znaku nebo celku ekvivalentní s {1,}
otazník ? žádný nebo jeden výskyt předchozího znaku nebo celku ekvivalentní s {0,1} nebo {,1}
interval ve složených závorkách {n, k} nk opakování předchozího znaku nebo většího celku je-li k vynecháno, tedy zůstane-li {n,}, odpovídá intervalu nejméně n opakování;
je-li n vynecháno, tedy zůstane-li {,k}, doplní se na jeho místo nula;
pokud má výraz tvar {n}, odpovídá mu přesně n opakování
kulaté závorky () vytvářejí celek, na který lze aplikovat další operace, např. opakování celkem mohou být konkrétní znaky i vyšší jednotky

Regulární výrazy mohou být složeny pouze ze speciálních znaků, z kombinací znaků speciálních a alfanumerických, nebo dokonce jen ze znaků alfanumerických. Z následující tabulky si můžete udělat představu, jakou množinu slov lze vyhledat prostřednictvím různých regulárních výrazů:

Dotaz Výsledek
...slova o třech písmenech
a..slova o třech písmenech začínající na písmeno a
a.*slova o libovolné délce začínající na písmeno a, včetně samotného písmene a (např. a, , ale, ahoj…)
k.*oslova o libovolné délce začínající na písmeno k a končící písmenem o (kdo, kolo, kafíčko)
256číslo 256
19..letopočty začínající číslem 19 (případně též kombinace čísla 19 s různými znaky)
kočkaslovo kočka
kočk.*všechny tvary lemmatu kočka s výjimkou Lsg. (kočce) a Gpl. (koček), ale i další odvozená slova: kočkodan, kočkovitý, kočkovat aj.

Regulární výrazy budeme nejčastěji zadávat v rámci typu dotazu CQL, o němž bude řeč v příští lekci; lze je ale používat i v jiných typech dotazu – i ty jsou totiž následně automaticky přeloženy do dotazovacího jazyka CQL. Pokud tedy do typu dotazu Lemma zadáme regulární výraz .*číst, budou výsledkem všechny výskyty všech předponových sloves odvozených od slovesa číst.

Podívejme se nyní na konkrétní příklady regulárních výrazů zadaných do korpusu SYN2010 prostřednictvím typu dotazu Slovní tvar:

Zadejte následující dotazy:

  • ps?t
  • ps*t
  • ps+t

Následně aplikujte kvantifikátory na větší celek než pouhý jeden znak:

  • cha(cha)?
  • cha(cha)*
  • cha(cha)+

Zobrazte si u jednotlivých výsledků frekvenční distribuci slovních tvarů (word) a lemmat. Nerozlišujte velikost písmen a vytvořte si přehled toho, co dané dotazy našly a co nenašly.

Ověřme si nyní společně výsledky.

dotaz počet výskytů odpovídající lemmata bez rozlišení velikosti (v závorce absolutní četnost)
ps?t 182 pst (135), pt (47)
ps*t 302 pst (135), psst (65), pssst (48), pt (47), psssst (6), psssssssst (1)
ps+t 255 pst (135), psst (65), pssst (48), psssst (6), psssssssst (1)
cha(cha)? 331 cha (300), chacha (31)
cha(cha)* 364 cha (300), chacha (31), chachacha (31), chachachacha (2)
cha(cha)+ 64 chacha (31), chachacha (31), chachachacha (2)
Frekvenční distribuce podob jestli v mluveném korpusu

 Možná si kladete otázku, jestli se regulární výrazy hodí i pro výzkum zásadnějších jevů než citoslovcí. Je dobré zdůraznit, že se bez nich neobejdeme např. při prohledávání mluvených korpusů, které zatím nejsou lemmatizované, obrovskou pomocí jsou ale i při vyhledávání v korpusech lemmatizovaných.

Zkuste v korpusu ORAL2013 nalézt co nejvíc různých podob výrazu jestli.

  1. Zamyslete se nad tím, která písmena se při hovoru vynechávají, a lexém přesto zůstává srozumitelný.
  2. Zformulujte dotaz (drobná nápověda: vystačíte si pouze s písmeny a otazníky).
  3. Zobrazte si frekvenční distribuci.

Stejně jako u většiny úloh s regulárními výrazy i v tomto případě existuje více postupů, jak se dobrat ke stejnému výsledku. V každém případě nám může pomoct vyhledávač variant v korpusech řady ORAL. Pro řešení naší výzkumné otázky jsme zvolili symbol ?, který pomůže specifikovat, které segmenty se ve slově nemusejí vždy vyskytovat.

Ve frekvenčním seznamu se ocitly dva překvapivé tvary: jesti a esti. Pomocí modře označeného p (pozitivní filtr) ve frekvenčním seznamu můžeme hned zkontrolovat, zda jde o námi hledaný význam (v obou případech tomu tak je) a nakolik je použití tohoto konkrétního tvaru regionálně či jinak podmíněné (zdá se to být východomoravské specifikum – 6 případů ze 7, respektive 8 z 9 spadá do této nářeční oblasti).

Sekvence libovolných znaků

Frekvenční distribuce deseti nejčastějších lemmat získaných díky tečce a hvězdičce

Nejmocnější kombinací je vyhledání libovolného počtu opakování libovolných znaků, tj. .* (tečka a hvězdička). Ta může reprezentovat celé slovo nebo jeho libovolnou část. Proto není vhodné zadávat samotný dotaz .*, není-li to nutné, protože výsledkem zdlouhavého a výpočetně náročného hledání budou všechna slova v daném korpusu.

  • Vyhledejte v korpusu SYN2010 v typu dotazu Slovní tvar řetězec znaků .*vědom.*.
  • Zobrazte si frekvenční distribuci takto identifikovaných lemmat a výsledný frekvenční seznam si uložte.

Jak kýžená frekvenční distribuce vypadá? Najde veškerá lemmata obsahující daný řetězec znaků (v tomto případě slovní základ vědom) a umožní zkoumat nejrůznější typy odvozování, zároveň s územ (reprezentovaným frekvencí).

Další speciální symboly

Vedle kvantifikátorů a tečky lze v rámci regulárních výrazů použít i další symboly se speciálním významem.

regulární výraz znaky co zastupuje další informace
seznam [ ] alternativa, možnost výběru jednoho libovolného znaku ze znaků uvnitř hranatých závorek v rámci seznamu je možné používat také pomlčku (-) jako operátor rozsahu (např. [a-z], [1-9]) pro alfabetické znaky a číslice
inverzní seznam [^ ] výběr jednoho libovolného znaku s výjimkou znaků uvnitř hranatých závorek pokud je prvním znakem seznamu stříška (^), jde o inverzní seznam: tedy jeden libovolný znak kromě těch uvedených uvnitř hranatých závorek
svislá čára | alternativa, ovšem ne jenom mezi jednotlivými znaky, ale mezi celými řetězci tvořícími celek kombinuje se často s kulatými závorkami, které pomáhají určit prioritu vyhodnocení
zpětné lomítko \ pokud předchází speciálnímu znaku, ztrácí daný symbol svůj zvláštní význam takto lze vyhledávat např. interpunkční znaménka či další speciální znaky v textu

Pozor! Význam hranatých závorek je dvojí:

  1. v rámci regulárních výrazů představují seznam (viz tabulka výše)
  2. v rámci CQL představují samostatnou pozici, viz příští lekce.

Příklad dotazu: Adjektiva s prefixem vy-

V korpusu ORAL2013 ověřte, jak expanduje prefix vy-, a to především u adjektiv. Korpus není lemmatizovaný ani tagovaný, musíme si proto vystačit s hledáním pomocí Slovního tvaru.

  1. Nejprve si představte slova s touto předponou: vykalený, vymazlený, vytuněný
  2. Rozepište si, jaké mužské koncovky – pro jednoduchost jen tyto – mohou adjektiva (v obou číslech) mít.
  3. Vytvořte dotaz na slovní tvar, u něhož znáte začátek i konec výrazů a hledáte prostřední část.

Dotaz mohl vypadat takto nějak: vy.+(ý|ej|ma|mi|ho|mu|ých|ejch)). Konkrétně na tento dostaneme v korpusu ORAL2013 1285 výskytů, nejfrekventovanějšími tvary jsou vysoký (111), vysokej (67), vyřešený (20), vyřízený (17), vyfocený (16), vystavený (16). Sedmý v pořadí (s absolutní frekvencí 16) je word vyndej, ten s dalšími slovesnými tvary (vydržej 13, vymejšlej 9 aj.) hledaným tvarům neodpovídá. V takovýchto případech je nezbytné ruční třídění výsledků (jde o potíž s tzv. precision a recall – jak přesně zformulovaný dotaz položit, aby nevyloučil příliš mnoho dokladů, které nás mohou zajímat).

Příklad dotazu: Konkurence forem

Vyhledejte v korpusu SYN2015 v typu dotazu Lemma prefigovaná adjektiva na vy- zakončená na -lý nebo -ný (např. vyčpělý a vydýchaný).

Použili jsme dotaz vy.+(lý|ný), slovní druh jsme omezili na přídavná jména. Celkem jsme dostali 105 328 případů, mezi nejčastějšími figurují slova vyspělý (2220), vytrvalý (1127), vybledlý (695) z první skupiny, z druhé pak vybraný (6390), vyrovnaný (3158), vyrobený (2760) a další.

S tímto dotazem úzce souvisí nástroj Morfio, který slouží pro slovotvornou analýzu.

Vyzkoušejte si na závěr

V korpusu SYN2015 najděte:

  1. pomocí dotazu typu Lemma všechna slova, která obsahují sekvenci kořen, kterou následuje i předchází alespoň jeden znak (typicky předpona a přípona)
  2. pomocí dotazu na Slovní tvar všechny prefigované infinitivy odvozené od slovesa téct/téci
  3. všechny výskyty tvarů negativního superlativu, tj. tvary začínající na nejne- a končící na -ší nebo -čí (pro jednoduchost odhlédněme od jiných tvarů, než je nominativ singuláru)

Výsledky najdete jako vždy v Řešení úkolů.

Pokročilejší dotazy nelze vytvářet bez znalosti dotazovacího jazyka CQL, o němž si povíme v následující lekci.