Changes between Initial Version and Version 1 of cs/ZpracovaniMetainformaci


Ignore:
Timestamp:
Feb 28, 2014, 1:30:05 PM (6 years ago)
Author:
xkocinc
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • cs/ZpracovaniMetainformaci

    v1 v1  
     1= Zpracování metainformací = #Zpracov.2BAOE-n.2BAO0_metainformac.2BAO0-
     2[[BR]]  Tento článek popisuje  využití metainformací. Ty jsou využitelné pro zjištění statistik o  korpusových datech a pro vytváření specializovaných korpusů.   
     3
     4== Co je cílem == #Co_je_c.2BAO0-lem
     5Naším  primárním cílem je z vertikálního textu vytvořit korpus. Pokud  vytváříme specializovaný korpus (např. dokumenty jen z oblasti  ekonomie), využíváme metainformace, kde jsou vyznačeny potřebné údaje. 
     6
     7Metainformace  jsou uloženy jako textové soubory ve stejném adresáři jako vertikál.  Pokud chceme s nimi pracovat nabízejí se nám tyto možnosti: programy  typu textutils - grep, sort, cut, ... anebo SQL databáze.   
     8
     9== Metainformace jako textová databáze == #Metainformace_jako_textov.2BAOE_datab.2BAOE-ze
     10Pro  využití nástrojů ze sady textutils je vhodné metainformace trochu  přeskupit -  a to tak aby jeden řádek odpovídal jednomu dokumentu. V  praxi použitý program make_doc_list pro každý soubor s metainformacemi  vytiskne na jeden řádek dvojtečkou oddělené atributy   !Signatura:Size:Lemmat:Offset:Doc_id:Vertikal:T_Main:T_Sub
     11
     12{{{
     13A3B7550:3614:52%;10%:19446,23372:S/NWS/1992/lnfi9210/011:cnk25/LNFI/lnfi9210.vert:MIX:MIX
     14AAAA366E:400:96%;84%:9751,2827:S/NWS/1996/ln96238p/006:cnktag/LN/1996/ln96238p.vert:sci2:pol
     15}}}
     16V  adresáři /nlp/corpora/vertical/INFO_O_DUPLICITACH/ je několik souboru  *.list, které byly vytvořeny vždy jako textová databáze metainformací  pro každý korpus a to takto:
     17
     18{{{
     19$ cd korpus
     20$ traverse_dir meta make_doc_list > korpus.list
     21}}}
     22Viz také /nlp/corpora/vertical/INFO_O_DUPLICITACH/Makefile.
     23
     24Pokud chceme tedy vytvořit ekonomický korpus ze všech zdrojů, které jsou k dispozici tak zadáme:
     25
     26{{{
     27$ cat /nlp/corpora/vertical/INFO_O_DUPLICITACH/vertikal.list \
     28| egrep ':eco:eco$' \          #vybereme radky odpovidajici dokumentum z ekonomiky
     29| cut -d: -f4-6 \                #vybereme udaje pro program list2vert
     30| list2vert                     #ze seznamu dokumentu vytvorime vertikalni text
     31}}}
     32== Metainformace jako SQL databáze == #Metainformace_jako_SQL_datab.2BAOE-ze
     33Metainformace jsou uloženy v SQL databázi MySQL   na stroji faunus. Tato forma uložení poskytuje oproti textové databázi  mocnější dotazovací prostředek a u netriviaálních dotazů mnohem  rychlejší vyhodnocení.   
     34
     35=== Struktura SQL databáze === #Struktura_SQL_datab.2BAOE-ze
     36Jsou vytvořeny dvě tabulky:
     37
     38{{{
     39tabulka vertical
     4025 sloupců - primární klíč doc
     41}}}
     42{{{
     43tabulka vertical_M
     444 sloupce
     45mysql> explain vertical_M;
     46+--------+---------------------+------+-----+---------+-------+
     47| Field  | Type                     | Null | Key | Default | Extra |
     48+--------+---------------------+------+-----+---------+-------+
     49| Doc     | varchar(255) binary |        | MUL |            |         |
     50| M_Auth | varchar(255)          | YES  |      | NULL     |         |
     51| M_Date | date                     | YES  |      | NULL     |         |
     52| M_Desc | varchar(255)          | YES  |      | NULL     |         |
     53+--------+---------------------+------+-----+---------+-------+
     54}}}
     55Rozložení  do dvou tabulek je nutné, protože atributy typu M_Auth se mohou pro  jeden dokument opakovat. Takže dotazy na atributy typu M_Auth se pak   musí provádět přes spojení tabulek:
     56
     57{{{
     58SELECT size FROM vertical NATURAL LEFT JOIN vertical_M;
     59}}}
     60=== Založení SQL databáze v MySQL === #Zalo.2BAX4-en.2BAO0_SQL_datab.2BAOE-ze_v_MySQL
     61Tento  krok je samozřejmě v ideálním případě provést třeba jen jednou. V  případě, že se databáze nějak pokazí (a u tak velké databáze, kdy každá  operace trvá dlouho je mnohem pravděpodobnější, že dojde k nějakému  nedokončení opearce a tím k nekonzistenci DB) je nejjednodušší ji smazat a založit znovu. 
     62
     63Pro tento účel máme připravený skript:
     64
     65{{{
     66$ cat /nlp/corpora/vertical/BIN/sql-init
     67CREATE DATABASE IF NOT EXISTS metainfo;
     68use metainfo;
     69
     70DROP TABLE IF EXISTS vertical_M;
     71CREATE TABLE vertical_M (
     72    Doc varchar(255) binary NOT NULL,
     73    M_Auth varchar(255),
     74    M_Date date,
     75    M_Desc varchar(255),
     76    KEY (Doc)
     77);
     78
     79
     80DROP TABLE IF EXISTS vertical;
     81CREATE TABLE vertical (
     82    Auth_N varchar(255) NOT NULL,
     83    Auth_S enum('m','f','n','t','X','Y','NA','MIX','ALT'),
     84    Avail varchar(255),
     85    D_Publ date DEFAULT '0000-00-00' NOT NULL,
     86    Date date,
     87    Doc varchar(255) binary NOT NULL,
     88    Doc_source varchar(255) NOT NULL,
     89    F_Publ date,
     90    Form enum('txb','enc','pop','cri','adv','X','Y','NA','MIX','ALT'),
     91    Lang enum('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','X','Y','NA','MIX','ALT'),
     92    Lemmat1 int(11) DEFAULT '0' NOT NULL,
     93    Lemmat2 int(11) DEFAULT '0' NOT NULL,
     94    Medium enum('b','nws','j','scr','net','oc','cdrom','X','Y','NA','MIX','ALT'),
     95    Position_offset int,
     96    Position_length int,
     97    S_Lang enum('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','X','Y','NA','MIX','ALT'),
     98    Signat varchar(8),
     99    Size int(11) DEFAULT '0' NOT NULL,
     100    T_Main enum('cnk_nove','eco','lit','sci1','sci2','sct','sport','X','Y','NA','MIX','ALT') DEFAULT 'sci1' NOT NULL,
     101    T_Orig varchar(255),
     102    T_Sub enum('arc','ars','ast','bot','bui','cin','com','ene','env','let','lif','man','mem','mer','min','nat','reg','scf','sec','tec','trv','zoo','eco','ind','adm','son','ver','nov','crm','sci','adv','ero','bio','tra','tab','fab','hum','jun','ess','chr','exc','inf','phy','geo','ggr','mat','che','bio','med','agr','eth','lin','lit','pol','art','soc','psy','edu','phi','mil','jur','his','rel','sct','amu','hou','tvf','the','mus','dra','spo','X','Y','NA','MIX','ALT') DEFAULT 'inf' NOT NULL,
     103    Title varchar(255) NOT NULL,
     104    Tran_N varchar(255),
     105    Tran_S enum('m','f','n','t','X','Y','NA','MIX','ALT'),
     106    Vertikal varchar(255),
     107    PRIMARY KEY (Doc),
     108    KEY D_Publ (D_Publ),
     109    KEY T_Sub (T_Sub),
     110    KEY T_Main (T_Main),
     111    KEY Lemmat1 (Lemmat1),
     112    KEY Lemmat2 (Lemmat2),
     113    KEY Size (Size)
     114);
     115}}}
     116Takže pro založení databáze zadáme:
     117
     118{{{
     119$ mysql -uroot -p mysql < /nlp/corpora/vertical/BIN/sql-init #bude to chtit
     120heslo spravce databaze
     121}}}
     122Založení uživatele, který bude spravovat DB metainfo:
     123
     124{{{
     125$ mysql -uroot -p mysql -e "GRANT ALL ON metainfo.* TO mi_user@localhost
     126IDENTIFIED BY 'heslo';"
     127$ mysql -uroot -p mysql -e "GRANT ALL ON metainfo.* TO mi_user@%
     128IDENTIFIED BY 'heslo';"
     129}}}
     130A aby uživatel mohl pracovat se soubory, tak mu nastavíme práva:
     131
     132{{{
     133$ mysql -uroot -p mysql -e "update user SET File_priv='Y' where User='mi_user';
     134"
     135}}}
     136A na závěr musíme dát reload, aby jsme změny uvedli v platnost:
     137
     138{{{
     139$ mysqlacces -uroot -p reload;
     140}}}
     141=== Import dat do SQL databáze === #Import_dat_do_SQL_datab.2BAOE-ze
     142Vzhledem  k tomu, že současné vertikály obsahují více než milion dokumentů je i  SQL databáze s více než milionem záznamů obrovská. Proto je třeba při   práci používat co nejrychlejších prostředků. To nabízí program  mysqlimport. Ten očekává, že data pro jednu tabulku (např. vertical)  budou uložena ve stejnojmenném souboru, jeden řádek tabulky bude  reprezentován jedním řádkem souboru, oddělovačem sloupců je znak  tabulátor, hodnota NULL se reprezentuje pomocí sekvence 2 znaků "\N".  Ukázka 2 řádků tabulky:
     143
     144{{{
     145$ head -2 /nlp/corpora/vertical/SQL_DATA/vertical
     146Y    Y    \N    1998-01-01    \N    S/J/1998/150/001    150 hori    1998-01-01    \N    cs    99    88    j    101    5373    \N    6F59FE5D    695    cnk_nove    \N    sec    Y    \N    \N    cnk/150hori/150.vert
     147Y    Y    \N    1998-01-01    \N    S/J/1998/150/003    150 hori    1998-01-01    \N    cs    94    69    j    7858    4463    \N    5E84F5FB    662    cnk_nove    \N    sec    Y    \N    \N    cnk/150hori/150.vert
     148}}}
     149Převod  z metainformací do tohoto formátu provede program meta2sql, který jako  svůj vstup očekává jméno souboru a vytvoří dva soubory s koncovkami  .sql1 a .sql2. Takže použití:
     150
     151{{{
     152$ cd /nlp/corpora/vertical
     153$ traverse_dir meta meta2sql
     154$ traverse_dir sql1 cat > vertical
     155$ traverse_dir sql2 cat > vertical_M
     156}}}
     157Import dat do databáze se pak provede takto:
     158
     159{{{
     160$ cd /nlp/corpora/vertical
     161$ mysqlimport -umi_user -pheslo metainfo vertical
     162$ mysqlimport -umi_user -pheslo metainfo vertical_M
     163}}}
     164=== Použití SQL databáze pro vytvoření korpusu === #Pou.2BAX4-it.2BAO0_SQL_datab.2BAOE-ze_pro_vytvo.2BAVk-en.2BAO0_korpusu
     165Tak jako v případě textové databáze použijeme program list2vert, kterému  předáme na vstup seznam dokumentů ve formátu:
     166
     167{{{
     168Offset,Length:Doc:Vertikal
     169}}}
     170Tento formát vytvoříme vhodným dotazem, např. dotaz
     171
     172{{{
     173SELECT CONCAT(Position_offset,',',Position_length,':',Doc,':',Vertikal) from vertical where T_Sub='eco' AND Size BETWEEN 2000 AND 2010;
     174+------------------------------------------------------------------+
     175| CONCAT(Position_offset,',',Position_length,':',Doc,':',Vertikal) |
     176+------------------------------------------------------------------+
     177| 5231183,14467:S/NWS/1995/hnb5/1994:cnk/HN/hnb5.vert                  |
     178| 4645,15025:S/NWS/1999/ln99086e/003:cnk/LN/1999/ln99086e.vert      |
     179+------------------------------------------------------------------+
     1802 rows in set (0.07 sec)
     181}}}
     182vybral  dokumenty, pro které je T_Sub='eco'  a jejich velikost se pohybuje od  2000 do 2010 pozic. Výstup si uložíme do souboru nejlépe takto:
     183
     184{{{
     185$ mysql -umi_reader -pmr metainfo \
     186-e "SELECT CONCAT(Position_offset,',',Position_length,':',Doc,':',Vertikal) \
     187from vertical where T_Sub='eco' AND Size BETWEEN 2000 AND 2010;" \
     188> seznam
     189$ list2vert  < seznam | encode
     190}}}