= Jak vytvořit korpus = #Jak_vytvo.2BAVk-it_korpus
[[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.
== Úvod == #A.2BANo-vod
=== Co jsou to korpusy === #Co_jsou_to_korpusy
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.
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).
== Struktura korpusových dat == #Struktura_korpusov.2BAP0-ch_dat
=== Jak jsou korpusy uloženy === #Jak_jsou_korpusy_ulo.2BAX4-eny
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.
=== Struktura vertikálů === #Struktura_vertik.2BAOE-l.2BAW8-
Strukturu vertikálů popisuje norma pro vertikály [[PopisVertikalu| Popis vertikálů]] .
=== Struktura metainformací === #Struktura_metainformac.2BAO0-
Strukturu metainformací popisuje norma pro metainformace [[PopisMetainformaci| Popis metainformací]] .
=== Vazby mezi vertikály a metainformacemi === #Vazby_mezi_vertik.2BAOE-ly_a_metainformacemi
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.
1. Každý z dvojice (vertikál, metainformace) obsahuje dokumenty stejných jmen ve stejném pořadí. Příklad:
* mf-1999-05-17.vert obsahuje dokumenty " a nikoli pozice (element z označuje pozici Ahoj).
---------
VSTUP č.3: (jen jeho relevantní část)
nesmí být zanořen
--------- VSTUP č.4: (jen jeho relevantní část)V
A
. --------- VSTUP č.5: (jen jeho relevantní část)
.
Tato chyba nemůže vzniknout, pokud se použije na "rozsekání"
textu funkce Corpus::split nebo program corus_split.
}}}
== Převod HTML stránek na vertikální tvar == #P.2BAVk-evod_HTML_str.2BAOE-nek_na_vertik.2BAOE-ln.2BAO0_tvar
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.
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 °).
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 . Programy dále popsané dávají výstup ve starším formátu, proto jako postprocessing je vhodné zařadit filtr `vert2xml`.
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.
=== Příklad 1. - nejjednodušší použití === #P.2BAVkA7Q-klad_1._-_nejjednodu.2BAWEBYQDt_pou.2BAX4-it.2BAO0-
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í:
{{{
html < muj.html | html2vert.1 |vert2xml | tags_all > muj.vert
}}}
Výpis programu:
{{{
BEGIN {push @INC , #Do seznamu cest modulu pridej
"/usr/local/lib/perl5/site_perl/5.005", #Cestu k modulu HTML::Parser
"/packages/share/corpus/lib" #Cestu k modulu Corpus
};
use Corpus; #Vyzada si balik Corpus
require HTML::Parser; #Vyzada si balik HTML::Parser
package Muj_Parser; #Odtud zacne balik Muj_Parser
#Nastavuje dedicnost
@ISA=qw(HTML::Parser);
sub start {} #vola se, kdyz je rozpoznana nekoncova znacka, zatim nedela nic
sub end {} #vola se, kdyz je rozpoznana koncova znacka, zatim nedela nic
#Tato procedura se vola vzdy, kdyz je rozpozan nejaky text
sub text
{
my($self, $text) = @_; #do $self, $text si ulozim parametry
return unless $text; #pokud $text je prazdny, vrat se
my $t=(Corpus::split($text)); #do $t uloz rozdeleny text
print $t unless $t =~ /^$/; #tiskni $t, pokud neni prazdny
}
$p = Muj_Parser->new; #Vytvorim novy objekt tridy Muj_Parser
$p->parse_file(\*STDIN); #Volam parsovani standardniho vstupu
}}}
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 , tehdy, když ve zdroji byly značky , resp. , změníme definici procedur start a end tak, aby tiskly značky, když se rozpoznají jejich HTML ekvivalenty. Navíc do značky \n"};
}
sub end
{
my($self, $tag) = @_;
if ($tag eq "html") {print "
\n" if $self->{"div"}; } #tisknu , pokud je div
elsif ($tag eq "b") {$self->{"b"}=1} #indikuju b
elsif ($tag eq "i") {$self->{"i"}=1; #indikuju i
print " před pozici tam, kde by tato pozice byla zahnízděná přímo v kontejneru značky .
1. tags_all [[BR]] Dávka, která kombinuje některé výše uvedené programy.
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:
úprava jednoho souboru:
{{{
$ apply_filter tags_all vertikal.vert
}}}
úprava všech vertikálů v korpusu:
{{{
$ cd korpus
$ traverse_dir vert apply_filter tags_all
}}}
=== Pro metainformace === #Pro_metainformace
`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:
úprava jednoho souboru:
{{{
$ apply_filter atrib_insert_povinne vertikal.meta
}}}
úprava všech metainformací v korpusu:
{{{
$ cd korpus
$ traverse_dir meta apply_filter atrib_insert_povinne
}}}
Vložení dalších atributů zajišťují programy:
1. atrib_insert_offset [[BR]]
1. atrib_insert_size [[BR]]
1. atrib_insert_lemmat [[BR]]
1. atrib_insert_signat (běží zatím je na auroře)
Všechny programy očekávají jako svůj jediný argument jméno souboru s metainformacemi.
Použití: Úprava jednoho souboru:
{{{
$ atrib_insert_size vertikal.meta
}}}
úprava všech metainformací v korpusu:
{{{
$ cd korpus
$ traverse_dir meta atrib_insert_size
}}}
== Doplňkové programy == #Dopl.2BAUg-kov.2BAOk_programy
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:
{{{
a