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

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

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/

Podobné prezentace


Prezentace na téma: "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/"— Transkript prezentace:

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

2 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

3 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!

4 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 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)

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

7 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 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 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 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-06-06 Nyní (říjen 2009) už existuje verze 5.2

11 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 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 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é): = 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 UTF-8 data optikou kódové stránky Windows 1250
Třikrát rychlejší než slovo = TĹ™ikrát rychlejší neĹľ slovo

15 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 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 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 ", $_)); }

18 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 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 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 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

22 Tokenizace (hledání hranic slov)

23 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 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 Normalizace čísel 3,  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 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?

27 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 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 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 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 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 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>

35 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/>

36 Rozdíl mezi HTML a XML <B>Daniel Zeman</B> <P>
tel.: <BR> fax: <BR> místnost 409<BR> ÚFAL MFF UK<BR> Malostranské náměstí 25<BR> Praha<BR> </P> <ZAMESTNANEC> <JMENO> <KRESTNI>Daniel</KRESTNI> <PRIJMENI>Zeman</PRIJMENI> </JMENO> <TEL> </TEL> <FAX> </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>

37 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 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 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 Přístup z Perlu na web Uvnitř dokumentu hledat:
use LWP::Simple; $dokument = get(“ 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 =~ /^ 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 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 Zacyklení Hashování známých URL nemusí stačit.
Jedna stránka může mít teoreticky nekonečně mnoho URL: 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 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 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>

46 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>

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

48 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 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 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 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 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 Příklad: http://www.centrum.cz/
První odkazy: &Theme=default &Theme=light_blue &Theme=juicy &Theme=pink_lady &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 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 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 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 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 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 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 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 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 Jak poznat kódování? Protokol HTTP / MIME hlavička: Záhlaví dokumentu:
Content-type: text/html; charset=iso Záhlaví dokumentu: <meta http-equiv="content-type" content="text/html; charset=iso "> Pozor! Obojí může být chybné nebo vynechané, pokud je server / editor stránek špatně nastaven.

64 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!

65 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 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 Jenže známe kódy, ne písmo!
Θεσσαλονικη ירושלים 我不會懂漢語。 Čĺóóáëďíéęç éřĺůěéí §Ú¤Ł·|Ŕ´ş~»yˇC

68 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 Unicode HTML Θεσσαλονικ&#951 ירושלים 我不會懂漢語。

70 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 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.

72 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 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 ( Wikipedie ( Robot se nesmí jmenovat libwww-perl!

74 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 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 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) á

77 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 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 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 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 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 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 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 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 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 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 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 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 + ̄ + ͂


Stáhnout ppt "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/"

Podobné prezentace


Reklamy Google