Tlu



TALLINNA ?LIKOOLI HAAPSALU KOLLED?RakendusinformaatikaSiim MedijainenEESTI VAHEKEELE KORPUSE TEKSTIDE M?RGENDUSMOODULI ARENDAMINEDiplomit??Juhendajad: Jaagup Kippar,Erika MatsakHaapsalu 2011Sisukord TOC \o "1-3" \h \z \u Sissejuhatus PAGEREF _Toc292171247 \h 31Keelekorpused, nende eesm?rk ja kasutamine PAGEREF _Toc292171248 \h 42Olemasolev m?rgendamine PAGEREF _Toc292171249 \h 62.1Eelised PAGEREF _Toc292171250 \h 72.2Puudused PAGEREF _Toc292171251 \h 73Korpuse m?rgendamisega seotud osa tehniline struktuur PAGEREF _Toc292171252 \h 83.1Vealiikide salvestamine PAGEREF _Toc292171253 \h 83.2Xpathi kasutamine m?rgendite asukoha salvestamisel PAGEREF _Toc292171254 \h 93.3Vigade n?itamine PAGEREF _Toc292171255 \h 103.4Vajalikud t?iendused ja nende eesm?rgid. PAGEREF _Toc292171256 \h 124Eesti vahekeele korpuse testkeskkonna loomine PAGEREF _Toc292171257 \h 134.1Platvormi spetsifikatsioon PAGEREF _Toc292171258 \h 134.2Kasutatud tarkvara PAGEREF _Toc292171259 \h 144.3Zope platvormi kirjeldus PAGEREF _Toc292171260 \h 144.4PostgreSQL andmebaas PAGEREF _Toc292171261 \h 154.5Javascript veebiarenduses PAGEREF _Toc292171262 \h 154.6Javascripti raamistikud PAGEREF _Toc292171263 \h 155Muudatuste tehniline kirjeldus PAGEREF _Toc292171264 \h 176Edasiarendusv?imalused PAGEREF _Toc292171265 \h 267Tekstimudelid PAGEREF _Toc292171266 \h 277.1?ldistatud m?rgendus PAGEREF _Toc292171267 \h 277.2TEI m?rgendus PAGEREF _Toc292171268 \h 27Kokkuv?te PAGEREF _Toc292171269 \h 29Kasutatud allikad PAGEREF _Toc292171270 \h 30Lisa 1. Document.py t?iendused PAGEREF _Toc292171271 \h 31Lisa 2. document_view.pt t?iendused PAGEREF _Toc292171272 \h 32Lisa 3. document_view.js t?iendused PAGEREF _Toc292171273 \h 33Lisa 4. xpath_evaluator.js t?iENdused PAGEREF _Toc292171274 \h 42SissejuhatusDiplomit?? teema valikul tuginesin juhendaja soovitustele, kes on varem tegelenud Eesti vahekeele korpuse tarkvara arendusega. Samuti on teema valik tingitud minu üldisest huvist veebip?hise tarkvara arendamise ja programmeerimise vastu. M??ravaks sai ka konkreetne vajadus antud lahenduse j?rele.K?esoleva diplomit?? eesm?rkideks on anda ülevaade keelekorpustest ja nende kasutamisest ning tutvustada Eesti vahekeele korpuse m?rgendusmooduli t??p?him?tet. Tuua esile positiivseid ja negatiivseid külgi olemasoleva süsteemi juures ning t?iustada kasutajaliidese funktsionaalsust.Eesm?rgist l?htuvalt on ülesandeks luua testkeskkond, mis j?ljendaks v?imalikult t?pselt Eesti vahekeele korpust. Parandada korpuse kasutajaliidese funktsionaalsust, vastavalt etteantud spetsifikatsoonile ning kirjeldada tehtud muudatusi. Kirjeldada edaspidiseid vajalikke parandusi ning edasiarendusv?imalusi. T?? meetodiks on praktilise lahenduse loomine Eesti vahekeele korpuse tekstide m?rgendusmooduli edasiarenduse n?ol.T?? koosneb keelekorpuste üldisest kirjeldusest ning kasutusvaldkondadest, hetkeolukorra kirjeldusest Eesti vahekeele korpuse m?rgendusmooduli juures, planeeritavate muutuste kirjeldusest, teostatud muutuste tehnilisest spetsifikatsioonist ning v?imalike edasiarenduste loetelust.Keelekorpused, nende eesm?rk ja kasutamineKorpuseks nimetatakse elektroonilist keeleandmekogu, kuhu on valitud tekstid nii, et need annaksid keelest t?ep?rase pildi. Esimesed korpused hakkasid tekkima juba 19nda sajandi teisel poolel, seoses infotehnoloogia kiire arenguga viimastel aastakümnetel on keelekorpuste kasutamine intensiivistunud. Tekstikorpus on tekstide kogum, mida iseloomustavad j?rgmised tunnused:korpus on koostatud kindlatel eesm?rkidelkorpus on koostatud kindlate printsiipide aluseleesm?rgiga iseloomustada keele mingit seisundit v?i variantion l?pliku suurusega kogum arvutiga t??deldavaid tekste.Korpuste lootegemisel tuleb teha valik ühiskonnas ringlevate tekstide hulgast. L?htekohtadeks saab olla kas mingi teoreetiline hüpotees, allkeel v?i keelev?lised kriteeriumid (Hennoste 2001 : 185).Vahekeele ehk ?ppijakeelekorpus on autentsete v??rkeele tekstide elektrooniline kogu, mis on koostatud vastvalt eksplitsiitsetele disainip?him?tetele ja teise keele ?ppimise/?petamise eesm?rkidest l?htuvalt. Korpuse materjalid on kodeeritud, standardiseeritud ja homogeensel viisil dokumenteeritud olenevalt l?htekohast ja p?ritolust (Granger 2002 : 3-33 ) Korpused on muutunud asendamatuks nii keeleteaduses, leksikograafias kui ka automaatsete keelet??tlusvahendite v?ljat??tamisel. On tekkinud uus rakenduslingvistika haru - korpuslingvistika. Korpusuuringud ongu juba viinud t?iesti uue arusaamani keelest: s?navara ja grammatika ei ole kaks eraldiseisvat vaid omavahel lahutamatult seotud tekstiloome osa.(Kitsnik 2003 : 93-107)?ppijakeelekorpus (learner corpus, learner corpora) kuulub kaasaegsete elektrooniliste keeleressursside alla. Sylviane Grangeri m??ratluse kohaselt on paralleelselt ?ppijakeelekorpuse m?istega kasutusel terminid vahekeelekorpus (interlanguage corporusa) ja teise keele korpus (L2 corporusa). Tegemist on teise keele / v??rkeele?ppija loodud autentsete kirjalike tekstide v?i suulise k?nekeele n?idete elektroonilise koguga, milles keelevead on m?rgendatud ja klassifitseeritud. Korpuse t??tlemisel saab kasutada vastavat lingvistilist standardtarkvara, korpusuuringutele tuginevad oma t??s teise keele / v??rkeele ?petamise spetsialistid (Granger 2003: 465). ?ppijakeele v?rdlemine autentse kirjakeelega t?lke- ja paralleelkorpuste andmeid kaasates v?ib anda üllatavaid tulemusi, mis osutavad alles kujunema hakkavatele n?htustele ja uutele arengutele sihtkeele grammatikas v?i leksikaalgrammatilises perifeerias (Eslon 2007 : 88).Olemasolev m?rgendamineKuna tegemist on vahe- ehk ?ppijakeelekorpusega, esineb selles suurel hulgal tekste, mille autorite emakeel ei ole eesti keel. Vahekeele korpuse tekstid m?rgendatakse k?ikv?imalike keelevigade suhtes, ning vead t?lgendatakse omakorda lingvistiliselt. Ka on v?imalik salvestada infot keelevigade ning teksti autori soo, vanuse, emakeele, p?ritolu ning eesti keele kui teise keele valdamise kohta.Hetkel t??ks kasutatavas Eesti vahekeele korpuse tekstide m?rgendusmoodulis toimub t?? vigade m?rgendamisega kolmes etapis: 1) vealiikide defineerimine - saab m??rata vealiigi ja lisada kirjelduse, vead jagunevad globaalseteks ning individuaalseteks vigadeks. Globaalsed vead m?rgendatakse vastavalt korpuse veataksonoomia alusel, individuaalsed vastavalt uurimist?? kitsamale eesm?rgile2) vigade m?rgendamine tekstis - toimub tekstis sobiva koha selekteerimisega, avanenud dialoogiaknas saab valida sobiva veatüübi ning see salvestada. Keskkond v?imaldab ka ekslikult lisatud m?rgendeid kustutada3) vigade visualiseerimine vastavalt kasutaja soovile. Selleks on teksti k?rval nimekiri k?ikide m?rgendatud vealiikidega, kusjuures nimekiri on koostatud korpuse veataksonoomia alusel. Kuna m?rgendid reastatakse vealiigi alusel, siis v?ib samanimelisi valikuid olla mitu ning ühe s?nakasutuse korral mitu m?rgendit (vt joonis 1).Joonis SEQ Joonis \* ARABIC 1. M?rgenduste vaatamise keskkondEelisedOlemasoleva m?rgenduse peamisteks eelisteks on v?imalus vaadata üle varem m?rgitud vead ning vajadusel need kustutada lisada uusi m?rgendeid. Vigade n?itamisega ühe vea kaupa t?rkeid ei esine, ning m?rgendamine on selge ja arusaadav.PuudusedM?rgendatud vigu on v?imalik vaadata ainult ükshaaval, vead on reastatud veatüübi nimetuse j?rgi. See t?hendab, et kasutajale antakse valikmenüüsse n+1 t?pselt sama nimega valikut, mis on segadusseajav. M?rgendatud tekstidest ei ole v?imalik v?tta standardiseeritud v?ljundit, mis kirjeldaks ?ra teksti metaandmed ning h?lmaks endas ka k?iki m?rgendatud vigu. Senini sisestatud tekstid ei vasta otseselt standarditele, kuid on sarnased XTHMLile.Korpuse m?rgendamisega seotud osa tehniline struktuurVealiikide salvestamineM?rgendamisprotsessi kirjeldamist tuleb alustada m?rgendi lisamisest. Kui kasutaja lisab süsteemi uue m?rgendi, siis selle peale tekitatakse m?rgendi infot sisaldav fail (olenevalt sellest, kas tegu on globaalse v?i kasutajaspetsiifilise m?rgendiga) ning lisatakse see kausta. Seej?rel valitakse v?lja tekst, mida soovitakse m?rgendada. Tekste hoitakse Zope andmebaasi objektidena kaustas "documents". Iga tekstiga k?ib kaasas meta-andmete skeem. Meta - andmed v?imaldavad teha hiljem statistikat vastavalt erinevatele autorit puudutavatele parameetritele.Teksti sisu on v?imalik muuta kuni esimese m?rgenduse lisamiseni, peale sedaei ole muutused tekstis enam v?imalikud, kuna vigade asukoha arvestamine toimub struktuurip?hiselt. Peale esimest m?rgendamist on v?imalik m?rgendeid ainult lisada ja eemaldada.Teksti avanedes on v?imalik hiirega markeerida vigane s?na v?i lauseosa. Seej?rel avatakse kasutajale vaheaken, milles on v?imalik m??rata hetkel m?rkimises oleva vea liik. Tuletagem meelde, et valida saab nende vealiikide seast, mis on eelnevalt defineeritud. Joonis SEQ Joonis \* ARABIC 2. Vigade salvestamise dialoogSalvestamise k?igus tekitatakse andmebaasi tabelisse "errors" sisestus, milles m?rgitakse ?ra 5 p?hilisemat konkreetse vea identifikaatorit. Nendeks onviit (pointer) - n?itab ?ra, mis kohas asub viga antud tekstis; tüüpiline viit n?eb v?lja ligikaudu selline: /p[3]/text()#off:60;/p[3]/text()#off:74. dokument (document) - viit dokumendile, mille küljes antud viga asubsisu (content) - vigane osa tekstist, (tekstikujul)kood (code) - vealiigile omane identifikaatorautor (author) - kasutaja, kes on antud vea m?rgendanud.Olgu mainitud, et viit koosneb kahest m?rgendist, mis on omavahel kokku ühendatud semikooloniga. Esimene pool v?ljendist t?histab vea algust ning teine l?ppu. Sellisel viisil v?ib m?rgendada ühe dokumendi kohta praktiliselt l?puta arvu vigu. M?rgendeid saab eemaldada, tehes samas m?rgenduse aknas vea nimetuse peal topeltkliki, ning eemaldades linnukese veatüübi tagant.Xpathi kasutamine m?rgendite asukoha salvestamiselXpath on p?ringukeel, mis kirjeldab elemendi paiknemist XML standarditele vastavas dokumendis. Eesti vahekeele korpuse m?rgendusmooduli juures kastutakse vigade asukoha kindlakstegemisel Xpathi. N?iteks lihtsast raamatupoe infot kujutavast XML failist esimese raamatu hinna teadasaamiseks tuleks tema asukoht defineerida j?rgmiselt: ?/pood/raamat[0]/hind[0]“<?xml version="1.0" encoding="ISO-8859-1"?><pood><raamat> <autor>Giada De Laurentiis</autor> <aasta>2005</ aasta> <hind>30.00</hind></ raamat >< raamat > <autor>J K. Rowling</ autor> < aasta >2005</ aasta> <hind>29.99</hind></ raamat ></pood>Xpathi miinuseks antud probleemistiku kontekstis on vaikimisi eeldus korrektse XML standarditele vastava struktuuri olemasolule. Xpath tutorial. n?itamineM?rgendatud vigade n?itamine k?ib üldiselt vastupidiselt nende ülesm?rgendamise protsessile. Liideses on v?imalik valida, millist viga soovitakse parasjagu n?ha. Ning peale hiirega vea nimetuse kohale liikumist otsitakse üles viit vastavale veale ning edastatakse see viida hindajale (xpath evaluator). See omakorda otsib olemasolevast algtekstist v?lja koha, mida tuleks m?rgendada, ning paigutab enne ning p?rast viga m?rgendid: Joonis SEQ Joonis \* ARABIC 3. Vea m?rgendus tekstis esialgsel kujulHTML keeles n?eb m?rgendus v?lja j?rgnev:tegutseb Eestis kuskil <div name="range_2" class="inlineMark ignore_xpath" id="inlineMark">&gt;&gt;</div>kümneliikmeline<div name="range_2" class="inlineMark ignore_xpath" id="inlineMark">&lt;&lt;</div> Venemaa-aktivistideVajalikud t?iendused ja nende eesm?rgidVajalikud arendussuunad t??tati esmalt v?lja ekspertide grupi poolt, millesse kuulusid professor Pille Eslon ning dotsent Erika Matsak. Koostati juhend, milles kirjas k?ik vajalikud t?iendused, ning illustratiivsed materjalid kasutajaliidese kohta.Prioriteet t?ienduste tarbeks on muuta vigade n?itamise funktsionaalsust. Muudatuste tulemusena peaks senine menüü, kus iga viga on esindatud mitmeid kordi, asenduma menüüga, kus igat vealiiki esineb üks kord. Vealiigi visualiseerimisel n?idatakse sel puhul ?ra k?ik m?rgendatud vead, mis kuuluvad antud vealiigi alla. Kusjuures erinevad vealiigid peaksid olema markeeritud erineva v?rviga. Selle t?ienduse eesm?rk oleks h?lbustada Eesti vahekeele korpuse kasutamist ning muuta filoloogide t?? m?rgendamise koha pealt kergemaks. Seejuures on t?htis, et vigade ülesm?rkimise funktsionaalsus j??ks samaks.Teiseks on vaja luua valmidus v?ljundi v?tmiseks tekstist, kus oleks n?ha viga, annotatsioon, ning vastava vea m?rgendaja identifikaator. Selle punkti üks v?imalikke lahendusi on kasutada TEI (Text Encoding Initiative) m?rgendikeelt, mis vastab XML standarditele. TEI m?rgenduskeelt kasutavad enamus t?nap?evastest keelekorpustest. See XMLi laadne keel on üks enimkasutatavaid vahendeid, mida kasutatakse inimkeele masinloetavaks tegemisel ning analüüsimisel. TEI : Learn the TEI. vahekeele korpuse testkeskkonna loomine Eesti vahekeele korpus on filoloogide t??vahend ning seda kasutatakse pidevalt. Seega selle peal katsetamine ning tarkvara arendus komplitseeritud. Seega tuli m?elda eraldiseisva testkeskkonna peale. Platvormiks valisin vabavaralise Linux Debian 2.6.26. Unixil p?hinev platvorm sai valitud seep?rast, et Zope serveri produkte toetavaid pakette on sellele platvormile lihtsam leida, v?rreldes n?ites MS Windowsiga. Distributsiooniks Debian, kuna sellega olin tuttav koolitundidest, kuigi hetkel tagasivaadates oleks valikuks v?inud olla praktiliselt iga enimlevinud distributsioon. Esialgselt sai installeeritud baasserveri Zope 2.10 versioon, kuid m?ne aja p?rast osutus otstarbekamaks see v?lja vahetada versiooni 2.11, p?hjuseks m?ningate produktide ühilduvusprobleemid. T?istekstotsingu ning indekseerimise tarbeks kasutatakse eesti vahekeele korpuse juures TextIndexNG3 nimelist komponenti, ning Postgre andmebaasiühenduse jaoks ZPsycopgDA komponenti. Esimene suurem tagasil??k protsessi juures oli m?istmine, et need komponendid t??tavad vaid arendusversiooniga Pythonist, kindlasti peavad Python ning komponendid olema kompileeritud sama kompilaatoriga.Teisel katsel oli testkeskkonna ülesseadmine edukas. Tuleb vaid mainida, et p?ris 1:1 ei ?nnestunud vaid andmebaasi koopiat luua, kuna eesti vahekeele korpuse puhul on info salvestatud nii postgre SQL relatsioonilises andmebaasis, kui ka Zope enda objekt-andmebaasis. Kuid kuna erinevaid tekste oli v?imalik kopeerida n?iteks ajakirjanudsest, ei olnud see probleem m??rav, ning l?pptulemus sellest ei s?ltunud.Platvormi spetsifikatsioonLinux Debian 2.6.26 (Lenny2)Postgre AndmebaasZope veebiserver + zope andmebaaskastuatud Zope veebiserveri produktid, mis on vajalikud Eesti vahekeele korpuse t??ks:TextIndexNG3ZPsycopgDATwistedPortallangsJavascripti Mootools raamistikKasutatud tarkvaraEclipse HeliosFileZillaFirefoxFirebugZope platvormi kirjeldusZope on avatud l?htekoodiga objektidel p?hinev veebiplatvorm. Sellega k?ivad kaasas nii veebi- kui ka ftp serverid, seda saab laiendada ka teistele protokollidele (n?iteks POP3, SMTP ja IMAP). Zope platvormi on sisse integreeritud objektidel p?hinev andmebaas. Lisaks saab antud platvormi suhteliselt h?lpsalt integreerida teisi andmebaase, n?iteks Oracle, Sysbase, MySQL. Eesti vahekeele korpuses hoitakse Zope andmebaasis objektidena m?rgendatavaid tekste, samas kui statistikat, m?rgendatud vigade t?hised ja infot m?rgendajate kohta jms hoitakse PostgreSQL andmebaasis. PostgreSQL baas ühendub Zope platvormiga l?bi ZPsycopgDA nimelise produkti. Olgu etteruttavalt ?eldud, et Zope keskkonnas kutsutakse laiendusmooduleid produktideks (Products).Zope on kirjutatud Pythoni keelt kasutades, mis t??tab praktiliselt k?igil UNIXi platvormidel, samuti ka Windows NT-ga. Seda saab kasutada koos teiste veebiserveritega, kui peaks olema huvi mitte kasutada Zope platvormiga kaasask?ivat veebiserverit. Veebilehestiku tarbeks kasutatakse Zopes HTMLi ning DTMLi (Document Template Markup Language). Olgu ?eldud, et viimane on Zope enda m?rgenduskeel, samuti v?ib seda teha ka n?iteks Pythoni kaasabil.PostgreSQL andmebaasPostgreSQL on avatud l?htekoodiga objekt - relatsioonile andmebaas. Nagu paljudele avatud l?htekoodiga projektidele iseloomulik, ei oma PostgreSQLi üle kontrolli üks kindel firma. Arendus toimub ülemailmse tarkvaraarendajate v?rgustiku kaudu.Javascript veebiarendusesEesti vahekeele korpuse kasutajaliidese funktsionaalsus tugineb suurel m??ral javascriptile ning selle v?imalustele. Javascript on viimase dekaadiga veebiarenduses suure arengu l?bi teinud ja muutunud lihtsate efektide vahendajast t?isv??rtuslikuks programmeerimiskeeleks. See on saavutatud suurel m??ral t?nu asünkroonsete p?ringute tegemise v?imalusele. Asünkroonsete p?ringute all m?tlen siinkohal peale veebilehe laadimist toimuvaid p?ringuid, mis ei m?juta lehe laadimiskiirust ehk veebileht on serverist kliendi veebibrauserisse kohaletoimetatud, ning sellele lisatakse v?i eemaldatakse elemente. Andmeid saadakse l?bi XMLHttpRequest objekti, mis omakorda t?hendab, et tegelikult kastutatakse andmete transportimiseks endiselt Http-p?ringuid. Javascripti raamistikudM?ned javascripti arendajad ei kiida raamistike kasutamist heaks. Heidetakse ette, et javascripti p?hiline funktsionaalsus j??b raamistikke kasutades adumata ning kaob t?pne ettekujutus (koos sellega ka osa kontrollist ), mida parasjagu mingi osa koodist teeb. Ka on vastuargumentideks koodi (mida ilmselt kunagi ei kasutata) rohkus. Kuna kogu skript tuleb enne kasutamist alla laadida, l?heb lehe kuvamisega lihtsalt kauem aega. Kuigi hindan v?ga fundamentaalseid teadmisi javascriptist, ei saa siinkohal raamistike mittepooldajatega n?ustuda. Minu hinnangul on javascripti raamistike tundmine ja kasutamine nii veebiarenduses, kui ka Eesti vahekeele korpuse laadsete projektide juures m??dap??smatu, sest aitab kokku hoida v?ga palju aega. ?ks peamisi p?hjuseid on kindlasti eri veebilehtitsejate toetus, enamlevinumad javascripti raamistikud on optimeeritud t??tama s?ltumata brauserist (loomulikult on siin mingi piir vahele t?mmatud, ning enamasti Internet Explorer 5.5-st varasemaks ei minda). Samas ei ole tavaline javascript l?bivalt erinevates veebilehitsejates sama funktsionaalsusega. Selle tagamiseks tuleks puhast javascripti kirjutades teha v?ga palju t??d, mis oleks v?lditav raamistiku kasutuselev?tuga. Lisaks aitab raamistiku kasutamine tihtipeale koodi loetavamana hoida, kuna suhteliselt keerulised operatsioonid (harilikku javascripti kasutades) on tihti kokku v?etud 1-2 meetodisse, millel on asjakohane nimi.Muudatuste tehniline kirjeldusEesti vahekeele korpuse tekstide m?rgendusmooduli n?ol on tegu on kasutaja interaktsiooni v?imaldava keskkonnaga, kus toimub vigade n?itamine ning m?rgendamine. Kuna see on veebis t??tav rakendus, siis v?ljastatakse k?ik olemasolevad vead ning tekstid veebilehe sisu kaudu serverist kasutajale, ning kasutaja poolel hoolitseb vastava info t??tlemise ja muutmise eest Javascript keeles kirjutatud ning Mootools raamistikule toetuv moodul. Peamiseks kasutatud keeleks on seet?ttu Javascript, ning v?hemal m??ral Python ning DTML.M?rgendusmooduli funktsionaalsuse t?iendamine toimus mitmes iteratsioonis. Siin ja edaspidigi nimetan valminud mooduli erinevaid faase iteratsioonideks. Suurem muutus kaasnes viimase iteratsiooniga, mis kasutab eelmistega v?rreldes teistsugust l?henemist. P?hiprobleemiks mitme elemendi m?rgendamise juures samas tekstis on teksti struktuuri pidev muutumine m?rgendamise k?igus. Kuna vead asuvad XHTML standarditest l?htuvalt tekstijaotiste (text node) sees. Wikipedia – Extensible Hypertext Markup Language. esimese vea ülesm?rgendamist jaotatakse olemasolev tekstijaotis omakorda kuni kolmeks osaks, seega tekib j?rgmise vea m?rgendamisel küsimus, kas eelnev tekst juba sisaldab m?rgitud vigasid. Juhul kui esinevad vead, siis tuleks nendesse arvestada ning j?rgnevate vigade asukohale vajalik summa otsa liita. Ehk piltlikult ?eldes - m?rgendada teksti font alajaotuses:<font class="articleBody">“Hommikul kell 9 s?rab p?ike k?rgel taevas, kui stardin Bekaa oru suunas. Zahle linnas on mind ootamas Bekaa oru piirkonna t?htsaim politseikindral h?rra Atta.</font>Koodin?ide 1. Esialgne tekst HTML kujul.M?rgend viidaga: /font/text()[0]#off:10;/font/text()[0]#off:14. Lisaks m?rgenduse jaotisele on lauses veel v?ljend #off:10, mis t?hendab antud jaotise 10ndat t?hem?rki. Samamoodi on kirjeldatud ka vea l?pu asukoht. Peale asukoha hindamist, m?rgitakse vajalikele kohtadele jaotised koos teabega m?rgendi alguse ja l?pu kohta. Peale vea ülesm?rkimist tekib meil j?rgnev struktuur:<font class="articleBody">“Hommikul <div name="d17890" class="inlineMark ignore_xpath beginMark global_129087252631"></div>kell<div name="d17890" class="inlineMark endMark ignore_xpath global_129087252631"></div> 9 s?rab p?ike k?rgel taevas, kui stardin Bekaa oru suunas. Zahle linnas on mind ootamas Bekaa oru piirkonna t?htsaim politseikindral h?rra Atta.</font>Koodin?ide SEQ Koodin?ide \* ARABIC 2. Tekstid m?rgendatud viga.Nagu n?ha on tekstist eraldatud s?na "kell". Probleem tekib aga siis, kui me tahaksime selles samas jaotises m?rkida ?ra s?na "stardin" mille asukoht oli esialgu samuti jaotises text()[0], kuid arvestades lisatud m?rgendeid, peaksime otsima s?na "stardin" nüüd hoopis kolmandast tekstijaotisest, ehk text()[3] ning lisaks peaksime vea asukohast maha lahutama talle eelnevate tekstiosade sisu pikkuse. See on tingitud asjaolust, et vea viidas sisalduvad algust ning l?ppu t?histavad numbrid arvestavad ka vea paiknemist, pidades silmas esialgset teksti struktuuri.Esimene tekkinud probleem oleks v?lditav sel moel, et iga uue vea m?rgendamisel kontrollitakse, kas valitud teksitjaotises on üldse piisav arv t?hem?rke, et m?rkida maha vea algus ja l?pp. Kui j?rgneva vea viites kirjeldatud numbriga t?hem?rki ei leita, hakatakse viga otsima ülej?rgmisest tekstijaotisest. Ning lahutatakse esimese kahe tekstijaotise pikkus praegusest pikkusest. Kui siis selgub, et vea algus tuleb negatiivse v??rtusega, t?hendab see, et tekkinud on olukord, kus kaks viga kattuvad.Kuna viga kirjeldav viite v??rtus esineb süsteemis s?ne (string) tüüpi muutujana, siis kirjutasin tekstijaotise arvu suurendamiseks meetodi increaseTextNodeCounter, mis leiab regulaaravaldise abil viitest üles sobiva arvv??rtuse, ning suurendab seda kahe v?rra : function increaseTextNodeCounter(expression, onlycount){var p = expression.split('#');var text = p[0].substring(p[0].lastIndexOf('/')+1);var mat = text.match(/(.*?)\[(.*?)\]/);if (mat[1] == 'text()') {var currentNode = parseInt(mat[2]);if (onlycount) {return currentNode;} currentNode += 2;var toReplace = 'text()['+currentNode.toString()+']';}else{alert("error finding proper text node");}var newLeft = p[0].slice(0,p[0].lastIndexOf('/')+1);var NewExp = newLeft + toReplace +'#'+ p[1];return NewExp;}Koodin?ide SEQ Koodin?ide \* ARABIC 3. Tekstijaotise loenduri suurendamine 2 v?rraTeiseks probleemiks olid sisestatud teksti struktuuri ise?rasused. Kuni kolmanda iteratsioonini valminud moodul eeldas, et sisestatud tekst on vormindatud vastavalt XML standarditele, ehk iga element kuulub mingisse kindlasse alajotusesse. Wikipedia – Extensible Markup Language. n?itena, milles p?rus kolmas iteratsioon m?rgendusmoodulist, tooksin osa avalikus meedias ilmunud artikli struktuurist. Kuna Eesti vahekeele korpusse v?ivad sattuda praktiliselt igasuguse struktuuriga tekstid, on taoline n?ide mooduli t?? testimiseks p?hjendatud. <p>Facebook asub koost??d tegema suurimate nimedega riistvaramaailmas – Hewlet Packard Co, Dell Inc, Advanced Micro Devices ja Intel Corp – et v?lja anda ?avatud arvutite projekti“. Tegevjuht Mark Zuckerberg s?nul on projekti eesm?rgiks pakkuda spetsifikatsioone ja kavandeid efektiivsemate internetiteenuste pakkumiseks m?eldud arvutite jaoks.<br><br>?Aja jooksul oleme leidnud, et palju massitootjate poolt pakutavast ei ole olnud p?ris see mida meil ja teiste sotsiaalsete rakenduste pakkujatel vaja on,“ ütles Zuckerberg Facebooki Palo Altos asuvas peakontoris toimunud meediasündmuse k?igus neljap?eval. Spetsifikatsioonide ja kavandite jagamisega loodab Facebook t?sta spetsialiseeritud serverite saadavust ja n?udlust, vahendab Reuters.</p>Koodin?ide SEQ Koodin?ide \* ARABIC 4. N?ide paragraafist, mis on jagatud kaheks erinevaks tekstijaotisek.sSellisel juhul sisaldab ülemjaotis ehk praegusel juhul <p></p> rohkem kui ühte tekstijaotist, kuid vigu üles m?rkides alustatakse vigase koha asukoha nummerdamist vastavast alajaotusest.Oletagem, et esialgsesse esimesse tekstijaotisse kuulub kaks viga ning teise veel kaks. Eelmistes iteratsioonides loodud lahendus on suuteline m?rkima vigu ?igesti kuni esimese tekstijaotiseni, mis asus lisaks eelmisele sama ülemelemendi sees. Kuna tekstides v?is selliseid jaotisi esineda m??ramata arv, siis tekkis vajadus millegi t??kindlama j?rele, kui seda oli vigade aimamine ja arvutusk?igud, mis pidid adapteeruma vastavalt eelnevalt m?rgendatud vigadele.T?status ?igustatud küsimus, kas vigu poleks v?imalik m?rgendada sel moel, et poleks vaja j?lgida v?imalikke eelnevalt sisestatud vigu. Tekkis idee korraldada m?rgendite lisamine ümber sel moel, et m?rgendamine algaks alati teksti l?pust, ning vigasid ei m?rgitaks konkreetse vea p?hiselt, vaid oleks mingisugune moodul, mis hoiaks endas k?iki dokumenti kuuluvaid vigu. Lahenduse selgitamiseks koostasin j?rgmise skeemi (vt joonis 3):Joonis SEQ Joonis \* ARABIC 4. M?rgendusprotsessi selgitav skeem (halliga t?histatud HTML osa, rohelisega javascript)Dokumenti luuakse kaks jaotist. Esimene sisaldab k?iki dokumendi kohta k?ivaid vigu HTML input elementidena, mida siin ja edaspidi nimetan antud elemente m?rkeskeemiks. Elmendid kannavad siinkohal vaid andmekandja rolli ning kasutaja nendega kontakti ei satu:<div class="document_markup_schema"> <input docolor="ae33e3" value="0" counter="0" xpoint="/font/text()#off:52;/font/text()#off:58" name="siim_130348714515" type="hidden"> <input docolor="ae33e3" value="0" counter="1" xpoint="/p/font/text()#off:43;/p/font/text()#off:54" name="siim_130348714515" type="hidden"></div>Koodin?ide SEQ Koodin?ide \* ARABIC 5. N?ide m?rgendiskeemil asuvatest m?rgenditestAntud elementde mittestandardsetes atribuutides on kirjas, mis v?rviga peaks olema antud viga markeeritud, m?rge selle kohta, kas viga on parasjagu aktiivne, j?rjekorranumber, m?rgendi tüüp ning viit vea asukohale.Teine jaotis sisaldab endas vealiike ning kasutajale suunatud m?rkeruutu, mille kaudu kutsutakse v?lja funktsioon "updateMarkupSchema", mis muudab eelnevalt kirjeldatud elementide v??rtusi vastavalt valitud m?rkeruudule. Seega on vigadel kaks olekut: aktiivne ja mitteaktiivne.<div class="markwrapper"><input name="togglemark" onclick="javascript:updateMarkupSchema($(this).getNext(), 1);" type="checkbox"><div style="border-bottom: medium none;" class="error_marker_input mouseenabled" onmouseover="javascript:updateMarkupSchema(this, 2)" onmouseout="javascript:updateMarkupSchema(this, 0)" docolor="ae33e3" name="siim_130348714515" id="siim_130348714515">veakoht15</div></div>Koodin?ide SEQ Koodin?ide \* ARABIC 6. N?ide vealiigi valikust menüüs, ning sellele eelnevast m?rkeruudustFunktsioon "updateMarkupSchema" muudab m?rkeskeemi, vastavalt valitud vigadele, m?rkides ?ra vead, mida tuleb kasutajale v?lja n?idata. Peale sobivate vigade v??rtuse muutmist, kutsutakse omakorda v?lja funktsioon "displayCurrentErrors".Funktsioon displayCurrentErrors moodustab parasjagu valitud vigadest massiivi, mille iga element on omakorda kolme elemendi pikkune massiiv, milles on kirjeldatud viit veale, vea liik ning v?rv, millega viga markeeritakse:var showableMarks = [];$$(".document_markup_schema input").each(function(item){if (item.get('value') == 1) {showableMarks[item.get('counter')] = [item.get('xpoint'), item.get('name'), item.get('docolor')];}});Koodin?ide SEQ Koodin?ide \* ARABIC 7. Itereerimine l?bi k?igi dokumendis leiduvate vigade, aktiivsete vigade lisamine massiiviOlgu siinkohal mainitud, et hariliku javascripti kontekstis ebastandardsed operaatorid $ ja $$ t?histavad elementide ja objektide valikuid Mootools raamistiku kontekstis. Ehk lühidalt:var elems = $$('.bigred');Seab muutuja elems v??rtuseks massiivi k?igist elementidest, mis omavad klassi "bigred".Seej?rel muudetakse vigade j?rjestus vastupidiseks, et oleks v?imalik alustada viimasest veast:showableMarks.reverse(); Siis eemaldatakse olemasolevad m?rgendused, see tegevus toimub kahes faasis. Esmalt eemdaldatakse m?rgendatud vealt v?rviga allajoonitud markeering, ning seej?rel eemaldatakse m?rgendite algused ning l?pud. J?rgnevalt itereeritakse l?bi k?ikide vigade ning kutsutakse v?lja funktsioon "showCurrentError", mis omakorda k?ivitab viida hindamise objekti ning paigaldab teksti sisse iga vea kohta alguse ja l?pu m?rgendi. Kui k?ik vead on sel moel l?bi k?idud, toimub nende markeerimine vastava v?rviga (vt joonis 4). Iga kasutaja tehtud valiku peale k?iakse l?bi kogu olemasolev tekst kahel korral, et eemaldada seal hetkel asuvad m?rgendid, seej?rel muudetakse m?rkeskeemi, ning loetakse k?ik vead sisse ja k?iakse tekst m?rgendamiseks kahel korral l?bi. Kuna t?nap?evaste arvutite arvutusv?imsus lubab sellist hulka arvutusi teha hetkega, puudub kasutajal praktiliselt igasugune viide, ning tekkinud muutused on tekstis koheselt n?ha (vt ka lisa 3).Joonis SEQ Joonis \* ARABIC 5. M?rgendusmooduli uus funktsionaalsus katsetusesEdasiarendusv?imalusedSelles peatükis kirjeldan, millised on p?hilised edasised arengusuunad, mis puudutavad Eesti vahekeele korpuse tekstide m?rgendusmoodulit. K?esolev diplomit?? sobib pidepunktiks Eesti vahekeele korpuse tekstide vigade m?rgendamisega seotud edasisel arendamisel. M?rgendusega seotud osa arenduse loogiline j?tk oleks statistikamooduli t?iustus, et tekiks v?imalus statistiliselt n?idata, millistel kohtadel tekib erinevate vealiikide kuhjumine ning millised vead j??vad ainukordseks. Antud probleemi lahendina n?en m?rgendusliidesesse lisatavat salvestusv?imalust, mis otsib tekstist üles kattuvate vealiikide paarid ning salvestab need eraldi andmebaasi tabelisse juhul, kui seal selliseid paare veel ei eksisteeri. Vastasel juhul suurendatakse olemasolevate paaridega kaasas k?ivat loendurit vastav arv kordi. Hiljem, kui andmeid vealiikide koosesinemise kohta on kogutud piisav hulk, tuleb t?iustada statistikamoodulit nii, et see oleks v?imeline v?ljastama enim koosesinenud veapaare ning vigade sisu, milles statistiliselt k?ige rohkem eksimusi leidus. TekstimudelidTekstimudelid on andmekogud, mis koosnevad peaasjalikult ainult tekstist v?i tekstide kogust. Lisainfot, mida vajavad k?ik teksti ja s?na t??tlevad süsteemid, antakse eriti varasemates tekstimudelites ?ige napilt. Füüsiliselt kujutab tekstimudel endast j?rjestikust teksti, mida katkestavad mitmesugused abisümbolid. Arvutiprogrammid peavad suutma seda teksti lugeda st. eristada sümbolijadast vajalikku infot. Selleks vajavad programmid aina p?hjalikumat lisainfot teksti struktuuri ja sisu kohta ning üheks enimlevinud lisainfo andmise viisiks ongi s?nastikuteksti m?rgendamine, mille areng on kulgenud lihtsatest kirjastiili k?skudest teksti loogiliste süvakihtide t?histamiseni (Langemets 2000 : 101-126).?ldistatud m?rgendus?ldistatud m?rgendamise p?him?tted postuleeriti juba 1970. aastatel: a) m?rgendamine peab kirjeldama teksti struktuuri, mitte teksti hilisemat t??tlemist; b) m?rgendatud tekst peab olema algoritmiliselt t??deldav. ?ldistatud m?rgenduskeele rahvusvaheliseks standardiks kinnitati 1986. aastal Standard Generalized Markup Language, lühendatult SGML (ISO standard 8879) (Langemets 2000 : 101-126).TEI m?rgendus?ldistatud m?rgendikeele üheks edasiarenduseks on rahvusvahelise uurimisprojekti Text Encoding Initiative (TEI) poolt v?lja t??tatud almis kodeerimisskeemid ehk m?rgendusmudelid paljude erinevate tekstitüüpide jaoks. Standardseid mudeleid pakutakse nii korpusetekstide kui ka trükitud s?naraamatute m?rgendamiseks (Langemets 2000 : 117).TEI-s pole t?mmatud selget vahet objektiivse ja subjektiivse info v?i representatiivse ja interpretatiivse info vahel. Kuid osad m?rgendid esitavad selgelt teksti struktuuri (teksti osad, l?igud, laused) ja osad on interpretatiivsed, nt v?imaldab TEI m?rgendada r?hutamise eesm?rgil esilet?stetud tekstiosi m?rgendiga <emph>. TEI soovitab igale korpuse tekstile ja ka kogu korpusele lisada p?ise (Header), mis identifitseerib, dokumenteerib ja kirjeldab korpuses olevaid tekste ning mille abil saab uurija valida korpusest talle vajalike omadustega tekste (Muischnek 2000 : 185).V?ga v?hesed m?rgendid TEI suurest m?rgendite hulgast on kohustuslikud selleks, et m?rgendatud tekst vastaks formaalselt TEI n?uetele. Enamus m?rgendeid ja nende atribuute on vabatahtlikud - neid kasutatakse vajadusel ja v?imalusel TEI m?rgendite hierarhia on j?rgmine:tekstiüksuste m?rgendid (chunks);l?igud ja teised l?igutasandi m?rgendid, mis v?ivad olla kas ainult teksti osad v?i teksti alljaotuse (<div>) osad, kuid ei v?i esineda teiste teksiüksuste m?rgendite sees;m?rgendid, mis v?ivad esineda ainult l?igum?rgendite v?i teiste l?igutasandite m?rgendite sees, mitte v?ljaspool neid (phrase-level elements);m?rgendid, mis v?ivad esineda kas l?ikude vahel v?rdselt l?igutasandi m?rgendite sees (inter-level elements, nt loendi m?rgend <list>) (Muischnek 2000 : 185).Kokkuv?teK?esolevas diplomit??s püstitatud peamised eesm?rgid said t?idetud. ?nnestus koostada testkeskkond, mis on sarnane Eesti vahekeele korpusega ning milles teostatud arendused on v?imalik hiljem integreerida originaalsesse Eesti vahekeele korpusesse. Praktilise lahendusena valminud Eesti vahekeele korpuse tekstide m?rgendusmoodul v?imaldab visualiseerida m?rgendatud vigu vealiigi kaupa. P?hilisteks probleemideks mitme vea m?rgendamisel ühes tekstis oli fakt, et vigasid salvestatakse originaalsteksti suhtes, ning iga lisatud m?rgend muudab teksti struktuuri. Tulemusena m?rgendatakse iga vealiik erineva v?rviga. Vigade kattumisel antakse kasutajale sellest teada ning kuvatakse info parasjagu kattuva vea kohta. Seega v?idan, et tehtud muudatused vastavad esialgselt v?ljat??tatud n?uetele soovitud muudatuste kohta.T??d koostades sain suurel m??ral uusi teadmisi veebip?hise kasutajaliidese arendamisest eelk?ige Mootools raamistikku kasutades, ning tutvusin Zope serverile omaste paradigmadega.T?? teises pooles on v?lja toodud v?imalikud edasised Eesti vahekeele korpuse tekstide m?rgendusmooduli puudutavad arengusuunad. Peamine edasine arengusuund on vahekeele korpuse statistikaga tegeleva osa parandamine sel moel, et oleks v?imalik eristada teksti osasid, kus vigade tekke t?en?osus on suurem.Kasutatud allikad Hennoste,T & Muischnek, K.(2000), Eesti kirjakeele korpuse tekstide valiku ja m?rgendamise p?him?tted ning kahe allkeele v?rdluse katse. - Kogumik "Arvutilingvistikalt inimesele", Tartu : Tartu ülikooli üldkeeleteaduse ?ppetooli toimetised 1, 183-218.Granger, S.(2002). A bird’s-eye view of learner Corpora in SLA research and FLT. – Computer Learner Corpora, Second Language Acquisition and Foreign Language Teaching. Amsderdam/Philadelphia: John Benjamins Publishing Company, 3-33.Kitsnik, M.(2005). Keelekorpused ja v??rkeele?pe. - Eesti rakenduslingvistika ühingu aastaraamat 2, 93-107.Eslon, P. (2007). ?ppijakeelekorpused ja keele?pe. – Tallinna ?likooli keelekorpuste optimaalsus, t??tlemine ja kasutamine / Toim. P. Eslon. Tallinna ?likooli eesti filoloogia osakonna toimetised 9. Tallinn: Tallinna ?likooli Kirjastus, 87 - 120.Langemets, M. (2000), Leksikaalse info kodeerimine. - Kogumik "Arvutilingvistikalt inimesele", Tartu : Tartu ülikooli üldkeeleteaduse ?ppetooli toimetised 1, 101-126.TEI : Learn the TEI [2011, aprill 14]. – Extensible Markup Language [2011, aprill 15]. – File Transfer protocol [2011, aprill 20]. tutorial [2011, aprill 15]. - What is Zope? [2011, aprill 20]. – Extensible Hypertext Markup Language [2011, aprill 15]. 1. Document.py t?iendusedFunktsioon k?ikide vigade tagastamiseks andmebaasist (allUsedCodes) ning funktsioon ainult eri tüüpi vealiikide loetelu tagaastamiseks (diffUsedCodes).security.declareProtected(perm_view_document, 'diffUsedCodes')def diffUsedCodes(self, REQUEST):codes = self.Errors.getDocumentMarks(self.getId(), str(REQUEST.AUTHENTICATED_USER))res = []for x in codes:add=1y = x.getProperty('code').encode('utf-8')for current in res:if current[0]==y:add=0if add==1:rcolor1=random.randint(50,255)rcolor1="%02x" % rcolor1rcolor2=random.randint(50,255)rcolor2="%02x" % rcolor2rcolor3=random.randint(50,255);rcolor3="%02x" % rcolor3truecolor=str(rcolor1)+str(rcolor2)+str(rcolor3)res.append([y, self.Marks.prettyCodeTitle(y), truecolor])return ressecurity.declareProtected(perm_view_document, 'allUsedCodes') def allUsedCodes(self, REQUEST): codes = self.Errors.getDocumentMarks(self.getId(), str(REQUEST.AUTHENTICATED_USER)) res = [] counter=0 for x in codes: y = x.getProperty('code').encode('utf-8') xpinter = x.getProperty('pointer').encode('utf-8') res.append([y, xpinter, counter, self.Marks.prettyCodeTitle(y)]) counter+=1 return resLisa 2. document_view.pt t?iendusedT?iendused dokumendi mallile, kasutatud on Lisaas 1 defineeritud funktsioone. <h4 i18n:translate="Marks">M?¤rgendid</h4> <div class="document_markup_schema"> <span tal:omit-tag="" tal:repeat="code python:context.allUsedCodes(request)"> <input type="hidden" value="0" tal:attributes="name python:code[0]; xpoint python:code[1]; counterpython:code[2]; rel python:code[3]" /> </span> </div> <span tal:omit-tag="" tal:repeat="code python:context.diffUsedCodes(request)"> <div class="markwrapper"><input type="checkbox" name="togglemark" onclick="javascript:updateMarkupSchema($(this).getNext(), 1);"/> <divclass="error_marker_input mouseenabled" onmouseover="javascript:updateMarkupSchema(this, 2)" onmouseout="javascript:updateMarkupSchema(this, 0)" tal:attributes="name python:code[0]; id python:code[0]; docolorpython:code[2]" tal:content="python:code[1]" > </div></div> <input type="hidden" value="0" tal:attributes="name python:code[0]; xpoint python:code[1]; counterpython:code[2]"/> </span>Lisa 3. document_view.js t?iendusedJavascripti funktsioonidel toon ?ra üldise t??j?rjekorra ning lühikirjelduse. Lehe laadides joostakse ühekordselt funktsiooni countStats, mis loeb kokku erinevate vealiikide alla kuuluvad vead, ning kirjutab iga vealiigi taha sulgudesse numbri, mitu viga antud vealiigi kohta tekstis esineb.Edasine t?? toimub kasutaja interaktsiooni peale, m?rkeruudule vajutades kutsutakse v?lja funktsioon updateMarkupSchema mis tuvastab vealiigi, mille peale vajutati, ning muudab veaskeemil vajalikud vead aktiivseks v?i vastupidi deaktiveerib nad. Kutsub omakorda v?lja funktsiooni displayCurrentErrors. Antud funktsiooni poolt kasutatavad funktsioonid toon v?lja nimekirjana:unpaintErrors - eemaldab vigade m?rgistuseks olevate div kihtide vahelt markeeringu ehk teksti allajoonimiseremoveMarksType - eemaldab vigade m?rgistuse tekstistshowCurrentError - hindab viitasid kasutades XPTraverser objekti, ning vajadusel suurendab tekstijaotise loendurit l?bi funktsiooni increaseTextNodeCounter. Lisab tekstile uute vigade m?rgistused.paintErrors - vastvalt vigade m?rgistusele markeerib vigase koha vastavat v?rvi alljoonega, vea sisu tühjaks osutumisel on tegemist kattuva veaga ning selle tarbeks lisatakse sellele klass, mille j?rgi on v?imalik n?idata infoakent (tooltip) vigade kattumise kohta.var mytips = false;function init_view(event){countStats(); var att = 0; var add = 0; if (window.attachEvent) { att = 1; } else { add = 1; } errs = document.getElementsByTagName("span"); for ( var i=0; i<errs.length; i++) { if (!errs[i].getAttribute('uniq')) { continue; } errs[i].style.display='none'; if (att) { errs[i].attachEvent('onclick', attachForum); } if (add) { errs[i].addEventListener('click', attachForum, false); } } url = window.location.search; if (url.charAt(0)=='?') { url = url.substring(1); uniq = url.split('=')[1]; hilight_uniq(uniq); }}function countStats(){var stats = [];$$(".document_markup_schema input").each(function(item){var name = item.get('name');var isin = false;stats.each(function(stat){if (stat[0] == name) {isin = true;} });if (isin === false) stats.push([name, 1]);else {stats.each(function(stat){if (stat[0] == name) {stat[1] +=1;} });}});stats.each(function(one){$$('.error_marker_input').each(function(current){if ($(current).get('name') == one[0]) {$(current).set('text', $(current).get('text')+' ( '+ one[1]+' )');}});});}function removeMarksType(){$$('#contentDiv div.inlineMark').each(function(item){item.dispose();});var cd = $('contentDiv');cd.normalize();$$('.error_marker_input').each(function(element){if(element.get('text').indexOf('(*)') != -1){element.set('text', element.get('text').slice(0,element.get('text').indexOf('(*)')));}});}function paintErrors(){$$('#contentDiv div.inlineMark.beginMark').each(function(item){var textcontent = item.nextSibling.nodeValue;var color = $(item).getProperty('name');var remove = false;var errortype = $(item).get('rel');if($type(item.nextSibling) == 'textnode'){remove = true;var paintedElement = new Element('span', { 'class': 'paintedMark', 'style' : 'border-bottom:3px solid #'+color, 'html': textcontent });}if ($type(item.nextSibling) == 'whitespace'){remove = true;var paintedElement = new Element('span', { 'class': 'paintedMark tooltip', 'style' : 'cursor:pointer; color: #FF0000; border-bottom:3px solid #'+color, 'html': '(*)', 'title': 'Kattuvus veaga -> '+errortype });}if(remove){item.nextSibling.parentNode.removeChild(item.nextSibling);$(paintedElement).injectAfter(item);}});}function unPaintErrors(id){var cd = $('contentDiv');var spans=$$("#contentDiv span.paintedMark");spans.each(function(item){if(item.get('text') != '(*)'){item.appendText(item.get('text'),'before');}else{item.appendText('','before');}item.dispose();});cd.normalize();}function increaseTextNodeCounter(expression, onlycount){var p = expression.split('#');var text = p[0].substring(p[0].lastIndexOf('/')+1);var mat = text.match(/(.*?)\[(.*?)\]/);if (mat[1] == 'text()') {var currentNode = parseInt(mat[2]);if (onlycount){return currentNode;} var toReplace = 'text()['+currentNode.toString()+']';}else{alert("error finding proper text node");}var newLeft = p[0].slice(0,p[0].lastIndexOf('/')+1);var NewExp = newLeft + toReplace +'#'+ p[1];return NewExp;}function showCurrentError(xPath, id, color, name){var faults = false;var cd = $('contentDiv');spl = xPath.split(';'); full_start_expr = spl[0]; full_end_expr = spl[1]; start_expr = full_start_expr.split('#')[0]; end_expr = full_end_expr.split('#')[0]; start_off = full_start_expr.split('#')[1].split(':')[1]; end_off = full_end_expr.split('#')[1].split(':')[1];var show1 = false;var show2 = false; if (full_start_expr.indexOf('text()#') == -1) {show1 = increaseTextNodeCounter(full_start_expr, true);} else {full_start_expr = full_start_expr.replace('text()#','text()[1]#');}if (full_end_expr.indexOf('text()#') == -1) {show2 = increaseTextNodeCounter(full_end_expr, true);} else {full_end_expr = full_end_expr.replace('text()#','text()[1]#');}xp = new XPTraverser(cd, full_start_expr, show1); start = xp.resultnode; start_off = xp.newoffset; xp = new XPTraverser(cd, full_end_expr, show2); end = xp.resultnode; end_off = xp.newoffset; bet1 = new Element('div', { 'class': 'inlineMark ignore_xpath beginMark '+id, 'name' : color, 'rel' : name, 'html': '' }); bet2 = new Element('div', { 'class': 'inlineMark endMark ignore_xpath '+id, 'name' : color, 'rel' : name, 'html': '' }); if ( start.isSameNode(end) ) { while (!start.nodeValue.charAt(start_off) && show1 == false) {if(start_off < 0){break;} full_start_expr = increaseTextNodeCounter(full_start_expr, false); full_end_expr = increaseTextNodeCounter(full_end_expr, false); xp = new XPTraverser(cd, full_start_expr, show1, 0); start = xp.resultnode; start_off = xp.newoffset; xp = new XPTraverser(cd, full_end_expr, show2, 0); end = xp.resultnode; end_off = xp.newoffset; } if(start_off < 0){ start_off = end_off = 0; faults = id; } if(end_off > start.nodeValue.length){ start_off = end_off = start.nodeValue.length; faults = id; } if (faults && ($(id).get('text').indexOf('(*)') == -1)){ $(id).set('text',$(id).get('text')+'(*)'); } split_to_three(start, start_off, end_off, bet1, bet2); } else { split_node(start, start_off, bet1); split_node(end, end_off, bet2); } }function displayCurrentErrors(){var showableMarks = [];$$(".document_markup_schema input").each(function(item){if (item.get('value') == 1) {showableMarks[item.get('counter')] = [item.get('xpoint'), item.get('name'), item.get('docolor'), item.get('rel')];} }); unPaintErrors();removeMarksType(); showableMarks.reverse(); showableMarks.each(function(current){showCurrentError(current[0], current[1], current[2], current[3]);}); paintErrors(); mytips = new Tips($$('.tooltip'), {showDelay: 100,hideDelay: 100}); mytips.attach('.tooltip');}function updateMarkupSchema(error_type, action){$$(".document_markup_schema input").each(function(item){if (item.get('name') == error_type.get('name')) {var state = item.get('value');if (state == 1 && error_type.getPrevious().checked == true && (action == 2 || action == 0)) return;var newstate = (state == 0) ? 1 : 0;item.set('value', newstate);item.set('docolor',error_type.get('docolor'));if (newstate == 1) {error_type.set("style","border-bottom:2px solid #"+error_type.get('docolor'));} else {error_type.set("style","border-bottom:none");}}});displayCurrentErrors();}function setAttr(event, targ, tid)//@deprecated{ var target; if (event) { target = event.target ? event.target : event.srcElement; //target = target.id; } else { target = tid; } if (!target) return; both_xp = target.getAttribute('xpoint'); cd = $('contentDiv'); first_expr_dr = both_xp.split(';')[0]; second_expr_dr = both_xp.split(';')[1]; xp = new XPTraverser(cd, first_expr_dr); start = xp.resultnode; first_off = xp.newoffset.toInt(); xp = new XPTraverser(cd, second_expr_dr); end = xp.resultnode; second_off = xp.newoffset.toInt(); bet1 = document.createElement('div'); bet1.setAttribute('class', 'inlineMark'); bet1.setAttribute('id', 'inlineMark'); bet2 = document.createElement('div'); bet2.setAttribute('class', 'inlineMark'); bet2.setAttribute('id', 'inlineMark'); txt1 = document.createTextNode('>>'); bet1.appendChild(txt1); txt2 = document.createTextNode('<<'); bet2.appendChild(txt2); if ( start.isSameNode(end) ) { split_to_three(start, first_off, second_off, bet1, bet2); } else { split_node(start, first_off, bet1); split_node(end, second_off, bet2); }}function showerror(event){ deHilightAll(); setAttr(event, 'inline');}function hilight_uniq(uniqid){ spans = document.getElementsByTagName('span'); for (var i=0; i<spans.length; i++) { if ( spans[i].getAttribute('uniq') == uniqid ) spans[i].style.display = 'inline'; }}function deHilightAll(){ cd = document.getElementById('contentDiv'); var marks = $$(".inlineMark").each(function(item){ $(item).dispose(); }); divs = cd.getElementsByTagName('div'); lenn = divs.length; i = 0; while (divs) { if ( divs[0] ) { if ( divs[0].getAttribute('id') == 'inlineMark' ) { divs[0].parentNode.removeChild(divs[0]); } } else { break; } i++; if ( i> 99) break; } cd.normalize();} Lisa 4. xpath_evaluator.js t?iENdusedXpath_evaluator on p?hiline t??vahend vigade asukoha teadasaamiseks tekstis, seda kasutatakse nii vigu algselt m?rgendades, kui ka hiljem visualiseerides. Seet?ttu selle osa muutmine oli k?ige riskantsem, kuna vigade salvetamise juures ei tohtinud midagi muutuda. Meetod _trav k?ib rekursiivselt etteantud Xpathi v?ljendi l?bi seni, kuni j?uab tekstijaotsieni.function getNodes(elem) { elems = elem.childNodes; res = Array(); for ( o=0; o<elems.length; o++ ) { if ( $type(elems[o]) == 'textnode' || $type(elems[o]) == 'whitespace' || elems[o].hasClass('ignore_xpath')) { res.push(elems[o]); } } return res;}/* * /P[2]/text()#off:64 */XPTraverser = function(root, path, show, rrun) { this.newoffset = null;this.rrun = rrun;this.hasTextnodes = (show) ? (show - 1) : 0;p = path.split('/'); p.reverse(); this.resultnode = this._trav(root, p);}XPTraverser.prototype.traverseXPath = function(root, path) { p = path.split('/'); p.reverse(); return this._trav(root, p);}XPTraverser.prototype._trav = function(root, parts) { var r = false; p = parts.pop(); if ( p ) { if ( p.contains('#') ) { p = p.split('#'); offsetraw = p[1]; p = p[0]; offset = offsetraw.split(':')[1]; } if ( p.contains('[') ) { mat = p.match(/(.*?)\[(.*?)\]/); p = mat[1]; ord = mat[2].toInt(); } else { ord = 1; } if ( p != 'text()' ) { elems = root.getElements(p);} else { elems = getNodes(root);if(ord != 1){r = true;} }this.show = false; ord -= 1;var textoffset = 0;var marks = 0;var nontext = 0;for ( i=0; i<elems.length; i++ ) {if ( $type(elems[i]) != 'textnode' && $type(elems[i]) != 'whitespace' && elems[i].hasClass('ignore_xpath') ){ if(elems[i].hasClass('beginMark') && this.hasTextnodes != 0){marks +=1;if (this.rrun) {ord += 1;}else{ord += 2;} } this.show = true; if($type(elems[i-1]) == 'textnode' && textoffset == 0){textoffset += elems[i-1].nodeValue.length;} ord += 1; nontext += 1; continue; } if ( i == ord ) {if($type(elems[i-1]) == 'textnode' && this.hasTextnodes != 0){textoffset = 0;}root = elems[i]; break; }if ( $type(elems[i]) == 'textnode' && this.show == true){textoffset += elems[i].nodeValue.length;if($type(elems[i-1]) == 'textnode' && r==true){textoffset=0;}} } if ( p == 'text()' ) { cn = root.childNodes; // are we split node? text_node_index = 0; text_length_count = 0; orgoffset = offset.toInt(); if (textoffset > 0) {orgoffset -= textoffset;}this.newoffset = orgoffset; } } if ( parts.length ) return this._trav(root, parts); return root;}TALLINNA ?LIKOOLI HAAPSALU KOLLED?Infotehnoloogia osakondRakendusinformaatika erialaT??pealkiri: EESTI VAHEKEELE KORPUSE TEKSTIDE M?RGENDUSMOODULI ARENDAMINETeadusvaldkond: InfotehnoloogiaUurimuse tasand Diplomit??Aasta ja kuu 2011, AprillLehekülgede arv 30ReferaatK?esoleva diplomit?? eesm?rkideks on anda ülevaade keelekorpustest ja nende kasutamisest ning tutvustada Eesti vahekeele korpuse m?rgendusmooduli t??p?him?tet. Tuua esile positiivseid ja negatiivseid külgi olemasoleva süsteemi juures ning t?iustada kasutajaliidese funktsionaalsust. Eesm?rgist l?htuvalt on ülesandeks luua testkeskkond, mis j?ljendaks v?imalikult t?pselt Eesti vahekeele korpust. Parandada korpuse kasutajaliidese funktsionaalsust, vastavalt etteantud spetsifikatsoonile ning kirjeldada tehtud muudatusi. Kirjeldada edaspidiseid vajalikke parandusi ning edasiarendusv?imalusi. T?? meetodiks on praktilise lahenduse loomine Eesti vahekeele korpuse tekstidem?rgendusmooduli edasiarenduse n?ol.K?esolevas diplomit??s püstitatud peamised eesm?rgid said t?idetud. Praktilise lahendusena valminud Eesti vahekeele korpuse tekstide m?rgendusmoodul v?imaldab visualiseerida m?rgendatud vigu vealiigi kaupa. V?tmes?nad: Eesti vahekeele korpus, teksti m?rgendamine, kasutajaliidesS?ilitamise koht TL? Haapsalu kolled?i raamatukoguT?? autor: Siim Medijainen allkiri:Kaitsmisele lubatud:Juhendajad: Jaagup Kippar, Erika Matsak allkiri:HAAPSALU COLLEGE OF TALLINN UNIVERSITYDepartment of Information TechnologyApplied Computer ScienceTitle: IMPROVEMENT OF THE ESTONIAN INTERLANGUAGE CORPUS teXTS MARKUP MODULEScience Areas: Information technologyLevelDiploma ThesisMonth and year 2011, AprilNumber of pages30AbstractThe aim of this diploma thesis is to give an overview about language corpuses and their usage, also to introduce the technical mechnisms behind the Estonian Interlanguace Corpuses markup module. It is neccessary to describe the pros and cons of the current state of markup and to give an overview about futher developents possible and needed in order to improve the Corpus.The main goal is to create a testing environment as identical as possible to the original Corpus and then to improve the texts markup module as previously specified, also to describe the changes made in precise technical detail. Method chosen for current thesis would be a practical solution.All of the goals arised in the thesis were completed. As a practical solution an improved version of the Estonian Interlanguage Corpuses markup module was developed and the author hereby confirms that all of the functionality specified beforehand, is ow part of the Estonian Interlanguage Corpuses markup module.Keywords: Estonian Interlanguage Corpus, user interface, markupWhere depositedLibrary of Haapsalu College of Tallinn UniversityAuthor of diploma thesis: Siim Medijainen signature:Approved for dissertation:Academical advisors: Jaagup Kippar, Erika Matsak signature: ................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download

To fulfill the demand for quickly locating and searching documents.

It is intelligent file search solution for home and business.

Literature Lottery

Related searches