Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Korpusy a první úkoly Daniel Zeman Počítačové zpracování češtiny.

Podobné prezentace


Prezentace na téma: "Korpusy a první úkoly Daniel Zeman Počítačové zpracování češtiny."— Transkript prezentace:

1 Korpusy a první úkoly Daniel Zeman Počítačové zpracování češtiny

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

3 http://ufal.mff.cuni.cz/course/popj13 Korpus Statistické metody: –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!

4 http://ufal.mff.cuni.cz/course/popj14 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.

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

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

7 http://ufal.mff.cuni.cz/course/popj17 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.

8 http://ufal.mff.cuni.cz/course/popj18 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 (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.

9 http://ufal.mff.cuni.cz/course/popj19 Kódování Běžná kódování češtiny: –iso (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: Š š Ť ť Ž ž

10 http://ufal.mff.cuni.cz/course/popj110 Unicode Původně (1991) šestnáctibitový kód –ISO , ANSI aj. pojmou 256 znaků –Unicode pojme 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 Nyní (říjen 2009) už existuje verze 5.2

11 http://ufal.mff.cuni.cz/course/popj111 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

12 http://ufal.mff.cuni.cz/course/popj112 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 – 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ů.

13 http://ufal.mff.cuni.cz/course/popj113 Příklad UTF-8 „Č“ má kód 268 (hex 010C, bin ) 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é): – = 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)

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

15 http://ufal.mff.cuni.cz/course/popj115 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.

16 http://ufal.mff.cuni.cz/course/popj116 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).

17 http://ufal.mff.cuni.cz/course/popj117 Příklad: Překódování vstupu z ISO 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( ) { # decode() dekóduje „cizokrajný“ (ISO) vstup # do „domácího“ (UTF) formátu print(decode("iso ", $_)); }

18 http://ufal.mff.cuni.cz/course/popj118 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ů.

19 http://ufal.mff.cuni.cz/course/popj119 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");

20 http://ufal.mff.cuni.cz/course/popj120 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 „?“)

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

22 Tokenizace (hledání hranic slov)

23 http://ufal.mff.cuni.cz/course/popj123 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, “). 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?

24 http://ufal.mff.cuni.cz/course/popj124 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.

25 http://ufal.mff.cuni.cz/course/popj125 Normalizace čísel  ,  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 ( , ). Popř. též telefonní čísla, PSČ…

26 http://ufal.mff.cuni.cz/course/popj126 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: … je vlastní jméno. Co začátek věty?

27 http://ufal.mff.cuni.cz/course/popj127 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“.

28 Segmentace (hledání hranic vět)

29 http://ufal.mff.cuni.cz/course/popj129 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.

30 Anotace

31 http://ufal.mff.cuni.cz/course/popj131 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)

32 http://ufal.mff.cuni.cz/course/popj132 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í.

33 http://ufal.mff.cuni.cz/course/popj133 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.

34 http://ufal.mff.cuni.cz/course/popj134 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. obsah prvku V názvech prvků se nerozlišují malá a velká písmena. Počáteční značka prvku může obsahovat atributy. obsah prvku

35 http://ufal.mff.cuni.cz/course/popj135 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:

36 http://ufal.mff.cuni.cz/course/popj136 Rozdíl mezi HTML a XML Daniel Zeman tel.: fax: místnost 409 ÚFAL MFF UK Malostranské náměstí Praha Daniel Zeman UK MFF ÚFAL Malostranské náměstí Praha

37 http://ufal.mff.cuni.cz/course/popj137 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é.

38 http://ufal.mff.cuni.cz/course/popj138 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

39 Korpus z webu

40 http://ufal.mff.cuni.cz/course/popj140 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í.

41 http://ufal.mff.cuni.cz/course/popj141 Přístup z Perlu na web use LWP::Simple; $dokument = get(“http://www.seznam.cz/”); Uvnitř dokumentu hledat: – Pozor na jiné atributy před i za href, nerozlišovat velká a malá písmena atd. Pozor na javascriptové „odkazy“. – … 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.

42 http://ufal.mff.cuni.cz/course/popj142 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 }

43 http://ufal.mff.cuni.cz/course/popj143 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ů.

44 http://ufal.mff.cuni.cz/course/popj144 Procházení do šířky a do hloubky Perlovské pole může fungovat jako fronta i jako zásobník. Zásobník: $url); $url = Fronta: $url); $url = Poznámka: Čtvrtou související funkcí je $x).

45 http://ufal.mff.cuni.cz/course/popj145 Dekódování HTML Základní prvky: –Komentáře: –Počáteční značky (mohou mít atributy s hodnotami v uvozovkách, apostrofech, nebo i bez): –Koncové značky: –Text mezi značkami: text odstavce

46 http://ufal.mff.cuni.cz/course/popj146 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: …

47 http://ufal.mff.cuni.cz/course/popj147 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 # if($tagname =~ m/^meta$/i && $attlist->{"http-equiv"} =~ m/^content-type$/i) { if($attlist->{content} =~ m/charset=([-\w\d]+)/i) { $kodovani = $1; } } }

48 http://ufal.mff.cuni.cz/course/popj148 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

49 http://ufal.mff.cuni.cz/course/popj149 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);

50 http://ufal.mff.cuni.cz/course/popj150 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)

51 http://ufal.mff.cuni.cz/course/popj151 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"]

52 http://ufal.mff.cuni.cz/course/popj152 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ů?

53 http://ufal.mff.cuni.cz/course/popj153 Příklad: 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í

54 http://ufal.mff.cuni.cz/course/popj154 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.

55 Rozpoznávání jazyků

56 http://ufal.mff.cuni.cz/course/popj156 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.

57 http://ufal.mff.cuni.cz/course/popj157 Příklad do šířky Začneme na 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?!

58 http://ufal.mff.cuni.cz/course/popj158 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")

59 http://ufal.mff.cuni.cz/course/popj159 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);

60 http://ufal.mff.cuni.cz/course/popj160 Příklad do šířky Začneme na 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

61 http://ufal.mff.cuni.cz/course/popj161 Příklad do hloubky Začneme na 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

62 http://ufal.mff.cuni.cz/course/popj162 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

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

64 http://ufal.mff.cuni.cz/course/popj164 Jak poznat jazyk? V záhlaví MIME –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) – Obojí je nepovinné a vyskytuje se zřídka!

65 http://ufal.mff.cuni.cz/course/popj165 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.

66 http://ufal.mff.cuni.cz/course/popj166 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): 我不會懂漢語。

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

68 http://ufal.mff.cuni.cz/course/popj168 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Ă©

69 http://ufal.mff.cuni.cz/course/popj169 Unicode HTML –Θεσσαλ& #959;νικη –ירושל&# 1497;ם –我不會懂Ĝ 50;語。

70 http://ufal.mff.cuni.cz/course/popj170 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 Â

71 http://ufal.mff.cuni.cz/course/popj171 Jak využít frekvence? Frekvence (relativní četnost) písmene X v jazyku (tj. v trénovacích datech) = j X Obdobně frekvence X v testovaném dokumentu je t X 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. p 1 hezky charakterizuje podobnost dvou dokumentů v intervalu (čím blíže k 1, tím podobnější). d 2 není podobnost, ale vzdálenost.

72 http://ufal.mff.cuni.cz/course/popj172 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ý

73 http://ufal.mff.cuni.cz/course/popj173 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!

74 http://ufal.mff.cuni.cz/course/popj174 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.

75 http://ufal.mff.cuni.cz/course/popj175 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ů?

76 http://ufal.mff.cuni.cz/course/popj176 Příklady častých trojic znaků 1.che, sch, der, ich, ter, ung 2.ver, gen, ing, ste, aar, ijn 3.ing, ion, tio, ent, ati, ers 4.pre, ova, nov, vol, nie, ový 5.ova, ých, ost, ová, ick, ého 6.szt, tás, asz, ban, ala, sza 7.nie, dzi, ego, kie, rze, ych 8.ent, tat, ato, est, ion, zio 9.ado, nte, dad, ent, art, cto 10.ion, ent, tio, ale, eme, les 11.али, вал, ост, про, при 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) á

77 http://ufal.mff.cuni.cz/course/popj177 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.

78 http://ufal.mff.cuni.cz/course/popj178 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…

79 http://ufal.mff.cuni.cz/course/popj179 Frekvence slov Nejčastější slova v Pražském závislostním korpusu (PDT, celkem přes 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 –Praha, čeština, a, nad, do, 1, Hledej, Kč, byty…

80 http://ufal.mff.cuni.cz/course/popj180 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

81 http://ufal.mff.cuni.cz/course/popj181 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í!

82 http://ufal.mff.cuni.cz/course/popj182 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.

83 http://ufal.mff.cuni.cz/course/popj183 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 :ova, ých, ost, ová, ick, ého, pro –utf-8:pro, ná, ovĂ, ost, enĂ, Ĺľe, Ă­c –ascii:eni, pro, ova, ost, sta, ych, ani

84 Rady k dalším úlohám

85 http://ufal.mff.cuni.cz/course/popj185 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.

86 http://ufal.mff.cuni.cz/course/popj186 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

87 http://ufal.mff.cuni.cz/course/popj187 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.

88 http://ufal.mff.cuni.cz/course/popj188 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!

89 http://ufal.mff.cuni.cz/course/popj189 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.

90 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 + ̄ + ͂ http://ufal.mff.cuni.cz/course/popj190


Stáhnout ppt "Korpusy a první úkoly Daniel Zeman Počítačové zpracování češtiny."

Podobné prezentace


Reklamy Google