Daniel Zeman http://ufal.mff.cuni.cz/course/popj1/ Počítačové zpracování češtiny Korpusy a první úkoly Daniel Zeman http://ufal.mff.cuni.cz/course/popj1/

Slides:



Advertisements
Podobné prezentace
Formátování diplomové práce
Advertisements

Gymnázium, Broumov, Hradební 218 Tematická oblast: Informační a komunikační technologie Číslo materiálu: EU Název: Typografická pravidla Autor: Mgr.
Styly, záhlaví a zápatí, oddíly
Dynamické dokumenty na straně klienta Informatika pro ekonomy II.
Štěpán Šípal Gymnázium Čakovice. Dnešní témata  Vznik XHTML a předchůdci  Základní prvky XHTML dokumentu  Tagy a atributy  Elementy a jejich druhy.
Tvorba WWW stránek ÚVOD
ZÁKLADY HTML Číslo DUM: VY_32_INOVACE_04_11 Autor: Mgr. Ivana Matyášková Datum vytvoření: duben 2013 Ročník: tercie Vzdělávací obor: informační technologie.
<. DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4
Základy HTML.
Jazyk HTML Název školyZákladní škola a Mateřská škola Tatenice Číslo projektuCZ Název šablony klíčové aktivity Inovace a zkvalitnění výuky pomocí.
CSS a HTML 5. HTML 5 HTML5 je nová verze specifikace značkovacího jazyka HTML, která přináší podstatné změny v technologiích webových stránek. HTML5 umožňuje.
VY_32_INOVACE_4.3.IV1.02/Ku Html dokument a jeho struktura Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je Mgr. Pavla Kubínková CZ.1.07/1.5.00/
Základy html pro úplné začátečníky.
HYPERTEXT PREPROCESSOR. JAZYK PHP. Jazyk PHP (Hypertext PreProcessor) je intepretovaný jazyk určený pro web. Je celkem jednoduchý, snadno přenositelný.
Aplikační a programové vybavení
Internetové publikování Doc. Ing. Petr Zámostný, Ph.D. místnost: A-72a tel.: 4222, 4167 (sekretariát ústavu 111)
TVORBA WEBOVÝCH STRÁNEK
PHP – vkládání souborů a html 5
Střední průmyslová škola strojnická Olomouc, tř.17. listopadu 49 Výukový materiál zpracovaný v rámci projektu „Učíme moderně“ Registrační číslo projektu:
Maturitní otázka č. 12 Kristýna Kaňovská 4. A.
Informatika pro ekonomy II přednáška 4
PHP PHP – základy syntaxe (část 1) - 03 Mgr. Josef Nožička IKT PHP
Střední průmyslová škola strojnická Olomouc, tř.17. listopadu 49 Výukový materiál zpracovaný v rámci projektu „Učíme moderně“ Registrační číslo projektu:
Střední průmyslová škola strojnická Olomouc, tř.17. listopadu 49 Výukový materiál zpracovaný v rámci projektu „Učíme moderně“ Registrační číslo projektu:
Internetové publikování Doc. Ing. Petr Zámostný, Ph.D. místnost: A-72a tel.: 4222, 4167 (sekretariát ústavu 111)
Informatika Internet.
Word Textový editor.
Word – Zásady psaní textu
Číslo projektuCZ.1.07/1.5.00/ Číslo materiáluVY_32_INOVACE_258 Název školyGymnázium, Tachov, Pionýrská 1370 Autor Ing. Roman Bartoš Předmět Informatika.
PHP – Základy programování
Střední průmyslová škola strojnická Olomouc, tř.17. listopadu 49 Výukový materiál zpracovaný v rámci projektu „Učíme moderně“ Registrační číslo projektu:
Číslo projektuCZ.1.07/1.5.00/ Číslo materiáluVY_32_INOVACE_257 Název školyGymnázium, Tachov, Pionýrská 1370 Autor Ing. Roman Bartoš Předmět Informatika.
Maturitní okruh 22: Úvod do HTML. Značkovací a klasické jazyky Klasické: převládá strukturovaný text (programovací kód), skripty jsou prováděny na straně.
JavaScript Podmínky, cykly a pole.
Referát č.13 Textový editor (struktura textu – přiřazení stylu, formátování (vzhled) textu, změna stylu, typografická a estetická pravidla)
Návrh a tvorba WWW Cvičení 4
CSS styly Kaskádové styly (CSS – Cascading Style Sheets) jsou prostředkem, který zajišťuje jednotný vzhled publikovaných stránek. Technologii CSS podporují.
XML Schema Irena Mlýnková. Obsah XML – úvod, příklad, základní pojmy DTD – přehled XML Schema – podrobně.
Jazyk XML Jazyk pro tvorbu strukturovaných dokumentů Syntaxí velmi podobný HTML Hlavní cíle návrhu: Snadná editace - jazyk je textový Snadné strojové zpracování.
WWW – hypertextový informační systém
TYPOGRAFICKÉ PRAVIDLA
Aplikační a programové vybavení
TNPW1 Technologie pro publikování na webu Cvičení č. 2 Překlad URL na fyzickou adresu stránky Editor Macromedia Homesite „Hello world“ v XHTML (úvod do.
URL v HTML URL - Unique Resource Locator Příklad:
Základy syntaxe jazyka PHP PHP JE TECHNOLOGIE BĚŽÍCÍ NA SERVERU. PHP JE TECHNOLOGIE BĚŽÍCÍ NA SERVERU. Typický PHP skript obsahuje: Typický PHP skript.
Kompresní metoda ACB Associative Coder of Buyanovsky autor: George Buyanovsky připravil Tomáš Skopal podle knihy „Data Compression“ od D. Salomona, 1997,
Základní pojmy (1) Nejpoužívanější internetové prohlížeče: Google Chrome (32.0.x), Mozilla Firefox (27.0), Internet Explorer (11.0.2), Opera (19.0.x),
Jak vytvořit webovou stránku HTML Je základ každé webové stránky. Naučit se jej není složité a můžete říct „tento web jsem udělal/a já“
Shrnutí Chceme–li připojit PC k Internetu musíme: 1.Zadat adresu DNS serveru (začne pracovat převod IP adresa  symbolické jméno), prakticky začne fungovat.
Problémy s češtinou České znaky se standardně nepovažují za alfanumerické znaky (\w) Vadí to při třídění vyhodnocování regulárních výrazů Je třeba použít.
Petr Šmíd Obsah prezentace Co je to XML ?
Hranice slov a vět (němčina) Ondřej Dušek. Základní schéma token.pl  dělení slov (s ohledem na data, URL, maily, A$,...)‏ sentrain.pl  hledání zkratek.
Podprogramy (subroutines) Pojmenované kousky programu, které –tvoří logicky ucelené části –se v programu opakují Jsou zapsány na jednom místě a v případě.
Úvod do XML S využitím materiálů z Zdeněk Žabokrtský.
HYPERTEXT PREPROCESSOR. JAZYK PHP. VYUŽITÍ JAZYKA Programování dynamických internetových stránek a webových aplikací vytvoření šablony webu kniha návštěv.
Tvorba WWW stránek. Hyperlink Odkaz, bývá označený jinou barvou a podtržený Odkaz, bývá označený jinou barvou a podtržený Reaguje na událost myši – Reaguje.
Základy XML – struktura dokumentu (včetně testových otázek) Otakar Čerba Oddělení geomatiky Katedra matematiky Fakulta aplikovaných věd Západočeská univerzita.
Reprezentace dat v počítači. základní pojmy  BIT označení b nejmenší jednotka informace v paměti počítače název vznikl z angl. BINARY DIGIT (dvojkové.
Inf Webová stránka, princip HTML a CSS. Výukový materiál Číslo projektu: CZ.1.07/1.5.00/ Šablona: III/2 Inovace a zkvalitnění výuky prostřednictvím.
1 Kurz XHTML a CSS Část 1: Náš první XTHML dokument a jeho publikace na internetu.
XML a datový standard Zdeněk Jirkovec Softwarové Aplikace a systémy.
TYPOGRAFIE Zpracovala: Mgr. Jitka Hotařová
WWW a HTML Základní pojmy Ivo Peterka.
NÁZEV ŠKOLY: Masarykova základní škola a mateřská škola Melč, okres Opava, příspěvková organizace ČÍSLO PROJEKTU: CZ.1.07/1.4.00/ AUTOR: Mgr. Vladimír.
Internet – pojmy, služby
WWW a HTML Základní pojmy Ivo Peterka.
Daniel Zeman Počítačové zpracování češtiny Kontrola pravopisu Daniel Zeman
Word – textový editor.
Přizpůsobení webu Microsoft SharePointu Online
Algoritmizace a datové struktury (14ASD)
Transkript prezentace:

Daniel Zeman http://ufal.mff.cuni.cz/course/popj1/ Počítačové zpracování češtiny Korpusy a první úkoly Daniel Zeman http://ufal.mff.cuni.cz/course/popj1/

Osnova Korpusy Předzpracování a čištění textu Anotace, XML Kódování Tokenizace (hranice slov) Segmentace (hranice vět) Anotace, XML Web jako korpus Rozpoznávání jazyků První úkoly 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Korpus Statistické metody: Potřebujeme ten dlouhý text – korpus! Na dostatečně dlouhém textu se naučit, jak určitý jazykový jev funguje. Naučené statistiky využít k analýze nového textu. Potřebujeme ten dlouhý text – korpus! 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Korpus Korpus je sbírka lingvistických dat. Typicky velké množství přirozeného textu (milióny slov). Nebo audio, popř. audio-video nahrávky. Anotovaný korpus – ručně přidaná lingvistická či jiná informace. 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Anotovaný korpus Těžší získat, ale mnohem užitečnější. Příklad: <f>Přišel<l>přijít<t>VMM <f>soused<l>soused<t>NMS1 <f>.<l>.<t>Z (f = word form, l = lemma, t = tag) 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Předzpracování a čištění textu

Textová data Textových dat je potřeba velké množství. Je žádoucí, aby byla skutečná, ne vytvořená uměle. Proto je potřeba je získat od sponzorů, vydavatelů. Nejčastěji: novinové texty. Data jsou v různých formátech: MS Word, RTF, WordPerfect, HTML, PDF, TeX, prostý text… Je nutné je převést na prostý text, ovšem zachovat některé informace o formátu: autor věděl, proč chtěl pasáž zdůraznit. Vlastní konverze vlastně leží mimo obor: jsou na to specifikace i programy. 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Různá kódování neanglických znaků 0–127 ASCII standard. Zbytek (128–255): anarchie. Věta, která obsahuje všechna písmena abecedy. Na testování, že je použito správné kódování. „Příliš žluťoučký kůň úpěl ďábelské ódy.“ “The quick brown fox jumps over the lazy dog.” Bratři Kameničtí: PŠˇli¨ ‘luźou‡k˜ k–¤ Łpˆl ƒ belsk‚ ˘dy. DOS Latin 2 (852): Pýˇliç §luśouźkě k…ĺ ŁpŘl Ô belsk‚ ˘dy. Windows Central European (1250) (ž, š, ť, Ž, Š, Ť) ISO 8859-2 (UnixLatin2): Přílią ľlu»oučký kůň úpěl ďábelské ódy. Mac CE (Apple MacIntosh, MacOS): PŢ liä ěluéou ků kóË p l belsk k dy. Unicode (stále více rozšířen); hybrid UTF-8, 8+16 bitů (jako třeba JIS): P Yí l i a ~l u eo u k ý k oH ú p l á b e l s k é ó d y . 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Kódování Běžná kódování češtiny: iso-8859-2 (ISO Latin 2, časté na Linuxu) windows-1250, cp1250 (Windows ANSI) utf-8 (Unicode, Linux i Windows) ISO a WIN se (pro češtinu) liší v kódech pro: Š š Ť ť Ž ž 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Unicode Původně (1991) šestnáctibitový kód ISO 8859-2, ANSI aj. pojmou 256 znaků Unicode pojme 65536 znaků všechny dnes běžně používané abecedy Zápisu s pevnou šířkou 2 byty se říká UTF-16 Nejméně od verze 3.2 (2002) rozsah 32 bitů Využívá se pouze rozsah od 0 do 10FFFF, tedy přes milión znaků UTF-32 je vždy zapisuje do 4 bytů, i když by stačily 3 Příklady (skupin) znaků s kódem vyšším než FFFF: 1D000..1D0F5 ; Common # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO 1F030..1F093 ; Common # So [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 Nyní (říjen 2009) už existuje verze 5.2 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

UTF-8 UTF-8 je způsob zápisu Unicodu místo aby každý znak spotřeboval 2 byty, častým znakům stačí 1 byte, méně častým 2 i více 1-bajtové jsou všechny ASCII znaky (kódy 0 až 127, tj. anglická abeceda, číslice, běžná interpunkce…) 2-bajtová jsou mj. všechna česká písmena s diakritikou 3-bajtové jsou např. čínské znaky 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

UTF-8 (pokračování) Kódy 0 – 127 se vejdou do 1 bajtu. 8. bit není nastaven, podle toho se pozná, že informace nepřetéká do dalších bajtů. Kódy 128 – 2047 se vejdou do 2 bajtů. Kódy 2048 – 65535 se vejdou do 3 bajtů. Jít od nejvyššího (8.) bitu dolů (tj. po binárním zápisu zleva doprava), počet nastavených bitů odpovídá počtu bajtů, za první nulou začíná vlastní kód. začátek = 0 … 1 bajt začátek = 110 … 2 bajty začátek = 1110 … 3 bajty začátek = 10 … jiný než první bajt kódu! Zbylých 6 bitů nese část kódu. Lze tedy odlišit první bajt od ostatních. Ne každou posloupnost bajtů lze přečíst jako UTF-8! Současnému Unicodu už to stačí, nicméně mechanismus lze aplikovat i pro větší rozsahy kódů. 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Příklad UTF-8 „Č“ má kód 268 (hex 010C, bin 1 0000 1100) 127 < 268 < 2048, proto potřebujeme 2 B. První začíná 110 a má 5 bitů pro vlastní kód. Druhý začíná 10, pro kód mu zbývá 6 bitů. Výsledný kód (řídící bity jsou zvýrazněné): 110 00100 10 001100 = hex C4 8C Na různých platformách pozor na pořadí bajtů! Volitelně na začátek dokumentu vložit Unicode FFFE (UTF-8 EF BF BE) 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

UTF-8 data optikou kódové stránky Windows 1250 Třikrát rychlejší než slovo = TĹ™ikrát rychlejší neĹľ slovo 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Proč používat UTF-8? Progresivní, stane se nejrozšířenějším standardem. Nejméně jazykově závislé. Perl od verze 5 ho používá jako vnitřní kódování řetězců. Na Linuxech v podstatě vytlačil ISO. Windows ho umí, ale není to default. 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Perl a UTF-8 Vnitřní kódování řetězců je UTF-8. Může se však stát, že potřebujete jiné kódování pro vstupní data výstupní data zdroják programu v Perlu (řetězcové konstanty, tr///…) Nejen to! Aby nezaskočil své dosavadní uživatele, Perl za defaultní kódování zdrojáku ani výstupu NEpovažuje UTF-8 (ale ISO Latin 1, nebo tak něco). 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Příklad: Překódování vstupu z ISO 8859-2 do UTF-8 use utf8; # říct Perlu, že zdroják je v UTF-8 # jinak považuje řetězce ve zdrojáku za posloupnost bajtů a korespondence mezi bajty a znaky ho nezajímá use Encode; # knihovna pro různá ne-UTF kódování binmode(STDOUT, ":utf8"); # jinak bude výstup automaticky překódován do ISO Latin 1 či čeho while(<STDIN>) { # decode() dekóduje „cizokrajný“ (ISO) vstup # do „domácího“ (UTF) formátu print(decode("iso-8859-2", $_)); } 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Knihovna Encode Knihovna pro převody řetězců mezi různými kódováními. Je k dispozici v novějších distribucích Perlu (verze 5.6, raději 5.8 — zjistíte voláním perl -v). use Encode; # říct Perlu, že budeme knihovnu používat $x = decode("cp1250", $y); # interpretovat posloupnost bajtů jako Windows 1250, převést do vnitřního UTF $y = encode("cp852", $x); # převést řetězec z vnitřního UTF do kódové stránky 852 (čeština v okně Příkazového řádku pod Windows) a nastavit příznak, že jde o pouhou posloupnost bajtů. 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Totální UTF8izace kódu Tento začátek zdrojáku zajistí, že se UTF-8 předpokládá úplně všude: use utf8; # zdroják je v UTF-8 use open ":utf8"; # vstup i výstup mnou otevřený ze souboru či roury # předem otevřené standardní proudy: binmode(STDIN, ":utf8"); binmode(STDOUT, ":utf8"); binmode(STDERR, ":utf8"); 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Alternativní kódování chybového výstupu V příkazovém okně MS Windows chcete diagnostické hlášky v cp852. Teoreticky lze provést následující, ale nedoporučuju, na nepřekódovatelných znacích (třeba čínských) to spadne! binmode(STDERR, ":encoding(cp852)"); Místo toho použijte knihovnu Encode, ta neznámé znaky přežije (překóduje je jako „?“) 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

UTF-8 na konzoli Linux: locale Windows (cmd.exe) setenv LANG cs_CZ.utf8 setenv LC_ALL cs_CZ.utf8 Windows (cmd.exe) chcp 65001 Potom pravou myší kliknout na titulní pruh okna s konzolí a v nastaveních přepnout písmo na Lucidu 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Tokenizace (hledání hranic slov)

Slovo Jak poznat hranici slova? První přiblížení: od mezery do mezery. Mezera je také tabulátor, konec odstavce apod. Odsekat interpunkci (čárky, středníky…), ale pozor třeba na “don’t”. Komplikace: ne všechny čárky odsekat („3,141592653“). Interpunkční znaménka jsou také „slova“. (Anglický výraz token pro slovo i interpunkční znaménko. My budeme používat slovo pro obojí.) Problém: spojovník: „česko-slovenský“ je jedno slovo, nebo dvě? „…“ je jedno slovo, nebo tři? 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Slovo Zásadní potíž: Přirozený jazyk nemá formální definici. Lze ho popisovat, ale ne popsat. Vždy se najdou výjimky. Existují jazyky (např. čínština), které slova v textu neoddělují mezerami. 电话 = tien-chua = telefon = elektrická řeč: 2 slova, nebo 1? 北海 = pej-chaj = Severní moře: je to 1 slovo jako v nizozemštině a němčině (Nordsee), nebo 2 slova jako v češtině a angličtině? Mnoho věcí je spíše věcí přístupu než jazyka. 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Normalizace čísel 1 000 000  1000000 3,141592  3.141592 Nejde jen o normalizaci číselného tvaru. Bez správného rozpoznání čísel nedokážeme správně tokenizovat text! Už se neřeší takové věci jako 5 tis. Obdobně normalizace dat (7.10.1999, 7. 10. 99). Popř. též telefonní čísla, PSČ… 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Vlastní jména a „pojmenované entity“ Vhodné umět rozpoznat. Jejich zpracování se obvykle liší od normálních slov. Často chybí ve slovníku. Při překladu se obvykle nepřekládají („Windows“ nejsou „Okna“, „Dvůr Králové nad Labem“ není „Queen’s Court upon Labe“). Mnohdy výjimky ze skloňování („do Ria“, „do Rio de Janeira“, „do divadla ABC“, „pro Kofi Anana“). Nicméně 100 % to udělat nejde. „slovníková“ vlastní jména (Petr, Pavel, Otýlie, Grónsko…) neznámá (ARD, Chemapol, Čchi-čchi-cha-er, MS-Windows…) známá, ale příjmení nebo zeměpisný název (Chaloupka, Nový) Pravidla: <Xxxxx> … je vlastní jméno. Co začátek věty? 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Vlastní jména (pokračování) „Chaloupka dal tři góly.“ Zde: neshoda podmětu s přísudkem. K rozlišení už tedy potřebujeme rozebrat větnou stavbu! „Černý vstoupil do vlády.“ Zde: chybí podstatné jméno, byť ani to nemusí být dostatečný argument: „Mám dva vozy. Bílý je rozbitý. Černý jezdí dobře.“ „Ježek byl jmenován předsedou.“ Tady už pomůže jen sémantická analýza, a to ještě jen v případě, že nejde třeba o bajku. Jiná možnost: Podezřelé slovo se v okolních větách vyskytovalo jinde než na začátku věty, bylo možno poznat, zda je vlastním jménem. Opět jen heuristika, protipříklad „Jak pan Ježek potkal ježka“. 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Segmentace (hledání hranic vět)

Hranice vět První přiblížení: Věta začíná velkým písmenem a končí tečkou, vykřičníkem nebo otazníkem. V řadě písem (s výjimkou latinky, cyrilice, řecké a arménské abecedy) neexistují velká písmena. Interpunkce ano. Koncová interpunkce chybí u nadpisů, hesel, položek seznamu. Podobné pseudověty časté zvláště na webu. Pomůcka: kde končí odstavec, končí i věta! Pravidly podchytit výjimky, kde věta nekončí: „p. Vomáčka, pí. Vomáčková, Fr. Novák, Jos. Novák, sv. Jan, Ferdinand III. Dobrotivý, 30. ZÁŘÍ atd. Pravidla jsou jazykově závislá, hlavní část tvoří seznam zkratek. Pozor na čísla před tečkou (třeba data). Čísla mohou být i na začátku věty. Věta může začínat nebo končit i závorkou, uvozovkami apod. 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Anotace

Standardy pro anotaci jazykových dat SGML (Standard Generalized Markup Language) TEI (Text Encoding Initiative) XML (eXtensible Markup Language) neplést s HTML (HyperText Markup Language) 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

XML Stále více převažuje. Na pohled podobné HTML (jazyk webových stránek), ale neplést! XML navrženo k popisu dat, zaměřuje se na jejich logickou strukturu. HTML navrženo k zobrazení dat, zaměřuje se na jejich vzhled. XML s daty nic nedělá. Usnadňuje však práci programům, které s daty něco dělají. 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

XML Značky XML nejsou předdefinované. Každý si ty své musí definovat. Předdefinovaný je jen obecný tvar značky. K definici značek se používá DTD (document type definition) nebo XML Schema. XML dokument se skládá z hierarchicky uspořádaných prvků (elementů). Nejnižším prvkem hierarchie bývá prostý text. 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Základní stavební kameny XML Prvek je ohraničen svou počáteční a koncovou značkou. Značky jsou identifikátory v ostrých závorkách, koncová značka má navíc na začátku lomítko. <prvek>obsah prvku</prvek> V názvech prvků se nerozlišují malá a velká písmena. Počáteční značka prvku může obsahovat atributy. <prvek id="1" jmeno=KAREL>obsah prvku</prvek> 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Bodové značky Obsah prvku může být prázdný (prvkem je bod mezi daty, s určitými vlastnostmi). Zvláštní „počátečně-koncová“ značka: <prvek/> 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Rozdíl mezi HTML a XML <B>Daniel Zeman</B> <P> dan@hrejsi.cz<BR> tel.: 221 914 225<BR> fax: 221 914 309<BR> místnost 409<BR> ÚFAL MFF UK<BR> Malostranské náměstí 25<BR> 11800 Praha<BR> </P> <ZAMESTNANEC> <JMENO> <KRESTNI>Daniel</KRESTNI> <PRIJMENI>Zeman</PRIJMENI> </JMENO> <EMAIL>dan@hrejsi.cz</EMAIL> <TEL>221914225</TEL> <FAX>221914309</FAX> <LOCATION> <MISTNOST>409</MISTNOST> </LOCATION> <ADRESA> <ORG>UK<ODD>MFF<ODD>ÚFAL </ODD></ODD></ORG> <ULICE>Malostranské náměstí</ULICE> <DUM>25</DUM> <PSC>11800</PSC> <OBEC>Praha</OBEC> </ADRESA> </ZAMESTNANEC> 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

SGML SGML je předchůdce XML. Anotace některých korpusů je ještě postavená na SGML. Nejviditelnější rozdíl: Koncové značky nejsou povinné. 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Další podrobnosti Viz samostatná prezentace o SGML, z výuky nyní vyřazená, ale dostupná na webu mezi podklady. Historické pozadí Snaha o zdůvodnění Základy syntaxe DTD 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Korpus z webu

Korpus z webu Kde vzít korpus? Anotované jsou jen pro některé jazyky, vytvořit je stojí spoustu úsilí, nebývají zadarmo. Česky mluví 10 mil. lidí, ale máme korpusy, o kterých se jiným jazykům ani nesní! Neanotované: na webu jsou tuny textů, stačí sbírat! Jak uvidíme později, neanotovaná data jsou pořád lepší než žádná. A na některé úlohy (třeba háčkování) zcela postačují. 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Přístup z Perlu na web Uvnitř dokumentu hledat: use LWP::Simple; $dokument = get(“http://www.seznam.cz/”); Uvnitř dokumentu hledat: <a href=“odkaz”> Pozor na jiné atributy před i za href, nerozlišovat velká a malá písmena atd. Pozor na javascriptové „odkazy“. <frameset> <frame src=“odkaz”> … </frameset> Pozor, ne všechny odkazy jsou úplné URL adresy! Úplné URL =~ /^http:\/\// Taky mailto:, file:, ftp:, gopher: aj. Absolutní v rámci počítače =~ /^\// Vše ostatní je relativní v rámci vzdáleného počítače. Asi nemá smysl stahovat *.exe, *.pdf atd. 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Procházení webu Pozor na zacyklení! unless(exists($zpracovane{$odkaz})) { zpracovat($odkaz); $zpracovane{$odkaz} = 1; } sub zpracovat my $odkaz = shift; # @_ … return …; # chceme-li něco vrátit 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Zacyklení Hashování známých URL nemusí stačit. Jedna stránka může mít teoreticky nekonečně mnoho URL: http://x.com/index.php http://x.com/index.php?dummy http://x.com/index.php?dummy&dummy Mnohé servery vám URL s chutí namnoží. Při procházení do šířky jen zanáší frontu a brzdí. Při procházení do hloubky hrozí opravdové zacyklení! Proto kromě URL hashovat i obsah (CRC, MD5…) Stejně nestojíme o 20 více méně stejných dokumentů. 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Procházení do šířky a do hloubky Perlovské pole může fungovat jako fronta i jako zásobník. Zásobník: push(@lifo, $url); $url = pop(@lifo); Fronta: push(@fifo, $url); $url = shift(@fifo); Poznámka: Čtvrtou související funkcí je unshift(@pole, $x). 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Dekódování HTML Základní prvky: Komentáře: <!-- komentář --> Počáteční značky (mohou mít atributy s hodnotami v uvozovkách, apostrofech, nebo i bez): <a HREF="../index.htm" target=top> Koncové značky: </a> Text mezi značkami: <p>text odstavce</p> 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Problémy při zpracování HTML while(<>) { s/<.*?>//g; print } # primitivní odstraňování HTML Značka může být rozdělena na několik řádků! while(<>) { $dokument .= $_ } $dokument =~ s/<.*?>//gs; print $dokument; Ale kazí nám to komentáře a hodnoty atributů, v nich mohou být většítka navíc! Pozor také na JavaScript, není-li uvnitř komentáře: <script> … </script> 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Knihovna HTML::Parser use HTML::Parser (); # Obslužná funkce pro počáteční značku. sub start_hook($$) { my $tagname = shift; my $attlist = shift; # odkaz na hash s atributy # <meta http-equiv=“content-type” content=“text/html; charset=iso-8859-2”> if($tagname =~ m/^meta$/i && $attlist->{"http-equiv"} =~ m/^content-type$/i) { if($attlist->{content} =~ m/charset=([-\w\d]+)/i) { $kodovani = $1; } } } 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Knihovna HTML::Parser # Vytvořit objekt parser. $p = HTML::Parser->new( api_version => 3, start_h => [\&start_hook, "tagname, attr"], end_h => [\&end_hook, "tagname"], text_h => [\&text_hook, "text"] ); # Zpracovat dokument po kusech. $p->parse($kus1); $p->parse($kus2); # … $p->eof; # signalizovat konec dokumentu 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Knihovna HTML::Parser # Zpracovat přímo HTML soubor. $p->parse_file("soubor.html"); # Nebo si ho otevřít sám a pak ho zpracovat (hodí se též pro automaticky otevřené soubory, např. STDIN): $p->parse_file(*STDIN); 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

HTML entity Entita je řetězec zastupující většinou neobvyklý znak, popř. též řetězec aj. Začíná ampersandem (&), končí středníkem. Příklad: © = ©, à = à,   = neoddělující mezera. Znaky se zvláštním významem pro HTML: < (<), > (>), & (&), " ("). Zvláštní případ: ë kde 235 je kód znaku (jenže musíme vědět, jaká kódová stránka je použita!) (obvykle Unicode) 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

HTML entity HTML::Parser v předchozím příkladu entity neodstraní! Můžete to udělat sami ručně. Můžete použít jiný modul HTML::Entities. Můžete volat HTML::Parser jinak: Místo o text si řeknete o dtext (dekódovaný text): text_h => [\&text_hook, "dtext"] 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Korpus z webu Neukončené věty, samostatná slova (třeba v různých menu) Spousta termínů a zkratek („MS Windows“), URL a jiná neznámá slova Sada stránek z jednoho serveru: opakují se fráze jako menu, kontakt, z domova, ze světa („boilerplate“). Takový korpus má nevyváženou slovní zásobu! Vyhodit opakované výskyty celých odstavců? 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Příklad: http://www.centrum.cz/ První odkazy: http://www.centrum.cz/? http://www.centrum.cz/? &Theme=default http://www.centrum.cz/? &Theme=light_blue http://www.centrum.cz/? &Theme=juicy http://www.centrum.cz/? &Theme=pink_lady http://www.centrum.cz/? &ThemeOpen=true První „odstavce“: Default Cream Juicy Pussycat Oceanic Dark Vader Zvol si svůj styl! Dobré ráno Přihlásit se Nastavit jako výchozí 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Korpus z webu Web je mnohojazyčný. My chceme typicky jeden jazyk v jednotném kódování. Rozpoznat jazyk, zahodit dokumenty v jiných jazycích. Rozpoznat kódování, dokumenty v jiných kódováních překódovat. 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Rozpoznávání jazyků

Internet je jazykový Babylón! Na webu lze dnes nalézt i ty nejexotičtější jazyky. Angličtina má dominantní postavení a míchá se do všech. Prorůstání třeba CS a EN na úrovni dokumentů jednoho serveru, vět i slov. 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Příklad do šířky Začneme na http://www.centrum.cz/, prohledáváme do šířky. Na prvních 100 stránkách je pouze čeština, střídavě s diakritikou a bez. (Výjimečně slovenština bez diakritiky, ale to je spíš chyba rozpoznávání.) Ale pozor! Dva průchody nejsou stejné! (Dynamické inzeráty apod.) Celkem mezi prvními 100 dokumenty: 61 × čeština 37 × čeština bez diakritiky 2 × (údajně) slovenština bez diakritiky Kde se dnes berou stránky bez háčků a čárek?! 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Stránky bez diakritiky Lze rozpoznávat zvlášť cs, csascii, sk, skascii, ale není to snadné. U krátkých dokumentů selhává. Totéž URL v prohlížeči má diakritiku! Jak to? Náš robot by měl serveru říct, na jaké jazyky a kódování je připraven. Některé servery to zohledňují. $ua->get($url, "Accept-Language" => "cs, sk", "Accept-Charset" => "utf-8") 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Jak předat accept language use LWP::Simple; $dokument = get($url); use LWP::UserAgent; # Vytvořit objekt webový klient. $ua = LWP::UserAgent->new; # Někdy je nutné zatajit, že jde o robota. # Výchozí identifikace je libwww-perl/verze. $ua->agent('Mozilla/5.0'); # Funkci get teď můžeme předat parametry požadavku. $response = $ua->get($url, "Accept-Language" => "cs, sk", "Accept-Charset" => "utf-8"); $dokument = $response->content if($response->is_success); 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Příklad do šířky Začneme na http://www.centrum.cz/, prohledáváme do šířky. Většina z prvních 100 stránek je z domény centrum.cz. Celkem mezi prvními 100 dokumenty: 90 × čeština 5 × angličtina 4 × slovenština 1 × polština 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Příklad do hloubky Začneme na http://www.centrum.cz/, prohledáváme do hloubky. Hned 2. dokument je slovenský. Kolem 50. stránky jsme u Microsoftů (mix cs/en), stránka č. 100 je Bílý dům. Celkem mezi prvními 100 dokumenty: 45 × čeština 40 × angličtina 9 × slovenština 5 × polština 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Různá kódování Jeden jazyk může používat různá kódování Tentýž jazyk v různých kódováních lze chápat jako různé jazyky Na rozdíl od skutečných jazyků lze po detekci snadno překódovat 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Jak poznat kódování? Protokol HTTP / MIME hlavička: Záhlaví dokumentu: Content-type: text/html; charset=iso-8859-2 Záhlaví dokumentu: <meta http-equiv="content-type" content="text/html; charset=iso-8859-2"> Pozor! Obojí může být chybné nebo vynechané, pokud je server / editor stránek špatně nastaven. 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Jak poznat jazyk? V záhlaví MIME Ve zdrojovém kódu dokumentu (HTML) Informace, které server pošle klientovi při komunikaci protokolem HTTP, před vlastním dokumentem. MIME není součástí zdrojového kódu dokumentu a vy ho běžně nevidíte. Content-Language: en Ve zdrojovém kódu dokumentu (HTML) <body … lang=CS …> Obojí je nepovinné a vyskytuje se zřídka! 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Automatické rozpoznání jazyka (bez slovníku) Na první pohled: tohle asi není žádný evropský jazyk: ירושלים של זהב I v rámci latinky: Ř ukazuje s velkou pravděpodobností na češtinu, Ø na dánštinu nebo norštinu atd. Jenže: ne všechny jazyky mají takový znak A také: je tohle čeština? Není! Die Burg wurde vom böhmischen König Přemysl erobert. 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Písmo někdy napoví Některé jazyky mají jedinečné nebo skoro jedinečné písmo, třeba: řečtina (+ starořečtina): Θεσσαλονικη hebrejština (+ jidiš): ירושלים některé indické jazyky svým způsobem i čínština (protože Japonci míchají čínské znaky se svou vlastní abecedou): 我不會懂漢語。 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Jenže známe kódy, ne písmo! Θεσσαλονικη ירושלים 我不會懂漢語。 Čĺóóáëďíéęç éřĺůěéí §Ú¤Ł·|Ŕ´ş~»yˇC 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Unicode Pokud máme štěstí, text používá Unicode nebo některý způsob kódování na něm postavený (UTF-8) UTF-8: jeden znak 1 až 4 (?) bajty Θεσσαλονικη ירושלים 我不會懂漢語。 jedinečné = jedineÄŤnĂ© 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Unicode HTML Θεσσαλονικ&#951 ירושלים 我不會懂漢語。 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Frekvence znaků Jeden výskyt nepomáhá, co frekvence výskytů? Čeština: O E N A T … X Ď Q Ö Ł Slovenština: O E A N R … X Ď Ĺ Ŕ W Ruština: О А Е И Н … Ц Щ Ф Э Ъ Angličtina: E I S N T … K X Q J Z Němčina: E N T S R … Ö J Y X Q Španělština: E A I O R … É X Q Ú Ñ Francouzština: E I S T N … Î Ô W K Â 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Jak využít frekvence? Frekvence (relativní četnost) písmene X v jazyku (tj. v trénovacích datech) = jX Obdobně frekvence X v testovaném dokumentu je tX Seznam frekvencí charakteristických pro daný jazyk je vektor (o zhruba 20 až 50 položkách). Seznam frekvencí zjištěných v posuzovaném textu je vektor. Vzdálenost vektorů (různými metrikami) charakterizuje podobnost dokumentu s jazykem. p1 hezky charakterizuje podobnost dvou dokumentů v intervalu <0;1> (čím blíže k 1, tím podobnější). d2 není podobnost, ale vzdálenost. 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Využití frekvencí Čím menší vzdálenost vektorů, tím podobnější je text předpokládanému jazyku Pokusně stanovit práh podobnosti: vzdálenost překračující práh = jiný jazyk Vektor frekvencí jazyka lze získat z dostatečně velkého textu, kde je jazyk známý 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Kde získat vzorové frekvence? Trénovací korpus nemusí být dramaticky velký. Často stačí jedna delší webová stránka. Mnohojazyčné zdroje na webu: Všeobecná deklarace lidských práv (http://www.unhchr.ch/udhr/) Wikipedie (http://wikipedia.org/) Robot se nesmí jmenovat libwww-perl! 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Frekvence n-tic znaků Překrývající se dvojice, trojice. Otázka: zahrnovat čísla a zvláštní znaky? Spíše asi ne. Možná vynechat celá slova s takovými znaky. Pokud umíme rozhodnout, které znaky jsou ve všech jazycích zvláštní! Zahrnovat mezery? Spíše ano (resp. znaky „začátek slova“ a „konec slova“). ní], [po, [pr, ch], [ne, pro, [př, [st, ení, ho] Znak za mezerou (další slovo) už spíše ne. 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Příklady častých trojic znaků Několik nejčastějších trojic napoví i člověku. Nemusí dané jazyky umět. Stačí, že s nimi přišel do styku. Poznamenávejte si odhady. Které jazyky poznáte jen z jejich statistiky? Které poznáte díky tomu, že vidíte statistiky ostatních jazyků? 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Příklady častých trojic znaků che, sch, der, ich, ter, ung ver, gen, ing, ste, aar, ijn ing, ion, tio, ent, ati, ers pre, ova, nov, vol, nie, ový ova, ých, ost, ová, ick, ého szt, tás, asz, ban, ala, sza nie, dzi, ego, kie, rze, ych ent, tat, ato, est, ion, zio ado, nte, dad, ent, art, cto ion, ent, tio, ale, eme, les али, вал, ост, про, при ent, ute, acu, cut, aci de (němčina) nl (nizozemština) en (angličtina) sk (slovenština) cs (čeština) hu (maďarština) pl (polština) it (italština) es (španělština) fr (francouzština) ru (ruština) (es) á 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Frekvence slov Trojice z častých slov budou časté. Četnosti slov také charakterizují jazyk. Problém: Slova související s tématem článku budou velmi častá. Máme jen malá trénovací data, jinak by to nevadilo. 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Příklad Všeobecná deklarace lidských práv právo, povinnost, poslání… cs: prá, ráv, ost, lán, nos, ání sk: prá, ráv, ost, ani, nos, kto pl: nie, pra, ani, raw, nia, wie ru: рав, ств, пра, ени, ать, ове hr: rav, pra, ima, nje, anj, vat Centrum.cz: Pra, rah, aha v první desítce! V jedné nabídce mají Praha 1 … Praha 15. PDT: pro, ost, ých, ova, sta, ení, ter, pře, ého, kte, řed, sti, pod, ích, ick, nos, kon, ské, ist, ent, hod… 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Frekvence slov Nejčastější slova v Pražském závislostním korpusu (PDT, celkem přes 1 000 000 slov): a, v, se, na, je, že, o, s, z, by, i, do, to, k, ve… Nejčastější slova ve Všeobecné deklaraci lidských práv (VDLP, 1912 slov): a, právo, na, nebo, má, Článek, Každý, v… Nejčastější slova na http://www.centrum.cz/: Praha, čeština, a, nad, do, 1, Hledej, Kč, byty… 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Důsledky Frekvence slov charakterizují jazyk jen při velkých a reprezentativních trénovacích datech. Máme-li malá data, musíme neutralizovat vliv frekvence slov na frekvence znaků! Každé slovo započítat jen jednou! PDT dříve: pro, ost, ých, ova, sta, ení, ter, pře, ého PDT nyní: ova, ých, ost, ová, ick, ého, pro, val, kov VDLP dříve: prá, ráv, ost, lán, nos, ání, neb, ávo, ažd VDLP nyní: ost, ání, nos, ení, ého, ých, ván, ová, roz Centrum dříve: tin, šti, Pra, aha, rah, sko, ost, ešt, češ Centrum nyní: sko, ina, ost, lov, ský, str, ava, cho, rav 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Známe kódování? Trénovací i testovaná data musí mít stejné kódování. Pokud známe kódování, není problém zařídit (překódovat). Pokud ho neznáme, jsou různá kódování různé jazyky k rozpoznání! 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Rozpoznávání kódování Stejná trénovací data převedeme do všech možných kódování, pro každé statistiku. Výhodné, že se statistika liší jen kódováním. Kromě toho to šetří práci. Pozor na vícebajtová kódování! Vše načítat jako řetězce bajtů! binmode(STDIN, ":raw"); Trojice bajtů v UTF jsou méně než trojice znaků, ale fungovat by to mělo. 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Rozpoznávání kódování Nejčastější trojice bajtů v PDT (optikou kódování cp1250): cp1250: ova, ých, ost, ová, ick, ého, pro cp852: ova, ěch, ost, ov , ick, ‚ho, pro iso-8859-2: ova, ých, ost, ová, ick, ého, pro utf-8: pro, ná, ovĂ, ost, enĂ, Ĺľe, Ă­c ascii: eni, pro, ova, ost, sta, ych, ani 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Rady k dalším úlohám

Hranice vět Podchyťte učením co nejvíce výjimek typu „p. Vomáčka, pí. Vomáčková, Fr. Novák, Jos. Novák, sv. Jan, Ferdinand III. Dobrotivý, 30. ZÁŘÍ atd. Zkuste si vyhledat všechna krátká slova následovaná tečkou a podívat se, jak je pravděpodobné, že tady končí věta! Věci, které se nedokážete naučit, zadrátujte do zdrojáku. Snažte se ale udržet zdroják nezávislý na jazyku! Pozor na čísla před tečkou (třeba data). Čísla mohou být i na začátku věty. Věta může začínat i závorkou, uvozovkami apod. 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Háčkování 4: věcné věcně věčné věčně 4: směsné směsně směšné směšně 4: citelné citelně čitelné čitelně 4: setřeny setřený šetřeny šetřený 5: radí rádi řadí řádi řádí 5: stati statí státi sťati sťatí 6: rezavé rezavě řezavé řezavě řežavé řežavě 6: rad raď rád řad řaď řád 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Háčkování Nejprimitivnější: z dat se naučíte pouze slovník. Nejpravděpodobnější oháčkování vyhrává. Ostatní možnosti můžeme zahodit. Kontext: šanci mají i ostatní možnosti. Problém: data jsou řídká. Dvojice slov je méně častá než jednotlivé slovo. Nesledovat kontext celých slov, ale jen koncovky. Koncovka často nese informaci o rodu, čísle a pádu. Tak lze výběr oháčkování zúžit. 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Odháčkování – rady Nemusíte pro všechna písmena s diakritikou psát $x =~ s/á/a/g; $x =~ s/č/c/g; … K dispozici máte operátor tr///: $x =~ tr/ áäąčćďéěęíľĺłňńóôöőřŕšśťúůüűýžźż/ aaaccdeeeilllnnoooorrsstuuuuyzzz/ ; Operátor tr/ÁŠŮ/ASU/ nebude fungovat v jiné kódové stránce! Nejdřív převeďte do UTF-8! 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Odháčkování – rady Ve skutečnosti nemusíte ani vyjmenovat všechna písmena s diakritikou založená na latince. use charnames ":full"; print(charnames::viacode(ord($znak))); LATIN CAPITAL LETTER C WITH CARON $base = chr(charnames::vianame("LATIN CAPITAL LETTER C")); Na začátku proběhněte prvních 687 znaků Unicodu (plus příp. oblast 7680 – 7924), rozpoznejte názvy znaků s diakritikou, vyrobte si názvy znaků bez diakritiky a získejte k nim zpět kód. 11.10.2007 http://ufal.mff.cuni.cz/course/popj1

Odháčkování ještě univerzálněji Rozložit všechny znaky podle unicodových tabulek Např. č → c + ˇ use Unicode::UCD 'charinfo'; $ci = charinfo(ord($znak)); $rozdel = $ci->{decomposition}; Pak odstranit znaky pro diakritiku Zabere i na znaky, které už byly rozložené dříve Někdy má jedno písmeno několik diakritických znamének: ā̃ = a + ̄ + ͂ 11.10.2007 http://ufal.mff.cuni.cz/course/popj1