| 1 | = Jak vytvořit korpus = #Jak_vytvo.2BAVk-it_korpus |
| 2 | [[BR]] Tento článek slouží jako průvodce při vytváření korpusu. Je určen pro studenty a další zájemce, kteří chtějí pořizovat a převádět data pro potřeby korpusů. Za prvé popisuje strukturu korpusů, s využitím odkazů na příslušné normy. Za druhé popisuje možnosti kontroly správnosti korpusových dat. A za třetí podává návod, jak vytvářet korpusy převodem z HTML stránek. |
| 3 | |
| 4 | == Úvod == #A.2BANo-vod |
| 5 | === Co jsou to korpusy === #Co_jsou_to_korpusy |
| 6 | Obecně - počítačový korpus je rozsáhlý, vnitřně strukturovaný a ucelený soubor textů daného jazyka, elektronicky uložený a zpracovávaný. Práci s korpusovými daty zprostředkovává program nazývaný korpusový manažer. |
| 7 | |
| 8 | Aby mohl být určitý text do korpusu zařazen, musí být připravena dvojice textových souborů - tzv. vertikální text (zkráceně vertikál) a metainformace. Vertikál obsahuje samotná korpusová data, metainformace obsahují doplňující údaje o těchto datech. V tomto textu bude množina takových dvojic souborů označována zjednodušeně jako korpus (viz dále). |
| 9 | |
| 10 | == Struktura korpusových dat == #Struktura_korpusov.2BAP0-ch_dat |
| 11 | === Jak jsou korpusy uloženy === #Jak_jsou_korpusy_ulo.2BAX4-eny |
| 12 | Korpusy jsou uloženy jako textové soubory. Korpus je jednoznačně určen jménem adresáře. Všechny soubory, které končí .vert (vertikály) a .meta (metainformace) a které jsou obsaženy v tomto adresáři a všech jeho podadresářích, tvoří korpus. |
| 13 | |
| 14 | === Struktura vertikálů === #Struktura_vertik.2BAOE-l.2BAW8- |
| 15 | Strukturu vertikálů popisuje norma pro vertikály [[PopisVertikalu| Popis vertikálů]] . |
| 16 | |
| 17 | === Struktura metainformací === #Struktura_metainformac.2BAO0- |
| 18 | Strukturu metainformací popisuje norma pro metainformace [[PopisMetainformaci| Popis metainformací]] . |
| 19 | |
| 20 | === Vazby mezi vertikály a metainformacemi === #Vazby_mezi_vertik.2BAOE-ly_a_metainformacemi |
| 21 | 1. V každém adresáři či podadresáři si musejí co do počtu i do jmen (až na příponu) tyto odpovídat. |
| 22 | 1. Každý z dvojice (vertikál, metainformace) obsahuje dokumenty stejných jmen ve stejném pořadí. Příklad: |
| 23 | * mf-1999-05-17.vert obsahuje dokumenty "<doc mf/1999/05/17/1>" až "<doc mf/1999/05/17/159>" |
| 24 | |
| 25 | * mf-1999-05-17.meta obsahuje dokumenty "Doc : mf/1999/05/17/1" až "Doc : mf/1999/05/17/159" |
| 26 | |
| 27 | == Nástroje pro kontrolu správnosti korpusových dat == #N.2BAOE-stroje_pro_kontrolu_spr.2BAOE-vnosti_korpusov.2BAP0-ch_dat |
| 28 | Dají se rozdělit na tři skupiny: |
| 29 | |
| 30 | * kontrola konzistence mezi vertikály a metainformacemi |
| 31 | * kontrola vertikálů |
| 32 | * kontrola metainformací |
| 33 | |
| 34 | Všechny jsou dostupné po přidání modulu: |
| 35 | |
| 36 | {{{ |
| 37 | $ module add corpus |
| 38 | }}} |
| 39 | na strojích aurora (Linux), aisa (IRIX) a oreias (SunOS). |
| 40 | |
| 41 | === Pomocné programy === #Pomocn.2BAOk_programy |
| 42 | Většina programů pracuje se standardním vstupem a výstupem. To znamená, že kontrolní program nezná jméno souboru, jehož obsah mu byl přesměrován na jeho standardní vstup. Proto je tu program `check_file`. Použití: |
| 43 | |
| 44 | {{{ |
| 45 | check_file [-l číslo -s -S] program file |
| 46 | |
| 47 | $ check_file -l 20 meta_check neco.meta |
| 48 | }}} |
| 49 | Jako argumenty mu dáme jméno kontrolního programu a souboru, který chceme zkontrolovat. Jeho výstup obsahuje jméno kontrolovaného souboru a výstup kontrolního programu. Volby: |
| 50 | |
| 51 | * -l číslo ... výstup kontrolního programu se ořeže na 'číslo' řádek |
| 52 | * -s ... totéž co -l 0 |
| 53 | * -S ... pokud kontrola byla bez chyby, potlačí všechen výstup |
| 54 | |
| 55 | Další pomocný program je `traverse_dir`, který je vystavěn na programu ` find `. Použití: |
| 56 | |
| 57 | {{{ |
| 58 | traverse_dir [-v] suffix program [argumenty pro program] |
| 59 | |
| 60 | $ traverse_dir vert check_file -S xml_check |
| 61 | }}} |
| 62 | Suffix je buď `vert` nebo `meta`. Program vyhledá všechny soubory s příponou suffix a provede volání specifikovaného programu s jeho argumenty a jako poslední argument přidá jméno nalezeného souboru. Takže v ukázkovém případu se volá ` check_file -S xml_check neco.vert`. Volba `-v` provede navíc výpis těchto volání. |
| 63 | |
| 64 | === Kontrola konzistence mezi vertikály a metainformacemi === #Kontrola_konzistence_mezi_vertik.2BAOE-ly_a_metainformacemi |
| 65 | Kontroluje se, jestli si odpovídají soubory .vert a .meta: |
| 66 | |
| 67 | {{{ |
| 68 | $ v2m_files |
| 69 | }}} |
| 70 | Dále se kontrolují seznamy jmen dokumentů - program `v2m_docs`. Kontrola jedné dvojice souborů .meta a .vert: |
| 71 | |
| 72 | {{{ |
| 73 | $ v2m_docs soubor.meta #Zadám jen jméno metainformací |
| 74 | }}} |
| 75 | Kontrola celého korpusu: |
| 76 | |
| 77 | {{{ |
| 78 | $ traverse_dir meta v2m_docs |
| 79 | }}} |
| 80 | === Kontrola vertikálů a metainformací === #Kontrola_vertik.2BAOE-l.2BAW8_a_metainformac.2BAO0- |
| 81 | K dispozici jsou tyto programy: |
| 82 | |
| 83 | 1. `il2_check` [[BR]] Určeno pro: *.vert, *.meta. Kontroluje kódování češtiny. Ohlásí podezřelé znaky. Je nutno zvážit, zda se jedná o skutečnou chybu nebo ne. |
| 84 | |
| 85 | 1. `tags_check` [[BR]] Určeno pro: *.vert. Kontroluje, zda řádky, které vypadají jako značky, jsou ze seznamu povolených značek. |
| 86 | |
| 87 | 1. `pozice_check` [[BR]] Určeno pro: *.vert. Kontroluje, zda řádky, které nejsou značkami, jsou dále nedělitelné pomocí funkce Corpus::split(). |
| 88 | |
| 89 | 1. `heuristic_check` [[BR]] Určeno pro: *.vert. Kontrola pozic, zda neobsahují řídící a značkovací řetězce originálního textu. Hledá HTML značky a příkazy LATEXu. |
| 90 | |
| 91 | 1. `xml_check` [[BR]] Určeno pro: *.vert. Kontrola struktury vertikálů. |
| 92 | |
| 93 | 1. `meta_check` [[BR]] Určeno pro: *.meta. Kontrola struktury metainformací. |
| 94 | |
| 95 | Všechny tyto programy jsou filtry. Proto je používáme jedním z těchto tří způsobů: |
| 96 | |
| 97 | {{{ |
| 98 | $ xml_check < soubor.vert > zde_je_vystup 2>&1 |
| 99 | }}} |
| 100 | nebo: |
| 101 | |
| 102 | {{{ |
| 103 | $ check_file xml_check soubor.vert > zde_je_vystup |
| 104 | }}} |
| 105 | nebo: |
| 106 | |
| 107 | {{{ |
| 108 | $ cd adresar_s_daty |
| 109 | $ traverse_dir vert check_file xml_check > zde_je_vystup |
| 110 | }}} |
| 111 | Všechny kontroly se dají spustit pomocí dávky `check_all`: |
| 112 | |
| 113 | {{{ |
| 114 | $ check_all > zde_je_vystup 2>&1 |
| 115 | }}} |
| 116 | === Jak číst výstupy kontrolních programů === #Jak_.2BAQ0A7Q-st_v.2BAP0-stupy_kontroln.2BAO0-ch_program.2BAW8- |
| 117 | * `v2m_files, v2m_docs`[[BR]] Oba programy používají při hlášení rozdílů v seznamech jmen (`v2m_files` - jmen souborů a `v2m_docs` - jmen dokumentů) standardní program `comm` s parametrem `-3`. Ten uvede rozdíly ve dvou tabulátorem odsazených sloupcích. Viz také `man comm`. |
| 118 | |
| 119 | * `il2_check, tags_check, pozice_check, heuristic_check, meta_check` [[BR]] Tyto programy mají snadno čitelný výstup, a není tedy nutno jej zde dále komentovat. |
| 120 | |
| 121 | * `xml_check` [[BR]] Program `xml_check` je založen na volání xml-parseru `rxp`. Jen je proveden určitý preprocessing - viz kapitola [[PopisVertikalu#rozdily| Rozdíly mezi vertikálem a jeho DTD definicí]] |
| 122 | |
| 123 | Výstup programu bude vyložen na několika příkladech: |
| 124 | |
| 125 | {{{ |
| 126 | VSTUP č.1: |
| 127 | <?xml version="1.0"?> |
| 128 | <!DOCTYPE vertical SYSTEM "/net/aisa/corpus/vertical.dtd"> |
| 129 | <vertical> |
| 130 | </vertical> |
| 131 | |
| 132 | VÝSTUP: |
| 133 | Warning: Content model for vertical does not allow it to end here |
| 134 | in unnamed entity at line 4 char 11 of <stdin> |
| 135 | |
| 136 | VYSVĚTLENÍ: |
| 137 | Vertikál neobsahoval žádný dokument, ale párová značka |
| 138 | <vertical> nesmí být prázdná. |
| 139 | |
| 140 | ---------- |
| 141 | VSTUP č.2: (jen jeho relevantní část) |
| 142 | <doc id="neco"> |
| 143 | Ahoj |
| 144 | <head> |
| 145 | Jaroslav |
| 146 | |
| 147 | VÝSTUP: |
| 148 | Warning: Content model for doc does not allow element z here |
| 149 | in unnamed entity at line 5 char 3 of <stdin> |
| 150 | |
| 151 | VYSVĚTLENÍ: |
| 152 | Po značce <doc> musí bezprostředně následovat npaříklad <head> |
| 153 | nebo <p> a nikoli pozice (element z označuje pozici Ahoj). |
| 154 | |
| 155 | --------- |
| 156 | VSTUP č.3: (jen jeho relevantní část) |
| 157 | <p> |
| 158 | <head> |
| 159 | V |
| 160 | zázemí |
| 161 | </head> |
| 162 | blabla |
| 163 | </p> |
| 164 | |
| 165 | VÝSTUP: |
| 166 | Content model for p does not allow element head here |
| 167 | in unnamed entity at line 6 char 6 of <stdin> |
| 168 | |
| 169 | VYSVĚTLENÍ: |
| 170 | V <p> nesmí být zanořen <head> |
| 171 | |
| 172 | --------- |
| 173 | VSTUP č.4: (jen jeho relevantní část) |
| 174 | <doc id="a"> |
| 175 | <p> |
| 176 | V |
| 177 | <p> |
| 178 | A |
| 179 | </doc> |
| 180 | |
| 181 | VÝSTUP: |
| 182 | Warning: Content model for p does not allow element p here |
| 183 | in unnamed entity at line 7 char 3 of <stdin> |
| 184 | Error: Mismatched end tag: expected </p>, got </doc> |
| 185 | in unnamed entity at line 9 char 6 of <stdin> |
| 186 | |
| 187 | VYSVĚTLENÍ: |
| 188 | Neuzavřené značky <p>. |
| 189 | |
| 190 | |
| 191 | --------- |
| 192 | VSTUP č.5: (jen jeho relevantní část) |
| 193 | <p> |
| 194 | <g/> |
| 195 | konec |
| 196 | |
| 197 | VÝSTUP: |
| 198 | Warning: Content model for p does not allow element g here |
| 199 | in unnamed entity at line 6 char 3 of <stdin> |
| 200 | |
| 201 | VYSVĚTLENÍ: |
| 202 | Značka <g/> zde nemůže být, protože musí být vždy z obou stran obklopena |
| 203 | pozicemi, které spojuje a zde je nad ní nikoli pozice, ale značka <p>. |
| 204 | Tato chyba nemůže vzniknout, pokud se použije na "rozsekání" |
| 205 | textu funkce Corpus::split nebo program corus_split. |
| 206 | }}} |
| 207 | == Převod HTML stránek na vertikální tvar == #P.2BAVk-evod_HTML_str.2BAOE-nek_na_vertik.2BAOE-ln.2BAO0_tvar |
| 208 | Pokud si jako zdroj zvolíme webovské HTML stránky, potom jsou zde k dispozici nástroje pro převod do vertikálu. Jsou založeny na perlovském modulu HTML::Parser (`man HTML::Parser`) a na funkci Corpus::split. |
| 209 | |
| 210 | HTML stránky obsahují kromě značek také ještě posloupnosti znaků zvané entity, například & nebo anebo °. Tyto entity je třeba převést na odpovídající znaky. K tomu je k dipsozici filtr nazvaný `html`. Dokumenty jsou často v jiném kódování (1250), v tom případě je třeba použít filtr `cstocs 1250 il2` a to až po aplikaci filtru ` html` (jinak by došlo k chybnému převodu entit typu °). |
| 211 | |
| 212 | Pomocný program `vert2xml` vznikl k překlenutí rozdílů mezi starší a novější definicí struktury vertikálu. Pracuje jako filtr, který přidá ke svému vstupu hlavičku vertikálu (první tři řádky), opraví tvar některých značek a přidá na konec řádek </vertical>. Programy dále popsané dávají výstup ve starším formátu, proto jako postprocessing je vhodné zařadit filtr `vert2xml`. |
| 213 | |
| 214 | Vzhledem k tomu, že struktura HTML dokumentů je celkem volná, pouhým překladem značek nedospějeme ke dobře utvořenému vertikálu. Proto jsou dále popsány prográmky na úpravu některých neduhů - provádějí párování, rušení nebo vkládání značek. Několik programů je spojeno do dávky `tags_all`, kterou je možné použít jako poslední postprocessing. |
| 215 | |
| 216 | === Příklad 1. - nejjednodušší použití === #P.2BAVkA7Q-klad_1._-_nejjednodu.2BAWEBYQDt_pou.2BAX4-it.2BAO0- |
| 217 | Je implementováno v programu [http://nlp.fi.muni.cz/cs/Jak_vytvorit_korpus?action=AttachFile&do=view&target=html2vert.1 html2vert.1] . Program funguje jako filtr. Použití: |
| 218 | |
| 219 | {{{ |
| 220 | html < muj.html | html2vert.1 |vert2xml | tags_all > muj.vert |
| 221 | }}} |
| 222 | Výpis programu: |
| 223 | |
| 224 | {{{ |
| 225 | BEGIN {push @INC , #Do seznamu cest modulu pridej |
| 226 | "/usr/local/lib/perl5/site_perl/5.005", #Cestu k modulu HTML::Parser |
| 227 | "/packages/share/corpus/lib" #Cestu k modulu Corpus |
| 228 | }; |
| 229 | |
| 230 | use Corpus; #Vyzada si balik Corpus |
| 231 | require HTML::Parser; #Vyzada si balik HTML::Parser |
| 232 | package Muj_Parser; #Odtud zacne balik Muj_Parser |
| 233 | |
| 234 | #Nastavuje dedicnost |
| 235 | @ISA=qw(HTML::Parser); |
| 236 | |
| 237 | sub start {} #vola se, kdyz je rozpoznana nekoncova znacka, zatim nedela nic |
| 238 | sub end {} #vola se, kdyz je rozpoznana koncova znacka, zatim nedela nic |
| 239 | |
| 240 | #Tato procedura se vola vzdy, kdyz je rozpozan nejaky text |
| 241 | sub text |
| 242 | { |
| 243 | my($self, $text) = @_; #do $self, $text si ulozim parametry |
| 244 | return unless $text; #pokud $text je prazdny, vrat se |
| 245 | my $t=(Corpus::split($text)); #do $t uloz rozdeleny text |
| 246 | print $t unless $t =~ /^$/; #tiskni $t, pokud neni prazdny |
| 247 | } |
| 248 | |
| 249 | $p = Muj_Parser->new; #Vytvorim novy objekt tridy Muj_Parser |
| 250 | $p->parse_file(\*STDIN); #Volam parsovani standardniho vstupu |
| 251 | }}} |
| 252 | Program převede entity, vypustí všechny HTML značky a text "rozseká" pomocí funkce Corpus::split na pozice. Proto jediná značka ve výstupu bude <g>.[[BR]] Program funguje takto:[[BR]] Metoda parse_file postupně zpracovává STDIN a vždy, když rozpozná nějakou značku, zavolá proceduru start, případně end, a tuto značku, převedenou na malá písmena a zbavenou atributů, předá jako druhý argument. Text mezi značkami je předán proceduře text. |
| 253 | |
| 254 | === Příklad 2. - přidání některých značek === #P.2BAVkA7Q-klad_2._-_p.2BAVk-id.2BAOE-n.2BAO0_n.2BARs-kter.2BAP0-ch_zna.2BAQ0-ek |
| 255 | Je k dispozici v souboru [http://nlp.fi.muni.cz/cs/Jak_vytvorit_korpus?action=AttachFile&do=view&target=html2vert.2 html2vert.2] . Pokud budeme chtít, aby se ve výsledném vertikálu objevily značky <doc>, resp. <p>, tehdy, když ve zdroji byly značky <HTML>, resp. <p>, změníme definici procedur start a end tak, aby tiskly značky, když se rozpoznají jejich HTML ekvivalenty. Navíc do značky <doc> se přidá jako atribut jméno, které je prvním argumentem programu. Použití : |
| 256 | |
| 257 | {{{ |
| 258 | html < muj.html | html2vert.2 blabla | vert2xml | tags_all > muj.vert |
| 259 | }}} |
| 260 | Změněné procedury: |
| 261 | |
| 262 | {{{ |
| 263 | sub start |
| 264 | { |
| 265 | my($self, $tag) = @_; |
| 266 | if ($tag eq "html") {print "<doc $ARGV[0]>\n"}; |
| 267 | if ($tag eq "p") {print "<p>\n"}; |
| 268 | } |
| 269 | |
| 270 | sub end |
| 271 | { |
| 272 | my($self, $tag) = @_; |
| 273 | if ($tag eq "html") {print "</doc>\n"}; |
| 274 | } |
| 275 | }}} |
| 276 | === Příklad 3. - pokročilejší značení === #P.2BAVkA7Q-klad_3._-_pokro.2BAQ0-ilej.2BAWEA7Q_zna.2BAQ0-en.2BAO0- |
| 277 | Je k dispozici v souboru [http://nlp.fi.muni.cz/cs/Jak_vytvorit_korpus?action=AttachFile&do=view&target=html2vert.3 html2vert.3] . Testovací soubor lidových novin je v souboru ln-1999-11-10.all[https://nlp.fi.muni.cz/nlp/cgi-local/edit.cgi/NlpCz/ln-1999-11-10.all ?] . Použití: |
| 278 | |
| 279 | {{{ |
| 280 | html < ln-1999-11-10.all | html2vert.3 l n | vert2xml | tags_all > muj.vert |
| 281 | }}} |
| 282 | Předpokládejme strukturu HTML dokumentu reprezentovanou těmito zanořenými značkami (text byl vypuštěn - viz [http://nlp.fi.muni.cz/cs/Jak_vytvorit_korpus#html_pp html_pp]): |
| 283 | |
| 284 | {{{ |
| 285 | <HTML> |
| 286 | <HEAD> |
| 287 | <SCRIPT LANGUAGE="JavaScript"> |
| 288 | </SCRIPT> |
| 289 | </HEAD> |
| 290 | <BODY> |
| 291 | <P ALIGN="center"> |
| 292 | <DIV CLASS="vlclanek"> |
| 293 | <P ALIGN="right"> |
| 294 | <B> |
| 295 | <I> |
| 296 | </I> |
| 297 | </B> |
| 298 | </DIV> |
| 299 | <HR ALIGN="center" NOSHADE SIZE=2 WIDTH="30%"> |
| 300 | <DIV CLASS="vlclanek"> |
| 301 | <P ALIGN="right"> |
| 302 | <B> |
| 303 | <I> |
| 304 | </I> |
| 305 | </B> |
| 306 | </DIV> |
| 307 | </BODY> |
| 308 | </HTML> |
| 309 | }}} |
| 310 | Toto je zjednodušená struktura HTML souborů na serveru www.trafika.cz (dnes již na [http://noviny.trafika.cz/ noviny.trafika.cz] deníky Lidové noviny, Mladá fronta Dnes a Právo nenajdete). Jeden soubor bude převeden na vertikál s několika dokumenty. Jeden dokument odpovídá kontejneru značek <div> a </div>. Proto do vertikálu pustíme jen text z těchto oblastí. Navíc víme, že text zanořený ve značkách <b> a <i> je tučnou kurzívou vysázené jméno autora, které chceme mít ve vertikálu mezi značkami <sign> a </sign>. Dále budeme jednotlivé dokumenty číslovat, dvanáctý dokument Lidových novin bude <doc ln/12>. |
| 311 | |
| 312 | Předefinujeme procedury start, end a text: |
| 313 | |
| 314 | {{{ |
| 315 | sub start |
| 316 | { |
| 317 | my($self, $tag) = @_; |
| 318 | if ($tag eq "div") {$self->{"poradi"}++; #zvysim si pocitadlo |
| 319 | print "<doc $ARGV[0]/$self->{poradi}>\n"; #tisknu <doc jm/cislo> |
| 320 | $self->{"div"}=1; #indikuju oblast div |
| 321 | } |
| 322 | elsif ($tag eq "p") {print "<p>\n" if $self->{"div"}; } #tisknu <p>, pokud je div |
| 323 | elsif ($tag eq "b") {$self->{"b"}=1} #indikuju b |
| 324 | elsif ($tag eq "i") {$self->{"i"}=1; #indikuju i |
| 325 | print "<sign>\n" if $self->{"b"}; #tisknu <sign>, pokud je b |
| 326 | } |
| 327 | } |
| 328 | |
| 329 | sub end |
| 330 | { |
| 331 | my($self, $tag) = @_; |
| 332 | if ($tag eq "b") {$self->{"b"} =0} #konci b |
| 333 | elsif ($tag eq "i") {$self->{"i"} =0; #konci i |
| 334 | print "</sign>\n" if $self->{"b"}; #tisknu </sign>, je-li b |
| 335 | } |
| 336 | elsif ($tag eq "div") {$self->{"div"} =0; #konci div |
| 337 | print "</doc>\n"; #tisknu </doc> |
| 338 | } |
| 339 | } |
| 340 | |
| 341 | |
| 342 | sub text { |
| 343 | my($self, $text) = @_; #do $self, $text si ulozim parametry |
| 344 | return unless $self->{"div"}; #Pokud neni v mezich div, tak netiskni |
| 345 | return unless $text; #pokud $text je prazdny, vrat se |
| 346 | my $t = (Corpus::split($text)); #do $t uloz rozdeleny text |
| 347 | print $t unless $t =~ /^$/; #tiskni $t, pokud neni prazdny |
| 348 | } |
| 349 | }}} |
| 350 | Objekt $p si nese informaci, ve kterém zanoření zrovna je, a to pomocí ukazatele $self na hash. Například `$self->{"div"} =1;` signalizuje, že jsme vstoupili do div kontejneru. |
| 351 | |
| 352 | === Příklad č.4 - program používaný pro převod periodik z www.trafika.cz (dnes noviny.trafika.cz) === #P.2BAVkA7Q-klad_.2BAQ0.4_-_program_pou.2BAX4A7Q-van.2BAP0_pro_p.2BAVk-evod_periodik_z_www.trafika.cz_.28dnes_noviny.trafika.cz.29 |
| 353 | Je k dispozici bez dalších komentářů v souboru [http://nlp.fi.muni.cz/nlp/files/html2corpora html2corpora] .[[BR]] |
| 354 | |
| 355 | === Pomocný nástroj pro analýzu struktury HTML - html_pp (pp - pretty printer) === #Pomocn.2BAP0_n.2BAOE-stroj_pro_anal.2BAP0-zu_struktury_HTML_-_html_pp_.28pp_-_pretty_printer.29 |
| 356 | Program slouží k tomu, aby bylo snadnější nahlédnout strukturu konkrétního HTML dokumentu. Ponechá pouze značky a odsadí je podle zanoření pomocí tabulátorů. [http://nlp.fi.muni.cz/cs/Jak_vytvorit_korpus#struktura Struktura] v předchozím příkladu byla vygenerována právě pomocí html_pp. Použití: |
| 357 | |
| 358 | {{{ |
| 359 | cat ln-1999-11-10.all | html_pp |
| 360 | }}} |
| 361 | K běhu potřebuje perlovský modul HTML::TreeBuilder. |
| 362 | |
| 363 | == Programy na opravu častých chyb == #Programy_na_opravu_.2BAQ0-ast.2BAP0-ch_chyb |
| 364 | === Pro vertikály === #Pro_vertik.2BAOE-ly |
| 365 | Všechny jsou dostupné po přidání modulu: |
| 366 | |
| 367 | {{{ |
| 368 | $ module add corpus |
| 369 | }}} |
| 370 | na strojích aurora (Linux), aisa (IRIX) a oreias (SunOS). Jsou to: |
| 371 | |
| 372 | 1. tags_pair_doc [[BR]] Páruje značku <doc>. |
| 373 | |
| 374 | 1. tags_rm_bad_glue [[BR]] Maže značku <g/>, pokud není "obalena" pozicemi. |
| 375 | |
| 376 | 1. tags_rm_multi [[BR]] Maže opakující se značky (nechá jen první výskyt z posloupnosti). |
| 377 | |
| 378 | 1. tags_pair_item [[BR]] Páruje značku <item>. |
| 379 | |
| 380 | 1. tags_rm_empty [[BR]] Maže počáteční a koncovou značku, pokud jsou bezprostředně za sebou. |
| 381 | |
| 382 | 1. tags_insert_p [[BR]] Vkládá značku <p> před pozici tam, kde by tato pozice byla zahnízděná přímo v kontejneru značky <doc>. |
| 383 | |
| 384 | 1. tags_pair_p [[BR]] Páruje značku <p>. |
| 385 | |
| 386 | 1. tags_all [[BR]] Dávka, která kombinuje některé výše uvedené programy. |
| 387 | |
| 388 | Použití: všechny programy pracují jako filtry, takže se dají přidat na konec kolony, která produkuje vertikál. Na už vygenerovaný vertikál je vhodné je spustit pomocí pomocného programu apply_filter: |
| 389 | |
| 390 | úprava jednoho souboru: |
| 391 | |
| 392 | {{{ |
| 393 | $ apply_filter tags_all vertikal.vert |
| 394 | }}} |
| 395 | úprava všech vertikálů v korpusu: |
| 396 | |
| 397 | {{{ |
| 398 | $ cd korpus |
| 399 | $ traverse_dir vert apply_filter tags_all |
| 400 | }}} |
| 401 | === Pro metainformace === #Pro_metainformace |
| 402 | `atrib_insert_povinne` - program, který doplní neuvedené povinné atributy a nastaví jim hodnotu Y (nezjistitelné). Je to také filtr, takže použití vypadá takto: |
| 403 | |
| 404 | úprava jednoho souboru: |
| 405 | |
| 406 | {{{ |
| 407 | $ apply_filter atrib_insert_povinne vertikal.meta |
| 408 | }}} |
| 409 | úprava všech metainformací v korpusu: |
| 410 | |
| 411 | {{{ |
| 412 | $ cd korpus |
| 413 | $ traverse_dir meta apply_filter atrib_insert_povinne |
| 414 | }}} |
| 415 | Vložení dalších atributů zajišťují programy: |
| 416 | |
| 417 | 1. atrib_insert_offset [[BR]] |
| 418 | |
| 419 | 1. atrib_insert_size [[BR]] |
| 420 | |
| 421 | 1. atrib_insert_lemmat [[BR]] |
| 422 | |
| 423 | 1. atrib_insert_signat (běží zatím je na auroře) |
| 424 | |
| 425 | Všechny programy očekávají jako svůj jediný argument jméno souboru s metainformacemi. |
| 426 | |
| 427 | Použití: Úprava jednoho souboru: |
| 428 | |
| 429 | {{{ |
| 430 | $ atrib_insert_size vertikal.meta |
| 431 | }}} |
| 432 | úprava všech metainformací v korpusu: |
| 433 | |
| 434 | {{{ |
| 435 | $ cd korpus |
| 436 | $ traverse_dir meta atrib_insert_size |
| 437 | }}} |
| 438 | == Doplňkové programy == #Dopl.2BAUg-kov.2BAOk_programy |
| 439 | 1. vert2xml [[BR]] Program vhodný pro transformaci starého formátu vertikálů na nový. Filtr, který vkládá tyto 3 řádky před svůj vstup: |
| 440 | |
| 441 | {{{ |
| 442 | <?xml version="1.0"?> |
| 443 | <!DOCTYPE vertical SYSTEM "/net/aisa/corpus/vertical.dtd"> |
| 444 | <vertical> |
| 445 | }}} |
| 446 | a tento za svůj vstup: |
| 447 | |
| 448 | {{{ |
| 449 | </vertical> |
| 450 | }}} |
| 451 | a provádí změnu u značek <doc> , <pre> a <g>. |
| 452 | |
| 453 | 1. cisti_corpus [[BR]] Najde soubory, které nekončí .vert nebo .meta (lze je potom smazat). Použití: |
| 454 | |
| 455 | {{{ |
| 456 | $ cd korpus |
| 457 | $ cisti_corpus #vypis |
| 458 | $ cisti_corpus | xargs rm -f #smazani |
| 459 | }}} |
| 460 | 1. docs2meta[[BR]] Přejmenuje .docs soubory na .meta (docs - starší, již nepoužívaná koncovka pro metainformace). Použití: |
| 461 | |
| 462 | {{{ |
| 463 | $ cd korpus |
| 464 | $ docs2meta |
| 465 | }}} |
| 466 | 1. corpus_size[[BR]] Zjistí velikost korpusu. Na výstup dá počet pozic korpusu. |
| 467 | |
| 468 | {{{ |
| 469 | $ cd korpus |
| 470 | $ corpus_size |
| 471 | }}} |