Pražský závislostní korpus

Z ωικι.matfyz.cz
Přejít na: navigace, hledání
Pražský závislostní korpus
Kód předmětu: NPFL075
Přednáší: Markéta Lopatková, Jan Štěpánek

Poznámky ze ZS 2008/9 -- Tuetschek 20:59, 29 Jan 2009 (CET)

Funkční generativní popis[editovat | editovat zdroj]

Teorie: FGP -- Funkční generativní popis, a její odlišnosti od praxe, tedy co nemohlo být v PZK uděláno podle ní.

První popis -- Sgall 1967, potom Panevová 1980 (hl. jde o valenci), potom Sgall, Hajičová a Panevová 1986 (hl. akt. členění). Razí stratifikační přístup: lingvistickým popisem věty je její reprezentace na několika rovinách, představitelé se ale rozcházejí v názorech, kolik rovin máme.

Každá rovina má jednotky elementární (na slajdu: vedou od nich šipky), a jednotky komplexní (k nim vedou šipky), ty jsou svázány relací kompozice, mezi rovinami relací reprezentace (základní jednotka vyšší roviny je reprezentována komplexní na nižší, ta jde rozložit atd. Jen na nejvyšší úrovni to tak nefunguje, skladba je jiná).

  • FR: rovina fonetická / fonologická (jde o popis mluveného jazyka) -- zákl. jednotka je distinktivní rys, komplexní je hláska
  • MFR: rovina morfonologická -- zákl. jednotka je morfoném (odp. hlásce), jejich řetězec je morf.
    • Tyhle dvě roviny byly už docela dobře zpracovány před mnoha lety, dnešní lingvistika už je až tak moc neřeší.
  • MR: morfologická rovina -- každý morf má funkci nějakého morfému, např. kmenu nějakého slova, nebo tvarům koncovky atp. Morfy dohromady tvoří séma, ty se nějak poskládají, aby tvořily formém: např. předložka + pád.
  • VČR: větně členská rovina, elem. jednotka je tagmém -- jsou 3 druhy: větné členy, *, sufixy. Skládají se do nějaké abstraktní představy věty (obsahuje kromě slov i vztahy mezi nimi).
  • TGR: tektogramatická rovina: sémantémy ~ sémoglyfy, funktory (Act, Pat ...), sufixy = gramatémy (vnitřní gramatické kategorie, např. časově proti členské rovině nemám přít. čas, ale současnost, předčasnost a následnost). Jde o rovinu jazykového významu.

Závislostní strom[editovat | editovat zdroj]

Reprezentací TGR je závislostní strom -- tj. uzly, hrany, kořen, lin. uspořádání uzlů a jejich ohodnocení. Délce "význačné cesty" (cesty z kořene do uzlu) se říká hloubka (rank). Ohodnocení uzlu je "komplexní symbol" (mívá v sobě jak sémantém, tak funktor, tak gramatémy).

Př (komplexní symbol):
Pekař peče housky.

           péci
	/        \
    pekař(ACT)   houska(PAT)   -- sémantém (funktor)
    (SG)         (PL)          -- gramatém

Díky tomu, že ve stromech nejsou cykly, se v nich dá docela rychle hledat.

Popisy vztahů mezi rovinami[editovat | editovat zdroj]

  • Deklarativní popis -- měl by popisovat vztahy mezi rovinami bez ohledu na to, z které roviny se díváme.
  • Procedurální popis -- "jestliže na této rovině je tohle, budeme reprezentovat na vyšší takhle".

Deklarativní popis se hodí na zkoumání, zda si dvě roviny odpovídají, procedurální k výrobě popisů; naopak to nejde.

Generativní popis je podmnožina procedurálních: ty se dají rozlišit podle toho, zda postupují od hloubkové struktury (generování), nebo od povrchu (analýza, tomu odp. proces anotace). Tedy vznik korpusu je přesně opačný, než co říkala teorie FGP.

Teorie FGP: existuje generativní složka (BKG), která vyrábí tektogramatický popis, plus 4 BKA, které vyrábí povrchovou strukturu -- nebyla to jen teoretická konstrukce, částečně to fungovalo.

Pražský závislostní korpus[editovat | editovat zdroj]

Rozdíly teorie a korpusu[editovat | editovat zdroj]

Několik příčin rozdílů: časové, finanční, implementační; hodně rozdílů kvůli obrácenému pohledu než FGP.

Jsou 3 roviny popisu + jedna "nultá" (tj. 4):

Nultá rovina obsahuje jen jednotlivá slova (slovní tvary = tokens -- vč. interpunkce), tak jak šla za sebou v novinách. Není to tedy přesně text z novin, prošel už tokenizací (ani vytvoření nulté roviny není triviální). Morfologická rovina zhruba odpovídá, tektogramatická taky, ale analytická původní větně členské z FGP moc neodpovídá.

M-rovina a a-rovina si odpovídají slovo od slova. U nulté roviny a a m-roviny nemusí být vztah 1:1 vždy, kvůli překlepům (např. zapomenutá mezera), ale děje se to jen zřídka, bývá buď 1:m, nebo n:1, když už (teoreticky vyloučit m:n nelze).

PML, schémata[editovat | editovat zdroj]

Tato část je neúplná a potřebuje rozšířit. (Teoreticky popsat, co je to PML a co je schéma a instance, viz slajdy)

Současné PML umožňuje zapsat morfologické schema kratším způsobem než to, co je na CD PDT 2.0. M-data schema XML se da krom CD najit jeste v adresari tred/resources. Cislo revize schematu je ze 3 cisel. Kdyz se zvysuje cislo na 3. miste, tak se sice zmenilo schema, ale data zustavaji validni ve stejnem pripade jako predtim (schema je jine, ale validuje uplne stejna data). Pokud se meni prostredni, muze se mnozina validovanych dat rozsirit -- tj. stará data není třeba převádět, ale nová na staré schema pasovat nemusí. Pokud se měni první číslo, jde o konec kompatibility.

Novější verze PML schématu používá funkce import a derive -- např. importuje wnode.type a bool.type z wdata schéma verze 1.0.0 a vyšší (boolovsky typ je proste zbytečné definovat pokaždé; wnode.type ještě po importu mění - to, co bylo id, dostává formát pmlref: tj. na w-rovině mame identifikátor, ze kterého se na m-rovině stává odkaz).

w-rovina[editovat | editovat zdroj]

Node <w>:

  • token -- obsah (text)
  • no_space_after -- nepovinné, je "1", pokud za tokenem není whitespace ve zdrojovém textu

m-rovina[editovat | editovat zdroj]

Sémata jsou sdružena ne do morfémů jako ve FGP, ale do slov. Text je rozdělen na jednotlivé věty; gramatické kategorie jsou reprezentovány tagy (morfolog. značkami). Má-li nějaká slovní forma teoreticky několik gramatických kategorií (homonymie tvarů), je už vybraný ten správný. Překlepy jsou už opravené. Každý tvar má přiřazené lemma (slovníkový tvar), tam je taky rozlišená homonymie a přidané poznámky o vytvoření slova, např. "oživení" je z "oživit".

Kořenový element je mdata, obsahuje sekvenci uměle vytvořených "stromů", které jsou úplně lineární -- kořenový element je s (věta) a ten obsahuje jako děti jednotlivé nody m (slova) seřazené za sebou podle pořadí ve větě.

Node <m>:

  • id
  • form -- odpovídá datům na w-rovině, ale má opravené překlepy; pokud došlo k opravě, je přítomen atribut form_change (s hodnotami num_normalization, insert, spell, ctcd (oč -> o co))
    • Pozor, hodnoty form_change jsou v btredu přístupné jako seznam (může jich být víc), pro převod na pole se používá ListV.
  • lemma -- odpovídá dokumentaci PDT, lemma and tag structure
    • vysvětlivky (např. geogr. názvy = G), odlišení významů číslem, údaje o odvození slova
    • stejně jako tag by mělo asi být vlastní XML struktura, ale je převzaté ze starších formátů
  • tag -- odpovídá taktéž dokumentaci PDT
    • 15 pozic: slovní druh, sub-sl. druh, rod, číslo, pád, rod vlastníka, číslo vlastníka, osoba, čas, stupeň, negace, pasiv/aktiv, + 3 reserved
    • Zvláštnosti:
      • Z reserved pozic se používá poslední, ukládá se spousta věcí (styl slova; 1-7 škála toho, jak moc je slovo používané; 8 zkratka; 9 spec. použití (jeho -> něho apod.)
      • rod je složitější než 4 std + "any", obs. např. spec. "ženský nebo střední" -- to se týká sloves (např. "řekla" ~ ona = sg.f./pl.n.); není to moc dobrá věc, spíš to zvětšuje uměle úspěšnost taggeru
      • pády jsou kupodivu rozlišovány všechny, bez spec. kategorií (jdou relativně spolehlivě odhadovat)
      • rod vlastníka: ženský, životný, neživotný/střední -- čeština nic jiného nerozlišuje
      • čas: spec. hodnota "přítomný nebo minulý"
    • členění tagů částečně odpovídá mluvnicím, proto např. "někdo" a "některý" jsou spolu, což se nehodí; kategorií je hodně, ale mělo by jich být ještě víc
  • w.rf -- odkaz na w-rovinu

V btredu jsou všechny věci na m-rovině přístupné jen přes field #content. Tj. je nejdřív nutné získat $this->{"#content"} a nad ním teprv zjišťovat form, lemma, tag nebo w/token (původní forma slova).

a-rovina[editovat | editovat zdroj]

Odkazuje jak na w-rovinu, tak na m-rovinu, obsahuje další metainformace a už skutečné stromy. Atributy se dají dobře najít podíváním se na nějaký libovolný uzel v TrEdu

Jeden běžný uzel obsahuje:

  • m.rf -- odkaz na m-rovinu
  • afun -- analytická funkce
    • Pred -- predikát
    • Pnom -- přísudek jmenny se sponou ("Otec je velký." -> "velký" dostane Pnom, "je" dostane Pred)
    • AuxV -- pomocné sloveso ("Bude pršet." -> "pršet" je Pred, "bude" je AuxV)
    • Sb -- subjekt
    • Obj -- objekt
    • Atr -- přívlastek
    • Adv -- příslovečné určení (libovolného typu)
    • AuxT -- označení zvratných zájmen, u sloves, která se nemohou vyskytovat bez zvr. slov v daném významu (reflexivum tantum) - např. smát *se
    • AuxR -- "se" ve zvratném pasívu
    • AuxP -- předložka
    • Apos -- apozice (přístavek)
    • ExD -- A technical value for a deleted item; also for the main element of a sentence without predicate
    • AuxC -- podřadící spojka
    • Atv, AtvV -- doplněk; první se používá v případě vyjádřeného jména, druhá u nevyjádř. (Děvčata tancovala [Atv]bosa. / Přišel [AtvV]bos.)
    • AtrAdv, AdvAtr, AtrObj, ObjAtr -- "kombinované funkce" - "buď/nebo" - zavádí se určitá vágnost, ale můžou se použít jen tehdy, když význam věci vůbec nezávisí na tom, kterou funkci ve skutečnosti daný člen má. Např. Koupil dům pro [AdvAtr]děti. (slovo může být jak přívlastkem objektu, tak příslovečným určením predikátu).
    • AuxO -- slova, která nemají žádný význam, jen z rytm. důvodů apod. (To [AuxO]vám takhle jdu po ulici)
    • AuxZ -- slova zdůrazňovací - zvláště", zejména
    • AuxY -- částice, které se vztahují k celé výpovědi (narozdíl od AuxZ)
    • AuxG -- grafické symboly
    • AuxK -- koncová interpunkce věty
    • AuxX -- čárka
  • ord -- pořadí ve větě

Kořen stromu (a-root.type) je zároveň uzel (role="#NODE"), ma id a obsahuje s.rf, odkaz na s na m-rovině. Má i analytickou funkci (AuxS) a pořadí ve větě (0). Nakonec obsahuje seznam dětí. Děti mají podobný typ (a-node.type), místo odkazu na s mají odkazy na m. Navíc mají i hodnoty:

  • is_member -- má hodnotu 1 pro členy koordinace nebo apozice
  • is_parenthesis_root -- má hodnotu 1 pro kořeny vsuvek

t-rovina[editovat | editovat zdroj]

Obsahuje i nody pro nevyjádřené větné členy, které jsou ve významu přítomné. Koordinovat se (na rozdíl od a-roviny) mohou spolu i různé funktory.

Node:

  • lex.rf, aux.rf -- dva různé odkazy do analytické roviny, k plnovýznamovým slovům (0-1(?[TRY])) a pomocným slovům (0-n)
    • Nedá se bohužel poznat, který pomocný uzel z aux.rf ovlivnil který atribut daného uzlu t-roviny
    • Pozor, v btredu hodnoty v aux.rf jsou v perlovském Listu, na převod do pole se používá funkce ListV
  • compl.rf -- spec. seznam odkazů do t-roviny -- "druhá závislost doplňku" (hlavní závislost je přímo ve stromě, druhá je daná tímto odkazem)
    • Obsahuje něco právě když má můj uzel funktor COMPL
  • coref_gram.rf, coref_text.rf -- odkazy do tektoroviny(?) (není seznam), koreference gramatické (vztažná slova) a významové (např. od zájmen k tomu, co označují), může vést i do jiného stromu
  • coref_special.rf -- speciální případy koreferencí:
    • Exofora (odkaz na prvek mimo text)
    • Odkaz na předchozí segment textu, když není jasné, co přesně se myslí
  • functor -- funktor na tektorovině, vyjadřuje vztah uzlu k jeho efektivnímu rodiči, u "technických" funktorů i k jiným uzlům:
Tato část je neúplná a potřebuje rozšířit. (neúplný seznam, doplnit)
    • ACT -- aktant - aktor -- Otec.ACT pracuje.
    • PAT -- aktant - patiens -- Vaří oběd.PAT
    • ADDR -- aktant - adresát -- Poslal dárek příteli.ADDR
    • ORIG -- aktant - origo -- Vyrábí nábytek ze dřeva.ORIG
    • EFF -- aktant - efekt -- Jmenovali ho předsedou.EFF
    • RSTR -- volné doplnění blíže specifikující řídící substantivum -- velký.RSTR dům
    • MEANS -- volné doplnění vyjadřující prostředek --Píše perem.MEANS
    • COMPL -- volné doplnění - doplněk -- Vrátila se unavená.COMPL
    • RHEM -- atomický výraz - rematizátor (vztahuje se na své sourozence vpravo a na rodiče, stojí-li vlevo od nich)) -- Jen.RHEM Karel odešel.
    • úplný seznam viz manuál
  • tfa -- kontextová zapojenost
  • deep_ord -- pořadí na tektorovině; má i spec. lingv. význam: mám-li děti nějakého uzlu, jsou uspořádány podle výpovědní dynamičnosti (vyšší číslo přináší víc nové informace)
  • gram -- atribut, obsahující tzv. gramatémy; je strukturován docela složitě
    • aspect -- vid
    • degcmp -- stupeň adjektiva
    • deontmod = deonticka modalita ~ "normalni" modalita (moznost, povoleni, chteni, museni)
    • dismod = dispozicni modalita ~ vyjadruji dispozici ("Hokej se mi hraje dobre.")
    • gender = rod
    • indeftype = klasifikace neurčitých zájmen, viz manuál
    • iterativeness = opakovani deje (sedal -> sedaval)
    • negation = negace
    • number = cislo (opravdove, fakticke)
    • numbertype = radova, druhova apod.
    • person = osoba
    • politeness = tykani, vykani
    • resultative = vyjadruje vysledek deje? ("Mam uvareno.")
    • sempos = dulezite! *semanticky slovni druh* - je povinny (jakmile nejaky uzel ma gramatemy, musi byt sempos vyplneny), podle nej urcujeme, ktere gramatemy budou mit smysl. obsahuje to hloubkova podst. jm., prid. jm. apod. ~ deli se na jeste dalsi druhy
    • tense = cas
    • verbmod = modus (slovesny zpusob)
  • is_dsp_root je koren prime reci? (ten by mel v tomhle atributu 1)
    • To je dulezite pro valenci verb dicendi ~ ty potrebuji na misto PAT to, co clovek rekl; ve chvili, kdy je to vyjadreno primou reci, zmizi tam spojka "rekl, ze" (a my se to takhle dovime)
  • is_generated -- ma 1 v pripade, ze neodpovida zadnemu slovu z povrchove vety, ze byl do stromu pridan
  • is_member -- stejne jako na analyt. rovine: pro členy koordinace nebo apozice má hodnotu 1
  • is_name_of_person -- 1 pro osobni jmena
  • is_parenthesis -- 1 pro vsuvku; vyznacujeme kazdy uzel vsuvky zvlast, tj. vsuvka nemusi tvorit souvisly podstrom (jako na analyticke rovine, kde se vyznacuje jen jeji koren)
  • is_state -- pouzival se pro metaforicke pouziti tj. silny atribut, ktery meni vyznam funktoru
    • Např.: "Byla v jinem stavu." <- "ve stavu" dostane funkci LOC, ale is_state "1", protoze nejde o primy vyznam funktoru
  • node_type -- na tektogramaticke rovine jsou nody typovane:
    • complex = nejcastejsi, slovo vznikle z povrchoveho slova
    • qcomplex = kvazikomplex, byl pridan, protoze povrchove slovo bylo nevyjadreno (ma proto nekt. atributy nevyplnene)
    • list = spec. uzly, ktere reprezentuji prvky nejakeho seznamu -- nerozebirame-li napr. vnitrni strukturu dlouheho anglickeho nazvu
    • fphr = cizí fráze
    • coap = spec. typ pro koordinace a apozice
    • atom = napr. rematizatory ~ neurcuji se gram. kategorie; vetsinou nejake castice apod.
  • quot -- vsechno, co bylo v textu v uvozovkach, ho musi mit vyplneny; seznam struktur obs. typ (title, citace, metajaz. pouziti, other) a identifikator (u vsech uzlu v jednech uvozovkach stejny)
    • Seznam je to kvuli vice vnorenim (napr. pokud nekdo v citaci pouzije nazev apod.)
  • sentmod -- větna modalita ~ tj. tazaci, oznamovaci, rozkazovaci (vyplneno jen u slovesa)
    • enunc = oznamovací
    • inter = tázací
    • excl = zvolací
    • desiderative, imperative
      Tato část je neúplná a potřebuje rozšířit. (nevím hodnoty, v samples se nevyskytují, někde zjistit?)
  • subfunctor -- blizsi klasifikace funktoru (nektere funktory byly definovany velmi siroce, rozpadaji se na kategorie)
    • napr. funktor TWHEN (cas) a subfunktor after (po necem); DIR3 (kam) & betw (mezi neco)
    • basic = zakladni vyznam funktoru
    • byly prirazeny automaticky skriptem na zaklade predlozek, tj. nemaji az tak vysokou vypovidaci hodnotu (to se stalo kvuli tomu, ze to nikdo moc neumi, nedal se vytvorit popis pro anotatory)
  • t_lemma -- tektogramaticke lemma = melo by odpovidat slovnikovemu heslu plnovyznamoveho slova, ale nekdy vypada jinak; muze se skladat i z nekolika slov (napr. "tykajici_se")

XSH[editovat | editovat zdroj]

Základní[editovat | editovat zdroj]

XSH buď načte skript, který mu zadáme jako argument na příkazové řádce, nebo funguje interaktivně jako shell.

  • help | less  # nápověda
  • open sample9.a.gz  # otevření souboru; otevřením dalšího ztrácím předchozí, pokud si ho neuložím do proměnné $doc := open sample9.a.gz.
    • cd $doc  # přepínání mezi otevřenými soubory
  • register-namespace pml http://ufal.mff.cuni.cz/pdt/pml/  # alias na namespace, pozor na lomítko na konci, mění význam
  • encoding iso-8859-2  # nastavení kódování výstupu

Navigace[editovat | editovat zdroj]

  • ls namespace:tag nebo ls, ls :d2  # zobrazení souboru -- obsahu podelementu, aktuálního elementu, s nastavenou hloubkou prohledávání
    • názvy podtagů nutné dávat s namespacem!
    • argumentem (specif. podtagu) je vlastně výraz v jazyce XPath, kterým vyberu podelement(y)
  • XPATH:
    Tato část je neúplná a potřebuje rozšířit. asi popsat mnohem líp, podle Wikipedie
    • //pml:w  # chci všechny elementy w v namespace pml, je mi jedno, co je jejich rodičem (díky dvěma lomítkům na začátku).
    • //pml:para/pml:w[1]/pml:token  # chci vidět první slovo z každého odstavce (díky [1]).
    • //pml:token[text()="."]  # vyberu všechna slova, jejichž text je "." (díky funkci text(), vybírající text z nějakého elementu).
    • //pml:token[text()="."]/../following-sibling::*[1]  # najde další token po ".", díky funkci following-sibling(), která vrací všechny následující sourozence; z nich vybereme toho prvního.
    • //pml:token[text()="."]/../following::*[1]  # najde libovolný další element po tokenu s "."
    • //pml:token[text()="Každý"]/../preceding-sibling::*[1]  # předcházející token před "Každý"
    • //pml:w.rf/text()
    • //pml:w[last()]  # poslední nad každým nadřízeným uzlem
    • (//pml:w)[last()]  # globálně poslední -- pozor na závorky!
    • //pml:w.rf/text()  # vypíše jen text z tagu
    • .//pml:token  # v cyklu apod. tečka označuje aktuální uzel, sama stojící se musí dávat do závorek
  • count //pml:s  # spočítá výskyty svého argumentu

Výpisy[editovat | editovat zdroj]

  • print a echo slouží pro tisky
    • echo :n  # nezalamovat řádku
  • quiet a verbose zapínají/vypínají hlášky samotného XSH
  • substring(.,1,2)  # podřetězec, začíná se od jedničky
  • substring-after(../pml:w.rf,"#")  # podřetězec od nějakého podřetězce dál (tady od "#")
  • lc(../pml:lemma,1,1))  # lowercase (?)

Cyklus[editovat | editovat zdroj]

  • for //pml:w.rf/text() ls substring-after(.,"#")  # implicitní proměnná "." (tento uzel)
  • for //pml:w.rf/text(){ $dot = . ; ls $w//pml:w[@id=substring-after($dot,"#")] ; }  # uložení proměnné, hledání cílů referencí v jiném souboru ($w je otevřený soubor)
  • for { glob("sample?.w.gz") }{ open(.); ... }  # otevření všech souborů sample?.w.gz, nějaká další práce s nimi

Hash[editovat | editovat zdroj]

Hash v XSH jde vytvořit, ale ne už upravovat.

  • $h := hash @id //pml:w  # vytvoření hashe, první hodnota jsou klíče, druhá hodnoty
  • xsh:lookup('h', .)  # hledání v hashi, druhý argument je žádaná hodnota klíče

Redirecty[editovat | editovat zdroj]

Výstup každého příkazu se dá přes pipe nebo redirect do souboru někam poslat.

  • [příkaz] | sort | uniq -c | sort -n  # setřídění počtu výsledků
  • [příkaz] | grep -B1 text  # výběr výsledků

TrEd[editovat | editovat zdroj]

TrEd -- grafické rozhraní, btred a ntred -- command-line, dávkové zpracování perlovitých skriptů.

Grafické rozhraní[editovat | editovat zdroj]

Dá se otevřít víc souborů, pak můžu hledat ve všech.

  • Enter/doubleclick -- zobrazení informací o node
  • F3 -- jednoduché hledání podle parametrů
  • Ctrl-Shift-A a Ctrl-Shift-T -- přepínání z tektogramatické roviny na analytickou a zpátky
  • J -- skákání po koreferencích (gramatické koreference = oranžová šipka)
  • Ctrl-Enter na node na t-rovině -- náhled do valenčního slovníku
  • Shift-F3 -- spusteni Tree Query
  • Shift-H -- zobrazeni hidden uzlů v query

Zobrazení TFA na t-rovině: bílé uzly jsou kontextově zapojené, žluté nezapojené a zelené kontrastivně zapojené. Na t-rovině se generované uzly zobrazují jako hranaté.

Tree Query[editovat | editovat zdroj]

V novější verzi TrEdu je možné použít auomaticky prevod z PML do SQL. Databaze jsou potom rychlejsi pro praci -- vetsina SQL dotazu trva hodne malo.

  • problemy ale se stromovou strukturou v databazi -- zavislosti reseny spec. cisly uzlu (l,r), platí: $ n \in D(m) \Leftrightarrow n_l \in (m_l, m_r> $, kde D jsou potomci.
  • nasledujici stromy jsou ohodnoceny ruznymi cisly, tj. mame unique-id uzlu a jeste muzeme urcit, co je ci potomek
  • pocty deti: pro kazdy uzel se uklada zvlast, aby se zrychlily dotazy (bez toho bychom museli projit tabulku uplne celou)
    • ef. deti jsou taky ulozeny zvlast

K SQL hledani pak v TrEdu slouží speciální interface -- Tree Queries: dotaz se dá naklikat, ale zapisuje se i ve spec. dotazovacim jazyce, ktery se pak preklada na SQL dotaz (k tomu je i interpret z prikazove radky, ktery se da pouzivat k vyhledavani misto btredu).

  • Spuštění Tree-Query: Shift-F3.
  • Zadne 2 uzly, ktere jsou v klikatku dotazu nakreslene, se nedaji stotoznit.

Cely SQL-like interface funguje i bez nainstalovane databaze -- staci si otevrit nekolik souboru najednou a muzu nad nimi delat dotazy. Dotaz se preklada do TrEdu (Perlu), ale vypada to uplne jinak nez nase kody, pouzivaji se tzv. iteratory. Zatim pritom jeste nefunguje deleni oken vyhledu a zobrazovani vice rovin.

btred a ntred[editovat | editovat zdroj]

btred je proti XSH mnohem pomalejší, protože na rozdíl od něj parsuje schéma PML souboru (XSH se k souboru chová, jako by to bylo obyčejné XML). Zrychlení se dá dosáhnout pomocí ntredu, který funguje jako server, čeká na požadavky ze sítě. Spuštění:

  • ntred -i --local sample?.a.gz  # spuštění
  • ntred --quit  # vypnutí

btred -- parametry[editovat | editovat zdroj]

  • -e -- parametr evaluace, tj. to, co bude počítat; zbylé parametry vstupní soubory
  • -T -- pro všechny stromy udělej
  • -N -- pro všechny uzly daného stromu udělej
  • -I skript.btred -- spuštění skriptu ("include")
  • -Q -- quiet
  • -d iso-8859-2 -- jine kódování výstupu

Do skriptu se na první řádek vloží:

 #!btred -N -T -e 'moje_hlavni_funkce()'

btred -- Perl[editovat | editovat zdroj]

Tato část je neúplná a potřebuje rozšířit. vysvětlit funkce
  • join
  • map
  • grep
  • substr
  • //

btred -- základní[editovat | editovat zdroj]

Odkaz na aktuální nody je řešen spec. proměnnými:

  • $this -- "tento uzel" (při provádění pro každý uzel)
  • $root -- odkaz na kořen aktuálního stromu

Každý node bývá hash/perlovský objekt, nestrukturované věci jsou v něm uloženy přímo jako hodnoty:

  • $this->{afun}

Pozor na atributy, které mají pochybné názvy, nutné je dát do uvozovek:

  • $this->{"compl.rf"}

Strukturované atributy mají problém tom, že cestou by vznikaly klíče s undef, takže se na ně používá spec. funkce:

  • $this->attr("m/tag")  # místo $this->{m}{tag} z analytické roviny
    • Dá se používat i přímo odkazů do pole, např. $this->attr("a/aux.rf[1]"), prvky jsou počítány od 1.

Každý node má funkce pro navigaci:

  • $this->parent() - rodič tohoto uzlu
  • $this->following()- vrací následující uzel při průchodu do hloubky (nebo undef na konci stromu)
  • $this->children() - vrací seznam dětí uzlu
  • $this->rbrother() a $this->lbrother() -- pravý, levý bratr uzlu
  • $this->descendants() - vrací všechny potomky daného uzlu

Stromy se dají i upravovat, tj. pozor, ať si neničíme data! $this->cut()  # vyřízne node ze stromu

btred -- speciální funkce[editovat | editovat zdroj]

  • writeln("string")  # spec.funkce btredu, vypsání a odřádkování
  • FPosition($node)  # vypsání pozice nodu v souboru, dá se potom použít jako vstup pro TrEd:
    • btred -I skript.btred | tred -l -   # pro skript, který generuje zajímavé pozice a TrEd, který je pak zobrazuje
  • NPosition($node)  # je podobná, ale znamená pro grafický TrEd vyslání dotazu na ntred
  • ListV()  # převádí list (perlovský objekt FSlib::List) na normální pole
  • AltV  # převádí "alternative" (perlovský objekt FSlib::Alt) na pole hodnot

PML, PML_A a PML_T[editovat | editovat zdroj]

Nejpodstatnější funkce
  • PML::GetNodeByID($id)  # vrací přímo node na základě jeho id, tj. dereference
  • PML_A::GetCoordMembers($node, $no_recurse)  # pro node, který má afun rovnou Apos nebo Coord vrací seznam členů příslušné koordinace nebo apozice.
  • PML_A::GetEParents($node, \&DiveAuxCP)  # získání efektivních rodičů (bez koordinací apod.); nedá se volat na uzlech, u kterých není otázka po ef. rodičích relevantní, tj. na přímo členech nějaké koordinace; předložkách apod.
    • Některé věci mají víc než jednoho rodiče (závisí na víc jiných věcech), proto vrací pole.
  • PML_A::GetEChildren($node, \&DiveAuxCP)  # totéž pro efektivní děti
  • PML_T::GetANodeByID(id/ref)  # vrací analytický uzel, na který vede daný odkaz
  • PML_T::IsCoord($node)  # vrací 1, pokud je daný node koordinací (podle funktoru)

Odkazy na celou dokumentaci jsou na začátku sekce.