Kódování znaků Datové formáty Zdroje jazykových dat Kódování znaků Datové formáty
Kódování znaků Počítače současnosti – číslicové neexistuje přirozený vztah mezi čísly a znaky abecedy potřeba konvence Neexistence konvence nebo mnoho konvencí CHAOS Na začátku bylo slovo, a to slovo bylo v ASCII …
Základní pojmy Znak (character) abstraktní pojem (An „A“ is something like a Platonic entity: it is the idea of an „A“ and not the „A“ itself) nemá sám o sobě žádnou číselnou reprezentaci ani pevnou grafickou podobu Př. „velké písmeno A s čárkou“ Repertoár znaků (character repertoire) Množina znaků Otázka identity: stejně vypadající znaky mohou být považovány za logicky odlišné (A v latince a alfabetě)
Základní pojmy Kódování (encoding) Algoritmus pro převod posloupnosti znaků na posloupnost oktetů kódová pozice znaku (code position) Číselná reprezentace znaku (nezáporné celé číslo) Kódování (character code) 1-1 relace mezi prvky repertoáru znaků a nezápornými celými čísly Glyf Vizuální prezentace znaku Font Repertoár glyfů pro množinu znaků
ASCII (1) American Standard Code for Information Interchange (od 1950’s) Sedm bitů – hodnoty 0-127 0-31,127 - Kontrolní znaky (Escape, Line Feed) 32-126 – mezera, speciální znaky, číslice, velká a malá písmena latinky: ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ Pozn. Nesmyslný termín ‘8-bit ASCII’
ASCII (2) Výhody: Zásadní nevýhoda: Velice jednoduché kódování: jeden znak – jedna kódová pozice Minimální objem: 1 znak – 1 oktet (jeden bit zbyde - oktety 128-255 zůstávají nevyužité) Zásadní nevýhoda: Neprosto nedostačující pro repertoáry znaků národních abeced
8-bitová kódování (1) Potřeba dalších znaků vznikají nová kódování obsahují ASCII jako podmnožinu navíc využívají oktety 128-255 (stále platí jeden znak – jeden oktet) International Standard Organisation vydává skupinu standardních kódování pro některé skupiny jazků – rodina ISO 8859 (1980’s) ISO 8859-1 (ISO Latin 1) – západoevropské jazyky ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ
8-bitová kódování (2) pro češtinu a ostatní středo- a východoevropské jazyky - anarchie: ISO 8859-2 (ISO Latin 2) Windows-1250 Koi-8 Bratři Kameničtí vlastní „standardy“ IBM, Apple …
Unicode (1) Jediné řešení: víceoktetová kódování 1991 – Unicode Consortium Unicode (resp. ISO 10646) určuje repertoár znaků a jejich kódové pozice v současnosti- 30 světových abeced užívaných v několika stovkách jazyků, cca 40000 znaků …arabština, sanskrt, čínština, japonština, korejština… ambice: 250 abeced pro několik tisíc jazyků Znaky v Unicode: „LATIN CAPITAL LETTER A WITH ACUTE“
Unicode (2) Mýtus: Unicode – 16-bitové kódování Obvyklá kódování: UTF-32 každý znak – čtyři oktety UTF-16 – každý znak v každý znak v BMP (Basic Multilingual Plane) – dva oktety Ostatní znaky – čtyři oktety UTF-8 proměnná délka: 1-6 oktetů na znak v prvním oktetu posloupnosti určuje počet bitů zleva po první nulu celkový počet oktetů Jakýkoli byte, který nezačíná na 10xxxxxx je začátek zápisu dalšího znaku výhoda: znaky ASCII se v UTF-8 kódují stejně -: kompatibilita Výhoda pro češtinu: všechny znaky české abecedy se kódují jedním nebo dvěma oktety
Unicode (3) Ve srovnání s 8-bitovými kódováními vznikají nové otázky: řetězcová ekvivalence vizuálně totožných znaků různých abeced (napr. A v latince, azbuce a alfabetě)? abecední řazení ? („LATIN CAPITAL LETTER A WITH ACUTE“ vs. „LATIN CAPITAL LETTER A WITH GRAVE“)
Jiná řešení „escape notation“ - znaky mimo kódování, které je k dispozici, mohou být nahrazeny dohodnutou posloupností znaků (různé pro různé systémy) TeX: Ä \”{A} HTML Ä Ä transliterace
Konverze souborů Linux: Windows: iconv –f windows-1250 –t utf8 text-win > text-utf8 Windows: nouzové řešení: v MS Word otevřít jako soubor s kódovaným textem a uložit jako soubor s kódovaným textem
Práce s kódováním v Perlu (1) Since Perl 5.8.0: Normal users of Perl should never care how Perl encodes any particular Unicode string (because the normal ways to get at the contents of a string with Unicode--via input and output--should always be via explicitly-defined I/O layers). Perl FAQ: How Do I Know Whether My String Is In Unicode? You shouldn't care. No, you really shouldn't. No, really.
Práce s kódováním v Perlu (2) Pokud zdrojový soubor obsahuje jiné znaky než ASCII, je nutné určit jeho kódování, ve kterém je uložen: use encoding ’utf-8’; Při otevírání vstupních nebo výstupních souborů…, je nutné určit jejich kódování: open FH, ’>:encoding(iso-8859-2)’, ’myfile’; Na otevřených souborech: binmode STDOUT, ’:encoding(iso-8859-2) ’;
Prameny http://www.cs.tut.fi/~jkorpela/chars.html http://www.unicode.org http://www.cestina.cz/ http://search.cpan.org/~abergman/ponie- 2/perl/pod/perluniintro.pod
Datové formáty Rozmanitost datových zdrojů rozmanitost datových formátů Ale stejně …
Negra #BOS 1 1 985275570 1 Mögen VMFIN 3.Pl.Pres.Konj HD 508 Puristen NN Masc.Nom.Pl.* NK 505 aller PIDAT *.Gen.Pl NK 500 Musikbereiche NN Masc.Gen.Pl.* NK 500 auch ADV -- MO 508 die ART Def.Fem.Akk.Sg NK 501 Nase NN Fem.Akk.Sg.* NK 501 rümpfen VVINF -- HD 506 , $, -- -- 0 die ART Def.Fem.Nom.Sg NK 507 Zukunft NN Fem.Nom.Sg.* NK 507 der ART Def.Fem.Gen.Sg NK 502 Musik NN Fem.Gen.Sg.* NK 502 liegt VVFIN 3.Sg.Pres.Ind HD 509 für APPR Akk AC 503 viele PIDAT *.Akk.Pl NK 503 junge ADJA Pos.*.Akk.Pl.St NK 503 Komponisten NN Masc.Akk.Pl.* NK 503 im APPRART Dat.Masc AC 504 Crossover-Stil NN Masc.Dat.Sg.* NK 504 . $. -- -- 0 #500 NP -- GR 505 #501 NP -- OA 506 #502 NP -- GR 507 #503 PP -- MO 509 #504 PP -- MO 509 #505 NP -- SB 508 #506 VP -- OC 508 #507 NP -- SB 509 #508 S -- MO 509 #509 S -- -- 0 #EOS 1
Penn Treebank ( (S (NP-SBJ The proposed changes) (ADVP also) (VP would (VP allow (S (NP-SBJ executives) (VP to (VP report (NP (NP exercises) (PP of (NP options))) (ADVP-TMP (ADVP later) and (ADVP less often))))))) .))
PDT [#,Z#-------------,#7,AuxS,ln95049:125- p8s4A,origf=#7,ord=0,trlemma=#7,func=SENT,dord=0,sentord=0,reserve1 =TR_TREE]([politika_^(v?da),NNFS1-----A---- ,politika,ExD,origf=politika, AID=ln95049-125- p8s4Aw2,2,formtype=lower,tagMD_a=NNFS1-----A---- ,tagMD_b=NNFS1-----A---- ,politika_^(věda),politika_^(věda),ordorig=0,politika,???,SG,NA,tfa=T,DE NOM,memberof=NIL,dord=2,sentord=2,funcauto=DENOM,(286.0/14.0),# {custom4},trneg=A,reserve2=ExD]([cenový,AAFS1----1A---- ,Cenová,Atr,origf=Cenová,AID=ln95049-125- p8s4Aw1,1,formtype=cap,tagMD_a=AAFS1----1A----,tagMD_b=AAFS1-- --1A---- ,cenový,cenový,ordorig=2,cenový,???,SG,POS,tfa=T,RSTR,memberof=NI L,dord=1,sentord=1,funcauto=RSTR,(3028.0/67.1),#{custom4},trneg=A,re serve2=Atr]))
WordNet 00044113 04 n 05 entrance 0 entering 0 entry 0 ingress 0 incoming 0 012 @ 00043484 n 0000 + 01958650 v 0301 + 01958650 v 0201 + 01671620 v 0201 + 01958650 v 0101 ~ 00044454 n 0000 ~ 00044639 n 0000 ~ 00044745 n 0000 ~ 00044898 n 0000 ~ 00045146 n 0000 ~ 00046615 n 0000 ~ 01178182 n 0000 | the act of entering; "she made a grand entrance"
Valenční slovník extrahovaný ze SSJČ angažovat <v>hPc4-hTc2r{do},hPc4-hTc6r{v},hPc4-hTc2r{do}-hTc6r{v} angažovat se <v>hTc6r{v},hTc2r{do},hTc6r{p?i},hPTc4r{pro},hPTc4r{za} anglikanizovat <v>hPTc4 anglikanizovat se <v> animovat <v>hPTc4,hPc4,hPc4-hTc3r{k},hPc4-hTc4r{pro} antedatovat <v>hTc4 anticipovat <v>hTc4 antropomorfizovat <v>hTc4 anulovat <v>hTc4 apelovat <v>hPTc3r{ke},hPTc4r{na} aplaudovat <v>hPTc3 aplikovat <v>hTc4,hTc4r{na},hTc4-hTc4r{na},hTc4,hTc6r{v},hTc4-hTc6r{v} aportovat <v>hTc4,hPc3-hTc4 apretovat <v>hTc4 aprobovat <v>hPTc4 aprobovat se <v>hTc4r{na}
Valenční slovník VALLEX * HLÁSIT ~ ned: hlásit + ACT(1;obl) ADDR(3;opt) PAT(o+6;opt) EFF(4,jak,že;obl) LOC(;typ) -synon: oznámit -example: hlásit někomu o něčem zprávu -reciprex: hlásili si navzájem o sob? nové zprávy -reciprocity: ACT-ADDR-PAT -use: prim -class: communication -freq: 8;9 + ACT(1;obl) ADDR(3;opt) PAT(na+4;opt) EFF(4,jak,?e;obl) LOC(;typ) -synon: udat -example: hlásit na něj, že přechovává zakázané knihy -use: posun -freq: 3
Přechod na jednotný formát? XML!