wiki:cs/PopisVertikalu

Version 3 (modified by xkocinc, 10 years ago) (diff)

--

Popis vertikálů


Korpusová data jsou uložena v textové podobě jako tzv. vertikální texty (zkráceně "vertikály") (*.vert) a metainformace (*.meta). Tento dokument popisuje strukturu těch prvých - vertikálů. Vertikály obsahují vlastní texty korpusů (pozice) a také strukturní značky. Vertikál je XML dokument definovaný pomocí DTD.

Obecné informace

Základní formát vertikálního textu:

  • textový soubor s koncovkou ‘.vert'
  • na každém řádku jedna pozice (slovo, číslo, oddělovač) nebo strukturní značka (viz níže)
  • u pozic jsou tabulátorem odděleny jednotlivé atributy (word, lemma, tag, příp. další). Při převodu nových textů je uveden pouze atribut word - vlastní slovo.

Jeden soubor s vertikálním textem by měl mít velikost zhruba několik desítek kB.

Kódování znaků je v iso-latin2. Znaky, které v iso-latin2 nejsou, jsou vkládány pomocí ‘&<jméno znaku>'. (Zatím není jasné, o které jde.)

Příklad vertikálu

<?xml version="1.0"?>
<!DOCTYPE vertical SYSTEM "http://www.fi.muni.cz/nlp/vertical.dtd">
<vertical>
<doc id="mf/1999/05/17/121">
<head>
Co
stojí
za
tažením
hokejového
týmu
</head>
<p>
<lang id="en">
Hello
world
<g/>
!
</lang>
Další
zlato
</p>
<sign>
MARTIN
HAŠEK
</sign>
</doc>
</vertical>

Rozdělení textu do pozic

Oddělovače (tečky, čárky, závorky, ...) jsou na samostatné pozici, pouze v případě, že se těsně za sebou (bez mezer) vyskytuje stejný znak, tvoří celá skupina stejných znaků jednu pozici. Aby bylo zachována informace, zda byl daný oddělovač v textu těsně vedle sousedního slova, nebo tam byla mezera, jsou na místa, kde mezera nebyla, vloženy strukturní značky <g/> (glue). Například text

(slovo, které ...

se převede na:

(
<g/>
slovo
<g/>
,
které
...

Zatím se tímto způsobem řeší všechny oddělovače, tedy i tečky u zkratek, časových a kalendářních údajů. Později se pravděpodobně některé oddělovače automaticky spojí s předcházejícími pozicemi.

Vše řeší buď externí program, nebo, při práci v Perlu / Pythonu, volání funkce split z modulu Corpus (dostupné přes module add corpus).

Způsob použití - Perl:

use Corpus; 
$line = Corpus::split($line);

Způsob použití - Python:

import Corpus 
line = Corpus.split(line)

Externí program v Perlu, který volá funkci Corpus::split, se jmenuje corpus_split. Pracuje s STDIN a STDOUT a každý řádek, na kterém není "tag" (tj. neodpovídá regulárnímu výrazu '<.*>'), rozdělí.

Použití:

$ module add corpus
$ corpus_split < bez_glue  > s_glue

Popis strukturních značek

Všechny uvedené značky kromě <pre> a <g> jsou párové. Značky <doc> a <lang> mají atribut id.

<vertical>	hranice vertikálu
<doc>		hranice dokumentu
		atribut id - jednoznačná identifikace v rámci vertikálu
<head>		nadpis
<caption>	průběžný titulek, popisky (nepatří do textu);
		například popisek pod obrázkem v novinách
<p>		odstavec
<poem>		báseň
<lg>		"line group" - skupina řádků v básni
<l>		"line" - řádek básně
<list>		seznam
<item>		odrážka v seznamu
<note>		poznámky (pod čarou)
<q>		uvození (uvozovky, apostrofy), zvýraznění (font)
<sign>		podpis, jméno autora
<lang>		jazyk jiný než čeština
		atribut id - identifikaci jazyka dle ISO 639:1988
<pre>		zastupuje vypuštěné větší objekty
		(obrázek, tabulka, graf, zdrojový kód)
		prázdná, nepárová značka, jen ve formě  <pre/>
<code>		krátké části kódu, počítačové adresy, ...
<table>		tabulka - strukturované textové údaje, které netvoří věty
<row>		řádek tabulky
<cell>		buňka tabulky
<g>		glue - "lepidlo", viz rozdělení textu do pozic
		prázdná, nepárová značka, jen ve formě  <g/>

"Document Type Definition" - DTD vertikálu

Jak číst toto DTD?

  • ENTITY popisuje textové nahrazení v rámci tohoto DTD - obsahuje název zkratky a v uvozovkách to, čím se má nahradit
  • %POZICE; bude vždy nahrazeno textem 'z,(g,z)*'
  • ELEMENT popisuje značku - obsahuje název značky a její obsah
  • vertical je značka obsahující jeden nebo více prvků doc
  • g je značka obsahující EMPTY, tedy nic
  • ATTLIST popisuje atributy nějaké značky
  • značka doc má povinný atribut id
  • Význam symbolů +,*,| je postupně: 1 a více opakování, 0 a více opakování, výběr
<!-- Definice DTD pro korpusova data - vertikaly -->
<!-- odpovida jednomu nerozdelenemu slovu -->
<!ENTITY % POZICE 'z,(g,z)*' >


<!ENTITY % TEXT '(%POZICE;)+ | q' >
<!ENTITY % BLOK '(%TEXT;)+|list|lang|note|code'>

<!ELEMENT vertical ((doc)+)>
<!ELEMENT doc (p|head|caption|table|sign|list|pre|poem)+>
<!ATTLIST doc id CDATA #REQUIRED>

<!ELEMENT p (%BLOK;)+>
<!ELEMENT head (%BLOK;)+>
<!ELEMENT caption (%BLOK;)+>
<!ELEMENT sign (%BLOK;)+>
<!ELEMENT poem (lg|l)+>

<!ELEMENT lg (l)+>
<!ELEMENT l (%TEXT;)+>

<!ELEMENT table ((%TEXT;)+|(row)+)>
<!ELEMENT row (cell)+>
<!ELEMENT cell (%TEXT;)+>

<!ELEMENT list (item)+>
<!ELEMENT item (%BLOK;)+>

<!ELEMENT pre EMPTY>
<!ELEMENT g EMPTY>

<!-- z je virtualni tag, reprezentuje jednu pozici -->
<!ELEMENT z EMPTY>

<!ELEMENT q (%POZICE;)+>

<!ELEMENT lang (%TEXT;)+>
<!ATTLIST lang id
(aa|ab|af|am|ar|as|ay|az|ba|be|bg|bh|bi|bn|bo|br
|ca|co|cs|cy|da|de|dz|el|en|eo|es|et|eu|fa|fi|fj|fo|fr|fy
|ga|gd|gl|gn|gu|ha|hi|hr|hu|hy|ia|ie|ik|in|is|it|iw|ja|ji|jw
|ka|kk|kl|km|kn|ko|ks|ku|ky|la|ln|lo|lt|lv
|mg|mi|mk|ml|mn|mo|mr|ms|mt|my|na|ne|nl|no
|oc|om|or|pa|pl|ps|pt|qu|rm|rn|ro|ru|rw
|sa|sd|sg|sh|si|sk|sl|sm|sn|so|sq|sr|ss|st|su|sv|sw
|ta|te|tg|th|ti|tk|tl|tn|to|tr|ts|tt|tw|uk|ur|uz
|vi|vo|wo|xh|yo|zh|zu) #REQUIRED>
  
<!ELEMENT note (%TEXT;)+>
<!ELEMENT code (%TEXT;)+>

Orientační schéma zanoření značek

Předchozí DTD se dá orientačně zapsat asi takto:

<vertical>
        <doc>
        <head>|<caption>|<p>|<sign>
                [BLOK]
        <list>
                <item>
[BLOK]
        <pre>
        <table>
                 [TEXT]
                 <row>
                <cell>
 [TEXT]
                  <poem>
                 <lg>
  <l>
 [TEXT]
                 <l>
  [TEXT]
 
přičemž [BLOK] znamená:

<list>
         <item>
                  [BLOK]

<lang>|<note>

         [TEXT]
[TEXT]

přičemž [TEXT] znamená:

<q>
         [POZICE]
[POZICE]


přičemž [POZICE] znamená:

<z/>  (zde bude ve skutečnosti konkrétní pozice)
<g/>

Rozdíly mezi vertikálem a jeho DTD definicí

jsou dva

  • kódování - DTD předpokládá UTF-8, vertikál používá ISO-8859-2 (Latin-2)
  • značka <z/> - tam, kde ji očekává DTD, má vertikál pozici

Tyto rozdíly se musí smazat před tím, než provedeme kontrolu (včetně validace) vertikálu pomocí xml-parseru. Proto se každá pozice převede na značku <z/>. Tím navíc vyřeším problém s kódováním UTF-8 (to nepodporuje české znaky) u pozic. V druhém kroku odstraním možnou češtinu v atributu id značky <doc> tím, že nastavím <doc id="X">. To vše není třeba provádět explicitně, je to zahrnuto jako preprocessing v kontrolním programu xml_check. Jen je třeba si být vědom, že výstupní zprávy od xml-parseru se vztahují k takto předzpracovanému dokumentu.

Závěrečné info

Další atributy dokumentu (autor, typ textu, ...) jsou uloženy v samostatném souboru se jménem stejným jako soubor vertikálního textu až na koncovku ‘.meta'. Například vertikální text bude v souborech nevpes95.vert, nevpes96.vert, nevpes97.vert a metainformace v souborech nevpes95.meta, nevpes96.meta, nevpes97.meta. Popis metainformací o dokumentech je popsán zde .