spolecne
Napište programy, které najdou v textu hranice slov a vět. K testování dostanete data v konkrétním jazyku, váš program by však měl být v maximální možné míře jazykově nezávislý. Vše, co potřebuje o konkrétním jazyku vědět, by měl být schopen se naučit z dat. (Z toho plyne, že vy daný jazyk ovládat nemusíte.)
Úloha má tyto části:
Token je společný termín, který se někdy používá pro slova a další prvky věty (čísla, interpunkci). Pokud nebude řečeno na konkrétním místě něco jiného, my budeme používat výrazy token a slovo jako zaměnitelné. Tokenizátor je program, který má rozdělit vstupní text na tokeny.
Váš program se má jmenovat token.pl
, nevyžaduje žádné argumenty, čte standardní vstup a píše na standardní výstup. Pokud by se argumenty přece vyskytly, interpretují se jako cesty k souborům, které se mají číst místo standardního vstupu.
Vstupní i výstupní text je v UTF-8 v libovolném jazyku. Na vstupu mohou být vyznačené hranice odstavců pomocí zalomení řádku (znak LF nebo dvojice CR LF). Tokenizátor nesmí ztratit informaci o tom, zda mezi dvěma slovy byl konec odstavce (řádku), má však mazat nadbytečné prázdné odstavce, ve kterých není žádné slovo. Na začátku a na konci řádku nemají zůstat žádné mezery, mezi dvěma tokeny má být právě jedna mezera (bez ohledu na to, kolik jich bylo na vstupu). Nejdůležitějším úkolem programu je přidat mezeru mezi tokeny, které na vstupu nebyly oddělené. Pravidla, podle čeho poznat hranici tokenu, následují.
Upozornění: Níže uvedená pravidla pochopitelně nejsou jediným správným způsobem, jak dělat tokenizaci. Jejich účelem je sjednotit výstupy tokenizátorů, které vyrobíme. Součástí vašeho řešení mohou být návrhy, jak tato pravidla zpřesnit nebo změnit a proč.
\p{Lu}
odpovídá velkému písmenu, ať už je anglické, s diakritikou nebo třeba v cyrilici.
Pomocný program sentrain.pl
je zodpovědný za jazykovou nezávislost vašeho programu na hledání hranic vět. Měl by se naučit z dat to, co byste jinak psali jako soubor pravidel (ať už do externího souboru, nebo dokonce do zdrojáku). Může sbírat prakticky libovolné informace, ale nejzajímavější pro vás asi bude seznam krátkých slov, která se často vyskytují před tečkou a přitom obvykle tato tečka neukončuje větu.
Vstupem programu je tokenizovaný text v UTF-8, ve kterém jsou hranice odstavců a vět vyznačené následovně:
Pokud je program zavolán bez argumentů, vstup se čte ze standardního vstupu. Pokud je zavolán s argumenty, ty se považují za cesty k souborům, které se mají načíst.
Program by měl vždy psát na standardní výstup, formát výstupu si však stanovte sami podle toho, jaké informace chcete sbírat.
Program sent.pl
přečte tokenizovaný text v UTF-8 s vyznačenými odstavci a vypíše tentýž text s vyznačenými odstavci i větami. Odstavce na vstupu jsou vyznačeny zalomením řádku (každý odstavec leží na samostatném řádku). Na výstupu jsou takto vyznačeny věty, zatímco mezi dvěma odstavci je jeden prázdný řádek navíc (tedy stejný formát jako na vstupu programu sentrain.pl
).
Veškerá pravidla závislá na slovníku konkrétního jazyka (např. seznam zkratek) by měl být program schopen načíst z externího souboru vyrobeného programem sentrain.pl
. Pravidla závislá na abecedě jazyka (např. které znaky Unicodu mohou být koncovou interpunkcí) mohou být ve zdrojáku (ovšem takovým způsobem, aby se zdroják zbytečně nestával jazykově závislým, viz též rady k tokenizaci výše). Chcete-li, můžete i tato pravidla zahrnout do učení. Základním pravidlem každopádně je, že věta je podmnožinou odstavce. Jinými slovy, zalomení řádku máte na vhodná místa přidat, ale nemáte je odstraňovat. Na vstupu samozřejmě můžou být odstavce neukončené tečkou (nadpisy).
Program může být zavolán s volbou (option) -s cesta_k_souboru
, která říká, že v daném souboru najde statistiku vyrobenou programem sentrain.pl
. Tato volba je nepovinná. Pokud není k dispozici statistika, program bude mít nižší úspěšnost, ale může alespoň aplikovat pravidla, která máte přímo ve zdrojáku (např. že mezi tečkou a velkým písmenem velmi pravděpodobně končí věta).
Hlavní vstup (text k rozebrání) se čte ze standardního vstupu, pokud nebyl program zavolán s argumenty; potom tyto argumenty slouží jako cesty k souborům se vstupním textem. Text s vyznačenými hranicemi vět se píše (opět v UTF-8) na standardní výstup.
Kromě zkratek mějte na paměti i další věci (seznam samozřejmě není úplný):
Tento úkol (včetně zadání konkrétního jazyka) si můžete zarezervovat vyplněním formuláře na http://quest.ms.mff.cuni.cz/cgi-bin/zeman/zapoctaky/rezervace_ukolu.pl (pokud ještě není rozebrán).
Pokud se individuálně nedohodneme jinak, termín odevzdání je konec listopadu. Při některé prosincové přednášce program předvedete ostatním.
Další informace k úkolu najdete v http://ufal.mff.cuni.cz/~zeman/vyuka/podklady/pzpj03-prvni_ukoly.pdf.
V zimním semestru 2007-2008 jsou v nabídce němčina, švédština, portugalština a ruština. Odkazy na trénovací data následují. Varování: trénovací data prošla odlišnou tokenizací, než jakou specifikuje tento dokument!