Masarykova univerzita Fakulta informatiky }w!"#$%&'()+,-./012345<ya Korekturní rozšíření pro editor OpenOffice.org Bakalářská práce Jaroslav Moravec Brno, jaro 2009
Prohlášení Prohlašuji, že tato bakalářská práce je mým původním autorským dílem, které jsem vypracoval samostatně. Všechny zdroje, prameny a literaturu, které jsem při vypracování používal nebo z nich čerpal, v práci řádně cituji s uvedením úplného odkazu na příslušný zdroj. Vedoucí práce: Mgr. Vojtěch Kovář ii
Poděkování Rád bych poděkoval především Miloši Jakubíčkovi a Janu Buštovi za velkou ochotu. Diskutovali se mnou všechny otázky, dávali mi rady a měli věcné připomínky. Také jsem vděčný za práci v kolektivu NLP laboratoře, díky nimž jsem mnoho nového poznal. Nakonec děkuji Vojtěchu Kovářovi za skvělé vedení práce a podporu. iii
Klíčová slova OpenOffice.org, Java, unitok.py, klasifikace chyb, tokenizace iv
Keywords OpenOffice.org, Java, unitok.py, mistake classification, tokenizing v
Obsah 1 Korpus Chyby............................ 4 1.1 Budování korpusu........................ 4 1.2 Značkování dokumentů...................... 5 1.3 Značka corr........................... 5 1.4 Univerzální tokenizer....................... 7 1.5 Nepárovost značky corr..................... 8 1.6 Zanesení značky do dokumentu................. 8 2 Klasifikace chyb........................... 10 2.1 Obtížnost značkování studenty................. 10 2.2 Rozsah vyznačování textu pro opravu chyby.......... 10 2.2.1 Označení chybného textu spolu s příčinou....... 11 2.2.2 Označení jen chybného textu.............. 11 2.2.3 Označení nejmenší možné chybné části......... 12 2.3 Stylistické chyby......................... 12 3 Implementace............................. 13 3.1 OpenOffice.org API Plugin................... 13 3.2 Ikony................................ 14 3.3 Klasifikace chyb.......................... 15 3.4 Grafické uživatelské rozhraní.................. 19 3.4.1 Rozhraní v OpenOffice.org............... 19 3.4.2 Okno pro opravu chyby, třída MakeCorrectionPanel. 20 3.5 Napojení na OpenOffice.org API................ 20 3.6 Tokenizér a Jython........................ 21 3.7 Značkování zdrojových souborů TEXu............. 23 4 Instalace a použití.......................... 24 4.1 Instalace OOCorr......................... 24 4.2 Práce s OOCorrem........................ 24 4.2.1 Zanesení opravy..................... 24 5 Závěr.................................. 26 vi
Shrnutí Tato práce popisuje korpus chyb, který vzniká na Fakultě informatiky Masarykovy univerzity a tvorbu nového korekturního nástroje. V průběhu práce si ukážeme velké množství úskalí, které je potřeba překlenout, z nichž se budeme věnovat i tokenizaci textu a klasifikaci chyb. Nově vzniklý nástroj je rozšířením pro kancelářský balík OpenOffice.org, a tak část textu se zabývá popisem vzniku takového rozšíření. 1
Úvod Informatika pomáhá lidem v mnoha sférách dnešní společnosti, stejně jako pomáhá matematikům, lékářům, biologům, pomáhá i lingvistům, kteří hojně využívají při studiu jazyka korpusy textů. Na Fakultě informatiky Masarykovy univerzity vzniká a je spoluvyvíjen nejeden korpus. Jedním z nich je korpus chyb, který je tvořen sbírkou opravených a označkovaných prací, vzniklých v povinném předmětu VB000 Základy odborného stylu na Fakultě informatiky. V dnešní době má tento korpus asi půl milionu tokenů a je využíván pro tvorbu odpovědníků Informačního systému Masarykovy univerzity sloužících studentům k procvičování častých gramatických chyb. Značkování textů je prováděno samotnými studenty (po opravě textu pedagogem) za pomocí programu Wincorr, nebo makrem CorrMacros pro textový procesor Microsoft Word, případně ručně, zejména v textech psaných ve zdrojových souborech TEXu. Programy Wincorr i CorrMacros byly vytvořeny téměř před deseti lety a nebyly dále udržovány. Za tu dobu se objevilo několik potřeb, například podpora většího množství formátů nebo změny v klasifikaci chyb. Navíc programy nebyly bezchybné a několik věcí neuměly, v horším pracovaly nekorektně, proto nastala doba, kdy bylo nutné buď opravit a dodělat programy stávající, nebo vytvořit nástroj nový. Jednou z možných variant bylo vytvořit rozšíření do open source kancelářského balíku OpenOffice.org. Po zvážení různých možností se toto řešení shledalo jako nejpřijatelnější. Během implementace se vyskytlo několik otázek, které vedly i k úvahám nad změnou způsobu značkování textu. Výsledný produkt je nazván OOCorr 1. Implementace OOCorru je provedena převážně v Javě, jelikož Java je nejvíce podporována OpenOffice.org. Svědčí o tom většina oficiálních návodů i samotná [5], kde jen menšina příkladů není uvedena právě v Javě. S vytvořením nového korekturního nástroje se váže i plánované vybudování nové klasifikace chyb, která by nahradila stávající, proto je také v zadání práce požadavek na oddělenou definici klasifikace chyb od implementace. Proto budeme 1. zkratka pro OpenOffice.org Corr 2
V první kapitole si připomeneme, co to jsou korpusy a podrobněji prozkoumáme, jak je tvořen korpus Chyby, v druhé se budeme zabývat klasifikací chyb pro značkování textů pro korpus Chyby, ve třetí se budeme zabývat tvorbou rozšíření pro zmiňovaný kancelářský balík a ve čtvrté konečnou implementací. 3
Kapitola 1 Korpus Chyby Pro zkoumání jazyka v dnešní době jazykovědci často využívají jazykové korpusy. Korpus, jak ho zde chápeme, je sbírkou označkovaných textů uložených v elektronické podobě. Do textů jsou vyznačovány různé značky vzhledem k účelu korpusu. Lingvisté mají nepřeberné množství možností, jak takové sbírky textů dnes využít, jelikož největší korpusy obsahují přes miliardu slov, běžně pak stovky milionů slov. Jedním z pojmů se kterým se v korpusech pracuje je token. Token chápeme jako výskyt slovního tvaru v korpusu [3], například slovo, či interpunkční znaménko. Všechny texty, které jsou zařazeny do korpusu, se rozloží na tokeny. Tento proces nazýváme tokenizace. Texty se poté dále zpracovávají, vytváří se vertikální texty, značkují se a nakonec se komprimují pro korpusové aplikace. Korpus s názvem Chyby je vyvíjen na Fakultě informatiky, jeho počátky se datují od roku 2000. Jeho účelem je zaznamenat takzvaný spontánní text (s-text) [4] s vyznačenými chybami. Ačkoliv korpus existuje bezmála deset let, je velmi malý. Kurz VB000 má kapacitu 200 studentů a je tak teoreticky možné získat 200 2 600 = 240 000 slov za semestr. Kvůli rozdílnému vedení seminářů celá jedna polovina textů se neznačkovala vůbec, průměrně 4 lidé odevzdávají práci bezchybnou a několik studentů neodevzdá první nebo druhou práci vůbec. Reálný přírůstek tedy za poslední roky je odhadem 100 000 slov. Ovšem v roce 2003 korpus obsahoval 410 000 výskytů [4], a tak je tomu do dnes. V nedávné době se začalo na korpusu opět pečlivě pracovat, hlavně díky projektu budování e-learningových materiálů. Připravují se označkované texty pro vložení do korpusu a také se připravuje nový koncept výuky. 1.1 Budování korpusu Korpus vzniká na základě textových prací v předmětu VB000 Základy odborného stylu. V tomto předmětu mají studenti za úkol vypracovat část bakalářské práce a esej na dané téma, obě dvě práce v rozsahu 600 slov. Tyto 4
1. Korpus Chyby texty jsou po odevzdání (jak v elektronické, tak i tištěné podobě) opraveny vyučujícími za pomocí asistentů a vráceny studentům k opravení. Ti mají povinnost všechny chyby opravit a označkovat dokument za pomocí korekturních nástrojů. Celý proces probíha takto: 1. napsání slohové práce studentem, odevzdání práce v tištěné a elektronické podobě 2. důkladná oprava práce pedagogem, vrácení k opravě studentovi 3. pokud je dokument v pořádku, ukonči, jinak pokračuj 4. oprava všech chyb v práci, označkování elektronického dokumentu, odevzdání práce v tištěné a elektronické podobě studentem 5. kontrola dokumentu, není-li překročen limit povoleného počtu opakování oprav a zároveň jsou nalezeny chyby, přejdi na bod 2, jinak ukonči 1.2 Značkování dokumentů Studenti měli doposud k dispozici dva nástroje pro značkování: WinCorr, který dovolil značkovat dokumenty ve formátu Rich Text Format a Corr- Macros, makro pro textový procesor Microsoft Word pro značkování dokumentů Word Document. Tyto programy omezovaly formát odevzdaných prací pouze na dva typy (pokud nepočítáme ruční zanesení značek do čistého textu), druhý z nich je nyní již zastaralý a společnost Microsoft jej nahradila v nové verzi textového procesoru formátem Word Microsoft Office Open XML Format Document, navíc makro CorrMacros je nefunkční v Microsoft Word 2007. 1.3 Značka corr Značka je standardní nepárový XML element s názvem corr s atributy errtype, corrtype, old a words. Všechny atributy jsou povinné a mají tyto významy: errtype druh chyby dle klasifikace chyb corrtype způsob zanesení chyby do textu old původní, chybný text 5
1. Korpus Chyby words počet slov 1 uvedených těsně za značkou, které nahradily chybný text Ukázka značky spolu s textem: <corr errtype="styl-subst" corrtype="change" old="koncovkou" words="1"/>příponou Touto značkou se vyznačují vzniklé chyby spolu s opravou a její tvar má následující význam. Atribut errtype přináší nová data o typu chyby a atributy old a words zajišťují obnovení původního textu. K tomu měl zřejmě sloužit i atribut corrtype, který podle [2] má hodnoty: change, del, add, join a split (nahrazený, smazaný, přidaný text, spojení slov odstraněná mezera, rozdělené slovo vložená mezera). Ovšem všchny tyto hodnoty atributu lze buď vydedukovat z atributů old a words, nebo změnou označení opravovaného textu. Při odstranění atributu corrtype by se určil způsob opravy takto: change atribut old je neprázdný a words je nenulový, del atribut old je neprázdný a words je nulový, add atribut old je prázdný a words je nenulový, join místo označení mezery jsou označena slova, která jsou potřeba spojit, standardně pak atribut old obsahuje dvě slova a words má hodnotu 1, split označeno je slovo, které je potřeba rozdělit, typicky pak atribut old obsahuje jedno slovo a words má hodnotu 2. Způsob opravy zůstane jen jeden ve významu hodnoty change. Atribut corrtype je zbytečný. Atribut words je nevhodně použit ve stávajících nástrojích pro značkování, tak i rady pro počítání slov při ručním opravování. Atribut má uchovávat celočíselnou hodnotu, kolik slov bezprostředně po značce následuje text, který nahradil nekorektní text. Slovo ovšem obecně neobsahuje interpunkci (pokud se přikloníme k názoru, že slovo je skupina hlásek) a nyní je zřejmě chápáno jako skupina znaků oddělených mezerami. Proto při opravě například chybějící čárky v souvětí nemůžeme korektně obnovit původní text, pokud způsob opravy je typu add. 1. nyní počet tokenů 6
Příklad opravy interpunkce způsobem vložení: Nevím<corr errtype="intp-pvety" corrtype="add" old="" words="0"/>, co s tím. 1. Korpus Chyby Získat původní text je nesnadné a zcela jistě to závisí na typu chyby. Vzhledem k možné (a potřebné) změně klasifikace chyb je tato závislost zřejmě chybná. Rozhodneme-li se pro druhý způsob opravy typu change, která přinese změnu v označeném textu, nastanou jiné komplikace. Příklad opravy interpunkce způsobem nahrazení: <corr errtype="intp-pvety" corrtype="change" old="nevím co" words="2"/>nevím, co s tím. Novým textem chyby je: Nevím, co, počet slov: 2, počet tokenů: 3. Problém se tedy projeví při dolování chyb z korpusu, jelikož text v něm je uložen ve formě tokenů a počet slov není shodný s počtem tokenů. Při pokusu o získání původního znění věty s použitím hodnoty z atributu words jako počtu tokenů dostaneme chybný výsledek: Nevím, co co s tím. Zřejmě jediným správným řešením při zachování nepárového atributu corr v jeho nynější podobě je do atributu words neukládat nikoliv počet slov, ale počet tokenů již při opravě. Pokud bychom chtěli získat počet tokenů ze značky až při ukládání textu do korpusu, narazili bychom na neřešitelný problém. Bohužel ale ani definice tokenu není v lingvistice jednotná, naštěstí však existují nástroje pro tokenizaci, které tento problém mohou vyřešit tím, že se použijí jak při tokenizování textu pro korpus, tak i při práci s textem vně korpusu. 1.4 Univerzální tokenizer Jedním z nástrojů, které za účelem sjednocení tokenizace na naší fakultě vznikly, je skript unitok.py (universal tokeniser), vytvořený RNDr. Janem Pomikálkem za pomocí skriptovacího jazyka Python. Tento skript se plánuje do budoucna používat k veškeré potřebné tokenizaci textů. Prozatím obsahuje specifická data a je připraven pro tokenizaci šesti světových jazyků. Bohužel mezi ně prozatím nepatří čeština. Data pro češtinu budou přidána ve velmi krátké době a tento univerzální tokenzizer bude kompletně připraven na tokenizaci i česky psaných textů. 7
1. Korpus Chyby Je tedy velmi vhodné tento skript použít všude tam, kde je vyžadována práce s textem a korpusy. Není tomu jinak v novém korekturním nástroji, který počítá právě hodnotu atributu words pomocí skriptu unitok.py, který do budoucna bude na fakultě téměř bez výjimek nasazen. 1.5 Nepárovost značky corr Všechny výše uvedené problémy s atributem words a jeho významem by nevznikly, pokud by tag corr nebyl nepárový. Tuto nepříliš hezkou vlastnost získal díky nutnosti značkovat překrývající se chyby. Ty nejdou za pomocí obyčejných párových XML elementů vyznačit. Příkladu překrývajícího se značení párovými značkami: Lorem <corr>isum dolor <corr> sit<corr/>amet.</corr> Jak vidíme na příkladu místo překrývajících se elementů by vznikl zanořený element. Tento problém není jinak vhodně řešitelný, než je použití nepárové značky s atributem words. Jistým zlepšením by možná přinesl nový atribut new, v kterém by se uchovala hodnota nového textu opravy. Tím by se odstranily problémy s nejasnou definicí slova. Řetězec by jasně vyznačil, jaké části textu se chyba týká, na druhou stranu by do textu vnášel značnou redundanci. Jelikož komplikace, které nastanou při použití nepárové značky, navíc ještě s nejasně definovaným atributem words, jsou nemalé. Stojí za zvážení, zda-li je tento jev překrývajících se chyb tak častý, že je přínosné značkovat tyto situace. Souvisí to také s návrhem klasifikace chyb a způsobem vyznačování chyb. 1.6 Zanesení značky do dokumentu Programy WinCorr a CorrMacros zanášely značku corr do dokumentu tak, aby nebyla při běžném prohlížení dokumentu vidět, ale zároveň se dala z dokumentu získat. Dělaly to pomocí vnitřních komentářů dokumentu. Text z komentářů šel získat jen pomocí OpenOffice.org, pokud jsme učinili export do HTML. Navíc se někteří domnívají, že to není standardní požadovaná funkce prováděného exportu a mohlo by dojít ke zrušení této vlastnosti exportu. V návrhu nového rozšíření jsem se proto této variantě snažil vyhnout a přišel s novou metodou. Moderní formáty textových dokumentů obsahují definice stylů dokumentu a také umožňují naformátovat text jako skrytý. Tyto 8
1. Korpus Chyby dvě vlastnosti se sloučily a vznikl tak následující způsob zanesení značky do dokumentu. Na začátku práce s dokumentem se vytvoří nové znakové styly dokumentu: OOCorr mistake zelená barva textu OOCorr mistake tag formát textu je nastaven na skrytý, OOCorr mistake obscure nemá žádné vlastní vlastnosti (tento styl je zatím nevyužitý). Při zanášení chyby do dokumentu se značka corr označí stylem OOCorr mistake tag a nově zanesený steylem textu OOCorr mistake. Značka je tak zanesena do textu jako standardní text, který se považuje za netisknutelné znaky. Díky tomu si můžeme zobrazit značky přímo v dokumentu po stisknutí tlačítka pro zobrazení netisknutelných znaků, obr. 1.1. Obrázek 1.1: Tlačítko zobrazit netisknutelné znaky Kompletní text včetně značek lze jednoduše získat změnou vlastnosti skryté stylu OOCorr mistake tag na hodnotu false. Další možností je i export do HTML, v kterém se takto skrytý text objeví. 9
Kapitola 2 Klasifikace chyb Doposud se klasifikovalo tak, jak je uvedeno v [4], existují kategorie klasifikace chyb, do kterých spadají samostatné chyby. Těchto kategorií je dohromady šest, včetně kategorie nezařazeno pro chybu, která nevyhovuje žádné jiné kategorii. Samotných druhů je 29 (opět včetně klasifikace nezařazeno, která je v každé kategorii právě jedna). Takový systém klasifikace je ovšem jednak složitý pro značkování studenty a pro účely korpusu zbytečný, proto už v samotném zadání práce je požadavek na oddělený popisovací soubor klasifikace chyb, který nebude pevně zabudován do rozšíření. 2.1 Obtížnost značkování studenty Jelikož kvalita korpusu Chyby úzce závisí na kvalitě odvedené práce studenty předmětu VB000, jsou snahy, aby studenti měli snadnou práci a mohli ji dělat efektivně vzhledem k přesnosti klasifikování chyby. Velkým problémem právě v minulých letech byla vykonaná práce, kde většina chyb nebyla jinak určena než jako nezařazená. Souviselo to také s odevzdáním označkovaných textů, které nebyly důkladně kontrolovány a studenti toho zneužívali. U studentů se předpokládá znalost pravidel českého jazyka na úrovní střední školy, a tak s přesným určením druhu chyby by neměl být problém. Bohužel studenti to vidí jako ztrátu času a mají snahu si práci co nejvíce ulehčit. Proto jsou některé chyby špatně označeny, popřípadě nejsou označeny vůbec. Nově vzniklá klasifikace chyb by se měla právě snažit co nejvíce usnadnit tuto práci. S vytvořením klasifikace se však vážou další otázky. 2.2 Rozsah vyznačování textu pro opravu chyby Jednou z otázek při tvorbě klasifikace také je, jak velký má být rozsah vyznačeného textu, který se opravuje. Tato otázka je zásadní a byla zásadní i při implementaci. Nastávají dva případy, jak chybu označit: 10
2. Klasifikace chyb 1. označit příčinu chyby spolu s chybnou částí, 2. označit chybný text, 3. označit nejmenší možnou chybnou část. 2.2.1 Označení chybného textu spolu s příčinou Ukázka: Vládní informace, jenž jsou součástí tajného dokumentu. Jak vidíme v ukázce, nejen že označíme chybné zájmeno jenž, ale chyba začíná již u podstatného jména informace, které je příčinou způsobené chyby a použití špatného zájmena. Tento způsob by byl ideální, jelikož bychom mohli zaznamenat, proč nastala chyba, a byla by tak jednoznačně opravitelná, pokud bychom ji vyjmuli z textu. Tento případ nastává, pokud chceme čerpat z korpusu Chyby jednotlivé chybné úseky textů pro tvoření odpovědníků k procvičování gramatiky. Ukázka: Děti si hrály na hřišti před domem. Jakmile přišla bouřka, běželi se schovat pod střechu. V ukázce je vidět, že jméno děti je v předchozí větě dříve než přísudek běželi. Toto je pouze jednoduchý případ, jméno, na které se váže přísudek, by mohlo být i o mnoho dále v textu než přísudek. Takové označení by bylo velmi nežádoucí, protože by značkování bylo zmatečné a vznikalo by velké množství zanořených chyb. V případě tvorby odpovědníku by ale nenastal případ, kdy bychom z korpusu získali chybnou větu: Jakmile přišla bouřka, běželi se schovat pod střechu., která je takto samostatně zjevně správná. 2.2.2 Označení jen chybného textu Ukázka: Vládní informace, jenž jsou součástí tajného dokumentu. Tato varianta je zcela zavrhnuta. Aby mělo označování smysl a mohl se chybný text z korpusu rekonstruovat, je potřeba označovat chybu nejméně po celých tokenech. 11
2. Klasifikace chyb 2.2.3 Označení nejmenší možné chybné části Nejmenší možnou částí je zde jeden token, pokud chyba není typu chybějících slov, resp. tokenů. Ukázka: Vládní informace, jenž jsou součástí tajného dokumentu. Takto vyznačený text se dá z korpusu rekonstruovat. Při vytváření odpovědníků ve většině případů ani nenastane situace, kdy by oprava nebyla jednoznačná, jelikož se z korpusu dolují textové celky pro procvičování po větách. Ovšem komplikace pak nastávají, pokud chceme z korpusu získat věty pro procvičení shody přísudku s podmětem ap., jak bylo naznačeno výše. S problémem, zda a jak se budou chyby zanořovat, úzce souvisí otázka, zda je žádoucí vyznačovat také chyby stylistické. 2.3 Stylistické chyby Texty, které odevzdávají studenti předmětu VB000, obsahují velké množství stylistických chyb a zřídkakdy je odevzdaná práce oproštěna od těchto chyb. Tyto chyby mají dvě záporné vlastnosti: jsou těžce definovatelné a bývají rozsáhlé. Dlouhý úsek textu, který je nově zanesen do práce, se často neobejde bez přítomnosti nových chyb. Dále pak dlouhý opravovaný úsek přináší problémy kvůli zanořeným chybám. Otázkou je, zda se tyto chyby mají vyznačovat. Vyznačené stylistické chyby v korpusu slouží zejména ke statistickým účelům a mohly by posloužit k vytvoření vzorových příkladů špatné stylistiky pro studijní účely. Další využití jako je tvorba elektronických cvičení, není možná, protože oprava těchto chyb je nejednoznačná. Jiné budoucí využití zatím není zřejmé, ale dá se předpokládat, že nějaké využití se najde. Při návrhu nové klasifikace tedy doporučuji otevřenou diskuzi na toto téma. 12
Kapitola 3 Implementace Implementace korekturního rozšíření pro kancelářský balík OpenOffice.org (OOo) a jeho textový procesor Writer probíhala za chodu a průběžně byly diskutovány různé vlastnosti a odlišnosti od předchozích nástrojů a vyřešení jejich chyb. Vůbec prvním krokem bylo rozhodnutí o tvorbě rozšíření pro OOo namísto zcela nezávislého desktopového programu. O této variantě se uvažovalo již dříve kvůli široké podpoře textových dokumentů. Tím by se situace jednoduše vyřešila, avšak zůstal jeden formát, pro který toto neplatí. Tímto formátem je zdrojový text TEXu, proč tomu tak je, se dozvíte dále. Druhou výhodou výběru OOo je jeho použitelnost na různých operačních systémech a nakonec, jak už název napovídá, jde o open source projekt. Pro implementaci byl zvolen programovací jazyk Java, který OOo podporuje ze všech jazyků nejlépe, díky čemuž vývojáři nejčastěji v tomto jazyce programují svá rozšíření. Další výhodou byly diskuze vedené k vývoji s programy převážně v Javě. Druhým nejčastějším pak na diskuzích byl zmiňován Basic, z kterého nebylo snadné čerpat vyhovující informace díky odlišnému zacházení s objekty v OOo. Jazyk Python, který byl doporučován mnoha kolegy z fakulty sice OOo podporuje, nemá však tak velkou komunitu vývojářů a v neposlední řadě to byly mizivé zkušenosti s tímto jazykem z mé strany. I přes toto se vývoj OOCorru protáhl, protože nastaly situace, které zabraly hodně času a bylo nezbytné vyřešit je, aby mohl další vývoj pokračovat. 3.1 OpenOffice.org API Plugin Vývoj v Javě je podporován až do té míry, že existuje rozšíření pro IDE 1 Netbeans pro vytváření jak rozšíření pro OOo, tak i klientů, kteří používají OOo API 2. Toto rozšíření je dostupné z oficiálních stránek Netbeans i přímo přes správce rozšíření Netbeans. Použití této kombinace Javy, Netbeans a rošíření OpenOffice.org API Plugin ušetřilo velmi mnoho práce. Pro úplnost 1. integrated development environment Vývojové prostředí 2. application programming interface rozhraní pro programování aplikací 13
3. Implementace je rozšíření pro vývojáře OOo dostupné i pro vývojářské prostředí Eclipse. Za pomocí OpenOffice.org API Plugin byla vygenerována struktura rozšíření, bylo připraveno celé vybudování konečného balíku a dokonce byl dostupný jednoduché ladění projektu i když toto rozšíření je zatím v beta verzi. Při tvorbě nového projektu se za pomocí průvodce vytvoří nástrojová lišta i menu pro OOo. Tyto prvky se definují pomocí souboru Addons.xml Průvodce je připravený i na internacionalizaci, bohužel ne zcela funkční. Do souboru Addons.xml je sice zanesena informace o dalších jazycích, ale nepojmenují se prvky, jak mají. Jelikož bylo v plánu rozšíření udělat nejméně dvojjazyčně (angličina, čestina), byl nutný manuální zásah do XML souboru. Addons.xml obsahuje i definici ikon k položkám menu a nástrojové lišty. V pokročilé fázi vývoje bylo však nutné přidat novou položku menu. Tento úkon musel být proveden opět celý manuálně, včetně zasažení i do dalších souborů, jelikož OpenOffice.org.API Plugin si s tím již nedokázal poradit. Rozšíření pro Netbeans dále vytvořilo centrální registrační třídu CentralRegistrationClass.java, která je nezbytná pro vytvoření rozšíření a do které není nutné nijak zasahovat, hlavní třídu projektu, která nese stejný název jako projekt a z které se řídí všechny události vyvolané z OOo. Nakonec pak všechny Ant skripty pro vybudování, vyčištění a odladění projektu, popis rozšíření a přidělení licence. 3.2 Ikony Prvním úkolem bylo vytvořit ikony menu. Uchýlil jsem se k řešení použít ikony Nuvola licencované pod GNU LGPL licencí. Byl vybrán motiv s knihou. Kombinacemi s dalšími ikony vzniklo celkem intuitivní ovládání. Ikona se zeleným symbolem fajfky pro opravu textu 3.1, ikona s červeným křížkem pro zručení opravy 3.2, ikona s modrou tužkou pro úpravu opravy 3.3 a ikona s červenozeleným symbolem vypnutí/zapnutí pro inicializaci a vypnutí OOCorru 3.4. Obrázek 3.1: Ikona tlačítka opravit chybu 14
3. Implementace Obrázek 3.2: Ikona tlačítka zrušit opravu Obrázek 3.3: Ikona tlačítka editovat opravu 3.3 Klasifikace chyb Před dalším pokračováním bylo potřeba vytvořit definiční soubor s klasifikací chyb, aby se dala klasifikace uchovávat a udržovat vně celého balíčku rozšíření a nemuselo docházet při změnách k zasahování dovnitř programu. Pro tento účel bylo jednoznačně vhodné zvolit XML formát. Klasifikace tak vznikla na základě popisu chyb v [2], včetně popisu jednotlivých chyb. Současně s návrhem bylo vytvořeno Scheme 3 pro validaci XML souboru. Návrh počítá se stromovou strukturou klasifikace chyb. Každý typ chyby musí být zařazen do jedné kategorie a kategorie se dále mohou vnořovat do sebe. Ve Scheme toho bylo dosazeno rekurzivní definicí elementu kategorie. Element samotné chyby mistake má definovány 4 atributy: errtype jeho hodnota je pak shodná se zanesenou hodnotou do značky corr stejnojmenného atributu, name název chyby, words předpokládaný počet označených tokenů při vyznačování chyby, length předpokládaný počet znaků při vyznačování chyby. Poslední dva jmenované atributy by do budoucna mohly posloužit pro striktnější kontrolu vyznačení chyb v textu, jsou nepovinné a jejich použití závisí na rozhodnutí vývojáře nové klasifikace chyb. Nevhodným použitím, nebo nedomyšlením všech možností, jak daná chyba daného typu může v text vzniknout, může vést k nepoužitelnosti ve vyznačování této chyby ve všech 3. jazyk popisující strukturu a omezení obsahu XML dokumentů 15
3. Implementace Obrázek 3.4: Ikona tlačítka vypnout/zapnout OOCorr případech. Samotné rozšíření zatím ani tuto kontrolu nijak neprovádí. Nebylo rozhodnuto, zda pouze upozorňovat na nevhodné vyznačení chyby s tím, že oprava bude možná, nebo zcela zakázat opravu špatně vyznačené chyby podle těchto atributů. V prvním případě bychom si nemuseli nijak pomoci před nevhodným vyznačením chyby, jelikož uživatel často nebere zřetel na upozornění, která ho více než vyskakující tabulkou s upozorněním neomezí. V druhém případě by musela definice atributů words či length naprosto přesná, abychom mohli správně vyznačit všechny chyby. Element chyby a kategorie (mistake a category) mají nepovinného potomka description, jehož obsahem je popisem chyby či kategorie. Textový obsah je směs (typ mixed) textu a dvou bez HTML elementů, prázdného br a elementu strong s textovým obsahem. Funkci pak v rozšíření mají stejnou jako v HTML, br zalamuje řádek a strong zvýrazňuje text. Tím je dosaženo přehledného formátování v nápovědě pro chybu, obrázek 3.7. Následně byl vytvořen XML soubor s klasifikací chyb, který odpovídá klasifikaci v [2] s použitím příkladů z [1] a zanořenou kategorií chyba v interpunkci podle vzoru z programu WinCorr a [1]. Soubor s klasifikací chyb se musí umístit do adresáře program v adresáři s nainstalovaným OpenOffice.org typicky pro OpenOffice.org verze 3 v systému Microsoft Windows C:\Program Files\OpenOffice.org 3\program\ a v Unix systémech /usr/lib lib64/openoffice/program/. Později byly vytvořeny i možnosti nastavení OOCorru, kde lze nastavit vlastní umístění souboru s klasifikací. XML soubor s klasifikací se v aplikaci načítá a parsuje pomocí analyzátoru SAX a vytváří se z něj datový model pro Swingovou komponentu JTree, která byla zvolena jako vhodná reprezentace stromové struktury klasifikace chyb, obrázek 3.6. Při každém načítání XML souboru se ověřuje, zda je validní vůči přidruženému Scheme a je tedy možné ho správně zpracovat. Vytvoření zanořených kategorií z popisovacího souboru do modelu obstarává rekurzivní funkce 3.1. Zdrojový kód 3.1: funkce maketreenodes() private void maketreenodes ( NodeList rootnodes, DefaultMutableTreeNode parent ) { 16
3. Implementace Obrázek 3.5: Návrh klasifikačního souboru chyb // pruchod danymi uzly for ( int i = 0; i < rootnodes. getlength (); i ++) { // ziskani uzlu prochazeneho uzlu Node node = rootnodes. item ( i); // pokud je uzel kategorie, pokracuj rekurzivne 17
3. Implementace Obrázek 3.6: GUI Vytvoření opravy if ( node. getnodename (). equals (" category ")) { //... // ulozeni do datoveho modelu maketreenodes ( node. getchildnodes (), tncat ); } // pokud je uzel element chyby, vyparsuj informace if ( node. getnodename (). equals (" mistake ")) { //... // ulozeni do datoveho modelu } } } Dále je implementována nápověda ke každému listu stromu, tedy ke každé chybě ve formě tooltipu za pomocí třídy TreeTooltipRender, která rozšiřuje třídu javax.swing.tree.defaulttreecellrenderer. Díky tomu je definován tooltip ke každému listu komponenty JTree a zároveň je zformátován jako HTML, funguje tedy řádkování pomocí elementu br a zvýraznění textu pomocí strong standardně tučným řezem písma, obrázek 3.7 18
3. Implementace Obrázek 3.7: GUI Vytvoření opravy, ToolTip 3.4 Grafické uživatelské rozhraní 3.4.1 Rozhraní v OpenOffice.org Rozhraní, přes které se přistupuje k funkcím rozšíření OOCorr, je vyobrazeno na obrázku 3.8, jedná se o nástrojovou lištu a menu OOCorr přímo v řádkovém menu. Toto menu obsahuje navíc položku nastavení oproti nástrojové liště. Lišta se chová jako každá jiná lišta v OOo a lze ji tedy umístit a připnout k jiným lištám, jak nám to vyhovuje. Jak bylo uvedeno výše, toto rozhraní je definováno v popisovacím souboru Addons.xml, který bohužel obsahuje jednu vadu (bug), resp. načtení souboru OOo je chybné nástrojovou lištu nelze pojmenovat. I když je správně uvedeno jméno 3.2, které se má přiřadit nadpisu lišty, nastavení se neprojeví. Místo zvoleného nadpisu se lišta pojmenuje Přídavek [číslo rozšíření], v anglickém prostředí pak Add-on [číslo rozšíření], jak můžeme vidět na 3.8. Zdrojový kód 3.2: Addons.xml - OfficeToolBar definice titulku <!--... --> <node oor : name =" OfficeToolBar "> <node oor : name ="cz. muni.fi.nlp. oocorr. oocorr " 19
3. Implementace Obrázek 3.8: OpenOffice.org s nainstalovaným rozšířením OOCorr oor :op=" replace "> <prop oor : name =" Title " oor : type ="xs: string "> <value > OOCorr </ value > </prop > <!--... --> 3.4.2 Okno pro opravu chyby, třída MakeCorrectionPanel Již jsme viděli v předchozí části (obrázky 3.6 a 3.7 nejdůležitější okno OOCorru určené pro opravu chyby. Okno je klasická komponenta Swingu třídy JFrame. V ní jsou umístěny komponenty JTree pro výběr typu chyby, JEditorPane pro vložení opraveného textu, JComboBox pro výběr způsobu zanesení chyby a nakonec tlačítka JButton pro zrušení a zanesení opravy spolu se značkou. 3.5 Napojení na OpenOffice.org API Díky rozšíření OpenOffice.org API Plugin pro Netbeans bylo napojení Java programu s OpenOffice.org celkem snadné. Rozšíření vygenerovalo všechen potřebný kód i třídu OOCorr, která obsahuje metodu 3.3 volající uživatelský kód po stisknutí nadefinovaných ovládacích prvků v Addons.xml. 20
3. Implementace Zdrojový kód 3.3: Dispatch obsluha událostí prvků z Addons.xml public void dispatch ( com. sun. star. util. URL aurl, com. sun. star. beans. PropertyValue [] aarguments ) { if ( aurl. Protocol. compareto (" cz. muni.fi.nlp. oocorr. oocorr :") == 0) { if ( aurl. Path. compareto (" makecorrection ") == 0) { // User code return ; } //... } } Dále třída poskytuje rozhraní XComponentContext, z kterého se volají všechny potřebné objekty pro práci s OpenOffice.org. Schematická interakce objektů a tříd je zobrazena na diagramu 3.9. 3.6 Tokenizér a Jython Jak již bylo popsáno výše, k počítání hodnoty atributu words se používá skript unitok.py napsaný v jazyce Python. Bylo tak potřeba použít tento skript z jazyka Java. Vhodně k tomu posloužil Jython, javový interpret jazyka Python. Se zprovozněním Jythonu a unitok.py nastaly problémy. Po klasickém přidání jar balíčku Jythonu do OOCorru se vše zdálo, že je na dobré cestě. Avšak se spuštěním skriptu unitok.py, který využívá moduly regulárních výrazů, nastaly problémy. Jython totiž neobsahuje standardně tyto moduly při zabudování do aplikací a je třeba tyto moduly distribuovat společně s Jythonem. Zde se vývoj celého rozšíření na delší dobu pozastavil, než bylo navrženo vhodné řešení. Po zásahu do XML souborů popisujících budování OpenOffice.org rozšíření se moduly distribuují v rámci balíčku rozšíření v adresáři jythonlib. Poté se při spouštění Jythonu načítají z tohoto umístění. Bohužel, nebyl to poslední problém s Jythonem, v průběhu práce s ním, při zpětném parsování textu, nevracel v řetězcích tokenů znak u. Řešení nakonec bylo nalezeno, ale je velmi nevhodné, naneštěstí je prozatím jediné. Musel být proveden malý zásah do samotného skriptu unitok.py, odstranění prefixového znaku r u třech řetězců 3.4. Na výsledek tokenizace by tato změna neměla mít žádný efekt. Chyba je v odlišné nebo špatné implementaci Jythonu. V nové verzi Jythonu tento nešvar bohužel zatím přetrvává a bude tedy nutné s novou verzí unitok.py provést opět tuto korekci pro Jython. 21
3. Implementace Obrázek 3.9: Interakce objektů a tříd Zdrojový kód 3.4: unitok.py změněné prefixy řetězců CONTROL_CHAR = u"[\ u0000 \ u0001 \ u0002 \ u0003 " \ u"\ u0004 \ u0005 \ u0006 \ u0007 \ u0008 " \ u"\ u000b \ u000c \ u000d \ u000e \ u000f " \ u"\ u0010 \ u0011 \ u0012 \ u0013 \ u0014 " \ u"\ u0015 \ u0016 \ u0017 \ u0018 \ u0019 " \ u" \ u001a \ u001b \ u001c " \ u"\ u001d \ u001e \ u001f ]" SPACE = u"[\ u00a0 \ u1680 \ u180e \ u2000 " \ u"\ u2001 \ u2002 \ u2003 \ u2004 \ u2005 \ u2006 " \ u"\ u2007 \ u2008 \ u2009 \ u200a " \ u"\ u202f \ u205f \ u3000 ]" HTMLENTITY = u" &(?:# x?[0-9]+ \ w +); " 22
3. Implementace 3.7 Značkování zdrojových souborů TEXu OOCorr bohužel nepřínáší možnost pohodlného značkování zdrojových souborů TEXu, nicméně je na to připraven. Jak je vidět z diagramu 3.9, konečné vložení značky do dokumentu vyvolává objekt MakeCorrectionPanel voláním metod objektu typu Document. Document je však rozhraním pro třídy typů dokumentů, kde je nutné zanést značku odlišným způsobem. Zatím jsou implementovány dokumenty nazvané hromadně kancelářské dokumenty (třída OfficeDocument), jsou to ty, které používají nejznámější kancelářské balíky. U zdrojových souborů TEXu to není však zcela tento problém. Hlavním je počítání tokenů označeného textu, jelikož nelze bez překladu určit počet tokenů. Ukázka zdrojového souboru TEXu bez možnosti spočítat tokeny: \uv{ ahoj } Jedním z řešení by bylo nechat opravujícího přepsat i výslednou podobu textu po překladu, aby se z tohoto textu spočítal počet tokenů. Žádné řešení značkování TEXu zatím nebylo diskutováno. Jelikož je tento formát pro odevzdání prací předmětu VB000 doporučován, doporučuji diskuzi nad rozšířením pro TEX. 23
Kapitola 4 Instalace a použití 4.1 Instalace OOCorr Rozšíření je distribuováno ve formě balíčku rozšíření, který má název OO- Corr.oxt, a souboru s klasifikací chyb MistakeClasification.xml. Samotný balíček se nainstaluje pomocí Správce rozšíření OpenOffice.org, který nalezneme v menu Nástroje. Soubor s klasifikací chyb se musí umístit do adresáře program v adresáři s nainstalovaným OpenOffice.org typicky pro OpenOffice.org verze 3 v systému Microsoft Windows C:\Program Files\OpenOffice.org 3\program\ a v Unix systémech /usr/lib lib64/openoffice/program/. Pokud to není možné, lze po instalaci balíčku OOCorru nastavit cestu k souboru s klasifikací v nastavení OOCorru. Aktuální verze spolu s klasifikací chyb bude dostupná na webových stránkách projektu: http://nlp.fi.muni.cz/projekty/oocorr/ 4.2 Práce s OOCorrem Uživatel si otevře svou práci k opravě v textovém procesoru OpenOffice.org Writer. Poté nejlépe spustí OOCorr tlačítkem Zapnout/Vypnout (obr. 3.4), čímž se inicializuje OOCorr. Pokud tento krok neprovede, inicializace se provede i po kliknutí na všechny ostatní ovládací prvky OOCorru. 4.2.1 Zanesení opravy Zanesení opravy se provádí v pěti krocích: 1. označení chyby přímo v textovém procesoru, 2. spuštění opravy 3.6 tlačítkem opravit chybu, obr. 3.1 3. klasifikace chyby 4. vyplnění opraveného textu 5. výběr typu opravy a potvrzení formuláře 24
4. Instalace a použití Označení chyby Označením chyby se myslí vyznačení textu pomocí myši. Tento úkon je velice důležitý, aby bylo dosaženo zamýšleného výsledku. Program WinCorr řešil nevhodné vyznačování textu pouze varováním, opravu však povolil. Tím se dalo dosáhnout naprosto nechtěných zanesení značky například doprostřed slova. Toto OOCorr ošetřuje a zcela striktně vyžaduje buď prázdný výběr, nebo po celých tokenech. Textový celek je zde považován za token ve smyslu tokenu podle skriptu unitok.py. Prázdný výběr je povolen kvůli možnosti přidávání nového textu. V případě výběru pouze části tokenu je celý token nalezen a vybrán automaticky. Uživatel by však měl správně vybírat text po celých tokenech a určit si tak jednoznačně, jaký textový celek se chystá opravit. Oprava vnořených a překrývajících se chyb Vnořené chyby a překrývající se chyby je možné opravit, pouze pokud dodržíme postup označování chyb znázorněný na diagramech 4.1 a 4.2 v posloupnosti očíslovaní chyb. Tento postup je vyžadován ze dvou důvodů. Za prvé nechceme, aby se značka corr dostala do atributu old jiné znčky, čímž bychom ji skryli před prací s korpusem v korpusovém manažeru Manatee. A za druhé, pokud bychom striktně nedovolili pouze jeden způsob vyznačení, nemuseli bychom rozeznat správně opravený text dle atributu words, jelikož tokeny, které jsme před opravou druhé chyby spočítali, si nemusí odpovídat. Získáme tak dvě možnosti získání původního textu. Obrázek 4.1: Označování vnořených chyb Obrázek 4.2: Označování překrývajících se chyb 25
Kapitola 5 Závěr Korekturní nástroj, který vznikl v této práci, se snažil o opravu chyb a, které obsahovaly předešlé programy a vylepšení vlastností značky corr, která je zanášena do dokumentů. Nyní je také zajištěna velká podpora běžných formátů a použitelnost na různých operačních systémech, díky kombinaci multiplatformního kancelářského balíku OpenOffice.org s použitím jazka Java pro vývoj aplikace. Rozšíření bude dále nutné upravovat podle aktuálních potřeb vyučování a pedagogů. 26
Seznam zdrojových kódů 3.1 funkce maketreenodes()..................... 16 3.2 Addons.xml - OfficeToolBar definice titulku.......... 19 3.3 Dispatch obsluha událostí prvků z Addons.xml....... 21 3.4 unitok.py změněné prefixy řetězců.............. 22 27
Literatura [1] Klasifikace chyb projektu korpus chyb. https://nlp.fi.muni.cz/projekty/korpuschyb/klasifikace.html. [2] Bušta Jan, Jakubíček Miloš. Building of corpus based e-learning materials for czech. In Michal Sojka, Petr Bulant, editor, Sborník páteho ročníku konference o e-learningu, Brno, 2009. Masarykova univerzita, SCO 2009. [3] Karel Pala. Informační technologie a korpusová lingvistika (1). Zpravodaj ÚVT MU, VI(3):8 11, 1 1996. [4] Pavel Smrž, Pavel Pala, Karel Rychlý. Text corpus with errors. In Text, Speech and Dialogue: Sixth International Conference, TSD 2003, pages 90 97, Berlin: Springer Verlag, 2003. [5] Götz Schmidt, Jürgen Wohlberg. Openoffice.org developer s guide, 2009. 28