Toto je starší verze dokumentu!
Obsah
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} |
interval ve složených závorkách | {n, k} | n až k opakování předchozího znaku nebo 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;Pozor! Dočasně tento způsob dotazu nefunguje, a je tudíž potřeba zadat obě hodnoty, tzn. n i k.
pokud má výraz tvar |
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, až, ale, ahoj…) |
k.*o | slova 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čka | slovo 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 SYN2015 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 | 212 | pst (141), pt (76) |
ps*t | 336 | pst (141), pt (76), psst (64), pssst (47), psssst (6), psssssssst (1), pssssst (1) |
ps+t | 260 | pst (141), psst (64), pssst (47), psssst (6), psssssssst (1), pssssst (1) |
cha(cha)? | 371 | cha (316), chacha (55) |
cha(cha)* | 395 | cha (316), chacha (55), chachacha (18), chachachacha (2), chachachachacha (2), chachachachachacha (1), chachachachachachachachachachachacha (1) |
cha(cha)+ | 79 | chacha (55), chachacha (18), chachachacha (2), chachachachacha (2), chachachachachacha (1), chachachachachachachachachachachacha (1) |
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é převážně 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.
- Zamyslete se nad tím, která písmena se při hovoru vynechávají, a lexém přesto zůstává srozumitelný.
- Zformulujte dotaz (drobná nápověda: vystačíte si pouze s písmeny a otazníky).
- 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).
Více o specifikách hledání v mluvených korpusech najdete v bonusové lekci.
Sekvence libovolných znaků
! NESEDÍ VÝSLEDKY!?
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 jednoduchém typu dotazu řetězec znaků
.*vědom.*
(je zapotřebí zapnout možnost Povolit regulární výrazy!). - 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í.
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 ř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 |
Význam hranatých závorek je dvojí:
- v rámci regulárních výrazů představují seznam (viz tabulka výše)
- v rámci CQL představují samostatnou pozici, viz příští lekce.
Příklad dotazu: Konkurence forem
Vyhledejte v korpusu SYN2015 prefigovaná adjektivní lemmata začínající na vy- a zakončená na -lý nebo -ný (např. vyčpělý a vydýchaný).
Použili jsme dotaz vy.+(lý|ný)
s výchozím atributem lemma|word
, slovní druh jsme omezili na přídavná jména. Celkem jsme dostali 105 328/373 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:
- 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)
- pomocí dotazu typu Slovní tvar všechny prefigované infinitivy odvozené od slovesa téct/téci
- 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.