), azon belül mondatok (<s>) vannak, melyekben CP-k (Clausal Phrase = mondat értékű frázis) adják a mondat alap szerkezetét. Az alapos elemzésnek köszönhetően egy-egy XML dokumentum 10-50 MB méretű. Ezt az átláthatóság és a könnyebb feldolgozás kedvéért praktikus
cikkekre (
bekezdést, vagy <s> mondatot jelenti (a 4. szint ugyan CP, de az egész mondatot jelenti minden esetben). 3 ez a rész kimaradt a programból… bekezdés nodeokat az XML-ből, amin sorban végigmegyünk. Ha a node, akkor új bekezdést szúrunk else if ($node->getName()=="w") { // az id-k, aid-ek, class és title attribútumok kikövetkeztetése //<span class="w..." id="" onMouseUp="" onMouseOver="" onMouseOut="" title=""> //
16
4. Megvalósítás: „COREF”
Oltványi Gábor József - Diplomaterv
Nepszava.1.1.3.2.g12, ADJP: "hazai"______________. Nepszava.1.1.3.2, NP: "Egyes hazai szakértõk" Nepszava.1.1.3.1, CP: "Egyes hazai szakértõk attól ...
Ha választottunk mindkét listából, illetve jobb szélen a koreferencia típust is kiválasztottuk, akkor a [Make Ref!] gomb megnyomásával létrejön egy koreferencia kapcsolat – egyelőre csak a megjelenítő felületen. Ahhoz, hogy az XML-be is be legyen írva a koreferencia, el kell menteni a dokumentumot (File / Save menüpont vagy Ctrl + S vagy a mentés ikon). A panelban zöld színnel jelenik meg ekkor az antecedens, pirossal az anafora, XML-ben nem tárolt esetben vastag betűkkel, mentés után vékonnyal. A jobb alsó listadobozban pedig mentés szerint csoportosítva megtaláljuk a bejelölt koreferenciákat (lásd: 7. ábra).
7. ábra COREF program – bejelölt koreferenciák listázása
4.5.2. Koreferenciák szerkesztése (Edit mode): Az Edit menüből, vagy az eszközsorról, ill. az ablak közepéről ki és bekapcsolható a szerkesztési mód. Ekkor ki kell jelölni a lenti listából egy koreferenciát, amit szerkeszteni szeretnénk. A fenti választási listákba ekkor betöltődik a kijelölésnek megfelelő listaelem, illetve, ha a „Search
Possible
IDs”
jelölőnégyzetet korábban kipipáltuk, akkor meg is keresi a koreferenciában szereplő összes szóhoz tartozó összes ID-t, ami a beállított mélységbe beleesik, és mind
kilistázza.
Ha
ezt
választottuk,
akkor
innen
is,
vagy
újabb
egérkattintásokkal a panelen kijelölhetjük az új, módosított anaforánkat vagy antecedensünket, illetve a koreferenciatípust. Ha megfelelően kiválasztottuk, akkor egy csak edit módban megjelenő [Save] gomb megnyomásával tudjuk fixálni a koreferencia új értékét. XML-ben tárolt koreferenciák szerkesztésekor egy megerősítést kérő ablak ugrik föl, amit jóváhagyva törlődik az XML-ből az eltárolt koreferencia, és átkerül a nem tároltak közé, ahol újra szerkeszthető és elmentendő lesz…
17
4. Megvalósítás: „COREF”
Oltványi Gábor József - Diplomaterv
4.5.3. Koreferenciák törlése (Delete mode): Az Edit menüből, vagy az eszközsorról, illetve az ablak közepéről ki és bekapcsolható a Törlési mód. Ekkor a lenti listában minden sor előtt megjelenik egy jelölőnégyzet, amikből tetszőleges számú törlésre szánt elemet kipipálhatunk (segíthet a kijelölés megfordítása (Invert), illetve az All/None kijelölési opció). A törlés végrehajtását egy csak ebben a módban megjelenő [Delete] gomb megnyomásával lehet elindítani. Az összes nem tárolt koreferencia egyből törlődik, a tároltak törlése előtt pedig egyenkénti megerősítést kér a program.
4.5.4. Multi-koreferencia Előfordulhat, hogy van egy olyan anafora, ami több antecedenssel is koreferál. Például ebben a szövegben: „Péter és János a film vége után hazamentek. Aznap mindketten későn feküdtek le.” A ’mindketten’ Péterre és Jánosra is vonatkozik, nekik pedig valószínűleg külön ID-jük van. Ekkor a ’mindketten’-hez tartozó „refid” attribútum szóközökkel tagolja az egyes ID-ket, és a „reftype” is hasonlóan. A program jól kezeli ezek után az adott koreferenciák szerkesztését és törlését is. Megjegyzés: ahhoz, hogy továbbra is érvényes legyen az XML, ezt a módosítást a DTD-ben is jelezni kell: a „refid” attribútum típusa tehát már nem „idref” lesz, hanem „idrefs”, azaz id-hivatkozás-tömb.
4.6. Zéró névmások beillesztése Ha az anafora vagy antecedens egy zérónévmás, vagyis a szövegben nem jelenik meg, szükségünk van a zéró elem
fölvételére
az
XML-be
és
a
megjelenítő felületre is. Erre, illetve zérónévmás
törlésére
szolgál
a
8. ábra: Zérónévmás beszúrása
18
Oltványi Gábor József - Diplomaterv
4. Megvalósítás: „COREF”
programban a Zero Pronoun Mode, aminek bekapcsolásakor az összes ige és igenév (
4.6.1. Automatikus zérónévmás-felismerés Ez a COREF 1 fejlesztése során nem valósult meg, viszont a következő tervem volt az algoritmusra. Létezik egy nagyméretű vonzatkeret-leírás adatbázis, amely a magyar nyelv legtöbb igéjét és igenevét tartalmazza, annotálva a kötelező és nem kötelező vonzataival. Példaként vegyük a Nepszava.1.1.1.18-as ID-jű CP-t: „nem újítja [ő] meg olajszállítási szerződéseit” (az „[ő]” eredetileg nincs a szövegen, de itt látni fogjuk, miért kell beszúrni). A tagmondatban egyetlen ige van, kikeressük tehát
vonzat-
keret leírásból a
„megújít”
VP=meg|újít:12093 HU.VP = SUBJ + TV(:lex="meg|újít") + OBJ(pos=N, case=ACC) ;ex-base: Vmi megújít vmit.
igét: Ebből azt tudjuk meg, hogy az igének két kötelező vonzata van: egy alany (SUBJ), ami mindig NOM esetű, illetve egy tárgy (OBJ), ami ACC esetben van. Majd megvizsgáljuk a korpuszunkban szereplő, az „újítja” igéhez tartozó annotációkat, és azt látjuk, hogy csak ACC vonzata van (lásd: CHILDREN/NODE-jai között): Mivel az ACC-on kívül egy NOM esetű vonzat is kötelező volt, ezért automatikusan bele kell tennünk egy alanyt, vagyis egy zérónévmást az ige mellé. A zérónévmás számát és személyét (jelenleg: egyes szám 3. személy, jelölve: „3s”) pedig az egyes elemzésekből (<mscat>) tudjuk kiolvasni, erre is vannak leírások (lásd: 1.3.1 részben – a megtalált névmás pedig az „ő” lesz). A megvalósítás elmaradt, helyette lásd a COREF 2 5.3.5.3. fejezetét.
4
Ha nincs a program futtatható exe-jének mappájában egy refroles.txt fájl, akkor kéri, hogy töltsük be.
19
Oltványi Gábor József - Diplomaterv
4. Megvalósítás: „COREF”
9. ábra: Rejtett alanyú példamondat állítmánya a Szeged Treebank XML-jéből
4.7. Segédeszköz kereséshez Egy segédeszköz is készült a projekt mellé, amivel keresni tudunk ID-kben, illetve a szövegben. Ezt jelenleg a Tools / Show Analysis menüből vagy Ctrl + Hval vagy az IDs eszközsori gomb által tudjuk előhívni: (10. ábra: Segédeszköz kereséshez) Ebben
egyelőre
két
megjelenítési lehetőség van, az egyik egy IDlistát hoz ki, amiben lehet keresni egyrészt az ID-kben, másrészt pedig hozzájuk tartozó szövegben.
A
keresés
eredményét kijelöli, és jobb oldalt kilistázza a tartalmát.
20
4. Megvalósítás: „COREF”
Oltványi Gábor József - Diplomaterv
A másik nézeti lehetőség az XML DOM (Document Object Model) megjelenítése fa formájában – ezt a második, „XML Tree” fülön lehet megnézni (lásd: 11. ábra). Az előző fülön („Find Text by ID”) utoljára kijelölt ID-kat fogja megtalálni a fában, ahogy fült váltunk, illetve az összes kijelöltnél expandálja (kiterjeszti) a fát. A [<>] gombbal (lásd bal alsó sarok) lehet váltani az előző listában utoljára kijelölt ID-k között, és a fában odaugrik a kijelölés.
11. ábra: XML fa szerkezet néző
4.8. COREF V1 kiértékelése Az alábbiakban azt foglalom össze, hogy a COREF első változatában mik azok a részfeladatok, amik még hiányoztak a feladatkiírás teljes megvalósításához. Továbbá azokat a megfontolásokat, hogy milyen lehetőségek álltak fenn a folytatáshoz.
4.8.1. Memória- és erőforrás-igények A COREF 1-ben sajnos még sok hiányosság maradt, illetve, nyilván, még lehetne az egyes algoritmusokat is optimalizálni (idő és/vagy erőforrás tekintetében).
21
Oltványi Gábor József - Diplomaterv
4. Megvalósítás: „COREF”
Egy kis memória- és CPU-használati vizsgálatot is végeztem a COREF 1hez, illetve fejlesztés közben mindig figyeltem e rendszerparamétereket. A tapasztalat, hogy gyakran lehetne fölösleges memóriákat fölszabadítani. Például a cikkekre bontás nagy memória- és CPU-igényű, viszont a bontás közben lefoglalt memóriát csak jóval később végzi el automatikusan a C#.NET beépített Garbage Collectorja. Egy dokumentum betöltésekor pedig, ha nagyobb a cikk, egy időre meg is fagy a program, amíg be nem tölti az összeset. Így praktikus lenne egy háttérben futó szálra bízni az XML szavainak
betöltését,
amivel
próbálkoztam is, de nem sikerült.
4.8.2. Felhasználói igények Fontos, hogy a fejlesztő kapcsolatban legyen a felhasználókkal, hiszen nekik készül a program. Mi az, amit gyakrabban használnak, mi az, amit jobban szeretnének átlátni, mi az, amit pedig kevésbé. Hogy a fejlesztő jobban átlássa ezeket, sok tesztelésre, és visszajelzésre volna szükség. Egyáltalán, nem szakértőként, milyen elnevezéseket adjon az egyes gomboknak, milyen feliratok jelenjenek meg, stb. Mindezek viszont csak akkor derülnek ki, ha majd ténylegesen föl fogják használni a COREF valamelyik elkészült változatát…
4.8.3. Platformfüggetlen környezet igénye A .NET környezet Windowsban 3.5-ös verzióig létezik és ajánlott, Linuxon pedig már a 2.0-ás verziónál tartanak, viszont Macintosh és egyéb operációs rendszerekről pedig nem tudok, hogy létezne .NET megvalósítás. Nyilván, célunk az is, hogy bárki (erre jogosult), bárhol tudja használni programunkat. Mégis, a platformfüggőség ellenére, miért választottam a .NET-et? Miért nem JAVA-t vagy egyéb (kvázi-)platformfüggetlen programozási nyelvet? Rövid válaszom: mert a projekt elkezdésekor leginkább a .NET környezetben voltam járatos, illetve a Visual Studio adta fejlesztési lehetőségek nagyon megkönnyítik a programozás hatékonyságát, úgymond „fejlesztőbarát” program (például drag&drop elrendezési lehetőség, automatikus szöveg-kiegészítések, snippetek, beépített kezelők, stb.). Egyébként pedig még mindig a Windows a legelterjedtebb
22
4. Megvalósítás: „COREF”
Oltványi Gábor József - Diplomaterv
operációs rendszer, ha valaki ezt használja, hozzá van szokva a windows-os programokhoz, ez a program is hasonlít azokhoz, lévén ugyanaz az eszköztára.
4.8.4. Hálózati környezet igénye A COREF 1 fejlesztése során nem jutottam el a hálózati környezet létrehozásáig. Ez úgy nézett volna ki, hogy lett volna egy bejelentkező felület, ahol mindjárt belépéskor ki tudja választani a felhasználó, hogy melyik dokumentumát szeretné használni. Ezt a dokumentumot ugyanis egy szerveren vagy adatbázisban kell tárolni, hogy bármikor, bárhonnan elérhető legyen, esetleg egy dokumentumon többen is tudjanak dolgozni egyszerre. Betöltve a többi lépés nagyjából ugyanígy történne, csak fájlba írás helyett mindig egy kliens-szerver üzenetváltás folyna, például egy-két SQL-utasítás, illetve szerver oldalon az XML módosítás ennek hatására. Továbbá az egyes felhasználók eltárolhatnák maguknak a kedvenc beállításaikat,
például a
kijelölések
színét,
betűtípusát,
stb.
Illetve
az
adminisztrátor felhasználóknak lehetősége lenne egyéb eszközökre is, például két különbözőképpen annotált, eredetileg azonos XML fájl összehasonlítására. A .NET környezet elsősorban a Microsoft SQLServer / SQLExpress adatbázis típust támogatja, illetve még ad lehetőséget Microsoft Access, Oracle vagy
OLE
DB
adatbázisoknak.
Viszont
nem
mindegyik
ingyenes
és
megvalósítható távoli hálózatban. Ezek közül talán az Oracle tűnik a „leghasználhatóbbnak”:
például
tudunk
vele
adatbázisban
tárolt
XML
objektumbeli keresésekre és módosításokra – viszont csak 4 GB méretig ingyenes (és van még egy-két további korlátozása). Ezeken túl használható MySQL és PostgreSQL adatbázis-plugin is .NET-ben, de ezzel az első tesztelés után nem foglalkoztam tovább… A COREF fejlesztésének folytatásakor ugyanezek a kérdések továbbra is fennálltak, tehát egy webszerver és egy adatbázis szerver hozzáférésre volna szükségünk, még akkor is, ha egész más környezetben folytatjuk a fejlesztést. Ez nem fejlesztői feladat, hanem utánajárás, szerver-tulajdonosok megkérdezése, hogy náluk milyen szerver-hozzáférésre volna lehetőség… A későbbiekben kitérek rá, hogy a COREF 2 során hogy sikerült egy ilyen lehetőséget szerezni.
23
Oltványi Gábor József - Diplomaterv
4. Megvalósítás: „COREF”
4.8.5. Webes alkalmazás? Egy további platformfüggetlen megvalósítás volna egy webböngészős alkalmazás, vagyis a már jól bevált HTTP protokollt lehetne használni a kliensünk és a szerver között – hiszen böngésző minden operációs rendszeren létezik, és (kvázi-) ugyanúgy jelenítenek meg mindent (kivéve, amikor a böngészők egyes funkciói nem kompatibilisek egymással, lásd később…). Eleinte több okból is nem ennek a
lehetőségnek álltam neki, viszont a COREF 2 elkezdésekor mégis ez az irány győzött. A COREF 1 folytatásakor praktikus lehetett volna az ASP.NET környezetre való áttérés, hiszen szinte minden algoritmust egy az egyben át lehetett volna emelni a .NET-es programból, mivel az ASP is a C# (vagy Visual Basic) nyelvet használja webes megjelenítés (HTML) generálására. És nem kellett volna lemondanunk a fejlesztőbarát Visual Studióról sem, továbbá ASP-ben is nagyon könnyű az eseménykezelés. Egy régebbi, ám ingyenes, és könnyen hozzáférhető, illetve sokrétűen (pl. fórumokon is) dokumentált másik lehetőség volt a PHP a szerveroldali működés leprogramozásához. Viszont PHP-ban ez előttig nem voltam járatos – mégis emellett döntöttem, és elmélyedve a PHP rejtelmeiben, elkészült a COREF v2…
4.8.6. Szerver- és kliensoldali logika kérdése Bármilyen környezetet is alkalmazva át kell gondolni, hogy milyen eseményt, pl. kattintást hol kezeljünk le. Webes esetben azt a legegyszerűbb megvalósítani, hogy statikusan elküldjük a változásokat, amit a webszerver földolgoz, és visszaküldi a kliensnek (böngészőprogramnak) a változásokat. De, ugye, ez megterhelő, és néha lassú lenne, pláne, ha elakad út közben az adat. Például, ha egy szövegszó színét meg szeretnénk változtatni, akkor elküldenénk a szervernek, hogy ez a változtatás van, és a szerver visszaküldené az új HTML-kódot, amit generált, majd csak ez után fogadja a böngésző, és újra betöltve megjelenítené újra az oldalt.
24
4. Megvalósítás: „COREF”
Oltványi Gábor József - Diplomaterv
Pont ezeknek a fölösleges információ-küldések és teljes újra kirajzolások elkerülésére találták ki a dinamikus HTML lehetőségeket, hiszen a HTML önmagában statikus, csak az oldal újra betöltésekor tud megváltozni a kinézete. Legkorábbi dinamikus böngészős lehetőség a JavaScript. Kicsit tekintsük át a böngészés folyamatát, hogy jobban átlássuk a lehetőségeinket! 1. A böngésző (kliens) elküldi az URL-t az esetleges rejtett „post” adatokkal egy HTTP-kérésben a szerver felé. 2. A szerver a kérést földolgozza („szerveroldali logika”): generál egy megjeleníthető HTML-kódot, 3. amit visszaküld. 4. Ezt a böngésző sorban kirajzolja. 4-5. A JavaScript szerepe ekkor lép érvénybe: betöltés/kirajzolás közben, illetve kirajzolás után még módosíthat a kirajzolandó HTML-elemeken – ezt hívjuk kliensoldali logikának. Mindezt az oldal újra betöltése nélkül, bizonyos események hatására teszi, pl. egérkattintás (onClick), az oldal betöltésének befejeződése (onLoad), stb. Szerveroldali logikával (pl. CGI, PHP, ASP függvények) a szervert dolgoztatjuk meg, és mindig kell egy üzenet-válasz leforgása; a kliensoldalon a böngésző dolgozik sokat a szerver tudta nélkül. Vagyis a JavaScript mindig egy kicsit megdolgoztatja a böngészőt. Nekünk viszont pont ilyenre van szükségünk, hiszen
ez tud egy interaktív szerkesztőfelületet biztosítani. Ha továbbmegyünk, és még inkább meg szeretnénk könnyíteni a felhasználók (jelen esetben a koreferencia annotáló nyelvészek) dolgát, és szeretnénk, hogy minél kevesebbet kelljen várakozni az oldal újra betöltésével (noha
manapság
már
adott
a
szélessávú
internet
szinte
mindenütt),
használhatjuk 2005 óta népszerű váló AJAX (Aszinkron JavaScript és XML) programozást, ami a JavaScriptnek egy speciális használata. Segítségével az oldalunkról a kívánt mértékű információt háttérben küldünk a szervernek, aki földolgozza azt és a lap újra kirajzolása nélkül küldi vissza a válaszinformációt, amit ekkor már a JavaScript tud földolgozni, például kiírhat egy válaszüzenetet, vagy egy adott részét akár újra ki is rajzolhatja az oldalnak. AJAX lehetőségei az ASP 2.0-nak is vannak, amik a Microsofttól megszokott módon kissé sajátosak – viszont nem jutottam el a komolyabb szintű megismeréséig.
25
Oltványi Gábor József - Diplomaterv
4. Megvalósítás: „COREF”
Nemcsak webes fejlesztés esetén, hanem minden szerver-kliens applikáció esetén meg kell határoznunk, hogy szerkesztőprogramunk milyen változásait, eseményeit a szerver vagy a kliens hajtaná végre.
4.8.7. COREF v1 – összegzés A COREF, koreferencia-annotáló eszköz első változata csak helyi használatra alkalmas. Fejlesztésekor mindig a szemem előtt lebegett a felhasználóbarát személet. Javítani, szépíteni még sokat lehetne rajta. Részletesebb dokumentáció sem készült róla, ha igény lenne a COREF 1 továbbfejlesztésére, ekkor ez hátrány. Viszont hatalmas előnye az eszköz elkészítőjének számára, hogy elkészült, és sok kérdést már nem kell újra tisztázni a projekt igénylőjével. A COREF 2 elkészítése után jegyzem meg, hogy abból a szempontból is hasznos, hogy elkészült a COREF 1, hiszen a második verzió elsősorban a hálózati környezeti funkciókra helyezi a hangsúlyt, és így nem mindegyik „offlineszolgáltatása” készült el az eddigiekben. „Offline szolgáltatás”, részfeladat alatt olyan funkciókat érthetünk, amit egyszer kell elvégezni, és utána már nincs szükség, hogy többször is lefuttassuk. Ilyen pl. a cikkekre bontás, az előkészítés, zérónévmás-beillesztés.
26
5. Megvalósítás: „COREF 2”
Oltványi Gábor József - Diplomaterv
5. MEGVALÓ SÍ T ÁS: „COREF V2”
12. ábra: COREF v2 szerkesztés közben A 2008/2009-es tanév második félévében folytattam az idáig bemutatott projektet, viszont sok megfontolás után fejlesztői környezetet váltottam. Részben a projekt igénylőjének
kérésére,
részben
pedig,
mert
könnyebben
megérthető,
újrafelhasználható és továbbfejleszthető egy webes alkalmazás, mint egy sajátos rendszert létrehozni… Viszont, ahogy a 4.8.5, és 4.8.6 fejezetekben is már fejtegettem, egy weblapot lehet számtalan féleképpen létrehozni, vagyis további megfontolásokra és döntésekre is szükség volt, mielőtt bele lehetne kezdeni a tényleges fejlesztésbe. Nem utolsó gond a szerver lehetőségének a kérdése, hiszen szerver tulajdonosoktól kell engedélyt kérni, mert nem minden embernek van saját szervere…
27
Oltványi Gábor József - Diplomaterv
5. Megvalósítás: „COREF 2”
5.1. Környezet Lássuk, milyen eszközöktárból dolgozik a COREF 2. Mivel webes alkalmazás, HTML-ben fog megjelenni, de ezen felül igyekeztem megfelelni a W3C XHTML ajánlásának is. A kinézet könnyű szerkeszthetőségének érdekében CSS stíluslapokat használtam. Az interaktív lehetőségekért a JavaScript felel, ahogy már a fentebbiekben is említve volt. További interakciók könnyítése érdekében az AJAX-os eszközt is fölhasználtam. A feladatkiírásban is említve volt, hogy a szerkesztendő dokumentumok XML formátumban adottak, amikhez egy DTD sémadefiníciós fájl is adott, valamint az XML-dokumentumban való keresésekhez és módosításokhoz szükség van néhány XPath kifejezésre. Az XML-eket már szerver oldalon tárolom, mégpedig azt az utat választottam, hogy egy-egy adatbázis-rekordban. MySQL adatbázist használok, egy távoli Apache HTTP szerveren pedig PHP szkriptek állítják elő a megjelenítendő lapokat. A projekt használatához tehát semmilyen extra telepítésre nincs szükség, és bármilyen operációs rendszeren hozzáférhető, hiszen csak egy böngésző program szükséges hozzá, ami minden gépen van. A fejlesztéshez pedig mindenképpen szükség volt egy szerverre, de szerencsére léteznek helyi gépen futó szerverprogramok is, és még csak hálózat sem kell hozzá. Eleinte tehát az EasyPHP programot használtam, ami a PHPApache-MySQL hármast teszi lehetővé egy helyi gépen, a többi eszközt pedig a böngésző fel tudja dolgozni. A későbbiekben pedig kaptam egy ideiglenes hozzáférést egyetemünk egyik virtuális szerverén, így a munka immár bármikor elérhető a http://firefly.itk.ppke.hu/~gabrosz/coref/ címről. (Megjegyzem, hogy nem ez lesz a végleges helye a projektnek, egyelőre viszont szabadon használható a hozzáférés.)
Amint látható az eddigiekből, mindezek teljesen ingyenesen letölthető,
telepíthető, és korlátlan alkalmazások, és emiatt pont ezek a legelterjedtebbek is. Továbbá számos helyen elérhető mindenféle dokumentáció, tutorial, sőt fórumok is, amelyekből az egyes problémákra általában találhatunk megoldásokat is. Célunknak: a platformfüggetlenségnek is eleget tesz ez a rendszer. Egy ilyen
28
Oltványi Gábor József - Diplomaterv
5. Megvalósítás: „COREF 2”
szerver beüzemelése is egyszerű, bejáratot rendszergazdai feladat, nem úgy, mint ha például Windows Servert kellene karban tartani – így esett ezekre a választás. A továbbiakban ismertetem az egyes felhasznált eszköztárakról megismert tudnivalókat – hiszen a projekt elkészítése során mindegyik tartalmazott számomra kisebb-nagyobb újdonságokat. (Nem szeretnék a részletekbe sem veszni, de amit érdekesnek tartok megemlíteni róluk, azt említem meg itt. A
Felhasznált/ajánlott web linkek fejezetben ajánlom a szabványleírásukat, illetve néhány jól használható tutorialt.)
5.1.1.
HTML, XHTML
(EXtensible) HyperText Markup Language. A HTML az internet szabványos jelölőnyelve. Míg legutóbbi változata, a 4.01-es közel 10 éves, az XML szabványra épülő XHTML 2000 óta versenyzik a HTML-lel. Másfél éve viszont már a HTML 5-ös már teljesen beépíthető az XHTML szabványba, azonosnak tekinthetjük az XHTML5-tel. Lényegében a HTML 4 szigorításaként indult az XHTML, például nincsenek kereszteződő tag-ek, kötelezőek az attribútum értékek is (pl. checked="checked"); valamint hogy ezek "…"-ben legyenek; minden tag-et le
kell zárni, pl. az üres elemeket is:
; a scripteket részek közé kell tenni, hogy helyesen kódolja az értelmező, illetve még számos apróság. Munkámban többnyire igyekeztem követni az XHTML előírásait, hiszen így illik egy komolyabb weblapot létrehozni, viszont a teljesség igénye nélkül tettem ezt, amit a jövőben pótolni fogok.
5.1.2. CSS Cascading Style Sheets. A HTML elemek megjelenését szabályozza, jóval egyszerűbbé teszi a formázások karbantartását. A 2.1-es verzió a támogatott, de a fejlesztés alatt álló 3-as verzió már működőképes több böngészőben is. Lehet konkrétan az egyes HTML elemekre, vagy attribútumaikra (id, class vagy bármelyik) szűkítve is stílust definiálni, illetve néhol az egér-eseményekre is
29
5. Megvalósítás: „COREF 2”
Oltványi Gábor József - Diplomaterv
külön. A legnagyobb örömünkre működik a stílusöröklődés is, továbbá, egy stílust többször is lehet definiálni, illetve egy stílusdefiníciót egyszerre több feltételre (selector)
is
meg
lehet
adni
–
vagyis
ezek
révén
rendszerezni
lehet
stílusosztályainkat, ami az átláthatóságot növeli. Például a projektben az egyes szavakra hasznos volt külön stílusosztályokat definiálnom a zölddel, pirossal aláhúzott, vagy aláhúzatlan, továbbá alap vagy mentett és nem mentett bejelölt antecedensre és anaforára… Ha belegondolunk, ez 3x3x2-3=15 állapot, amit nehéz követni, hogy mikor mi van… CSS fájlomban így rendszereztem őket:
13. ábra: CSS példa - a szövegszavak állapot-osztályaira Ezekben
az
egyes
osztályok
a
„/w[BLR][BLR](ns)?/i”
reguláris
kifejezésnek felelnek meg, ahol B az alapbeállítást, R az antecedens/jobbklikk-, L pedig az anafora/balklikk-információra utal, mellette az „ns”, hogy elmentett állapotban van-e vagy sem a bejelölt koreferencia-elem (kivéve: nincs ez a három: „/wB[BRL]ns/i” stílus).
5.1.3. JavaScript A betöltött oldal dinamizmusáért felel, ahogy már említettem. Lényegében minden HTML elemet objektumként értelmez, és egy fa hierarchiába rendez, amit HTML DOM-nak (Document Object Model) hívnak. Itt a „document” a gyökérelem, és minden XML-szerűen fölépített elem, illetve attribútum vagy szöveges érték elérhető a fa bejárásával. Ha az elemnek van „id” attribútuma, akkor
még
egyszerűbben,
a
document.getElementById("id1")
elemhivatkozással is elérhető (lásd: 14. ábra: HTML DOM – JavaScript ). A szülő, gyerekek, csomópont neve, attribútumok, stb. tulajdonságokat mindegyik HTML elemről el tudjuk érni, (pl. a node.childNodes: a node gyerek node-jainak objektum tömbjét adja vissza). Továbbá minden node elemhez hozzáadja a HTML elem tulajdonságait, eseményeit, (pl. színét, stb.), amit könnyedén le lehet
30
5. Megvalósítás: „COREF 2”
Oltványi Gábor József - Diplomaterv
kérdezni,
illetve
megváltoztatni.
Pl.:
a
document.getElementsByTagName("span").item(2).style.color="blue";
parancs az oldalon szereplő 3. <span> elem szövegszínét kékké teszi. Lényegében így
tudjuk
átrajzolni
az
oldalunk
bármelyik
elemét,
vagy
a
szövegét
megváltoztatni – mindezeket pedig eseményekhez köthetjük, függvényben megírhatjuk,
pl.:
a
scriptfájlban:
elem.parentNode.removeChild(elem);
function }
illetve
close(elem)
a
{
HTML-oldalon:
<span onClick = "close(this)">eltűnök.
A HTML DOM tehát egy weblap elemeit teljesen objektumorientáltan kezeli. Továbbá definiál egyéb objektumokat, mint például a Document, Location, History, Navigator, stb., illetve a fontosabb elemekre, mint például az űrlapok részeire külön elérést is biztosít, pl. document.forms[0].elements[3].value az első űrlap 4. elemének értékét adja vissza.
14. ábra: HTML DOM – JavaScript Meg kell említenünk, hogy a JavaScript motort nem mindegyik böngésző valósítja meg ugyanúgy, nem csak a verzió támogatottságban (pl. Firefox.3: js1.8; Chrome.1, Safari.4: js1.7; Opera.9: js1.5, IE.6: js1.56, IE8: js1.6) , de néha a JavaScript kódok futásában is eltéréseket tapasztalhatunk. Illetve van néhány olyan dolog, amivel például az Internet Explorer kiegészíti a JavaScript-tárát, és a többi böngészőben nem fut, de ugyanígy vannak a többi böngészőre jellemző sajátosságok is. Jó példák erre az egérkattintás eseményei: egyrészt, az egérgomb lekérdezés is különbözik, másrészt egyes böngészők extra-eseményeket rendelnek pl. a jobbklikkhez, vagy a duplaklikkhez, aztán dupla kattintás során valahol nem váltódik ki az egérgomb fölengedés esemény, míg másutt igen (lásd: irodalom)
31
Oltványi Gábor József - Diplomaterv
5. Megvalósítás: „COREF 2”
A projekt fejlesztése során igyekeztem, hogy mind az öt (windows-os) böngészőnél működjön a program, de egy idő után az Internet Explorerről és az Operáról le kellett mondanom… Tapasztalataim alapján a Google Chrome-ot találtam a leghasználhatóbb böngészőnek (persze ennek is sok gyöngéje van), talán azért mert sok olyan eseményre, vagy elérésre is lehetőséget ad, amit a Firefox nem támogat, de például az Internet Explorer bevezetett. Ilyen például egy HTML elem .outerHTML tulajdonsága, vagy az .innerText, ami Firefoxnál .textContent, és kicsit mást jelent…
5.1.4. AJAX, JQuery Asynchronous JavaScript and XML. Az AJAX-ról már említettem, hogy tulajdonképpen ez is csak egy JavaScript függvénytár, aminek speciális használata, hogy az oldal újra betöltése nélkül elküld egy HTTP-kérést a szervernek, és a visszakapott választ földolgozza, akárcsak egy eseményt. Az AJAX 2004-től jutott be a köztudatba a Google Suggest révén, amikor egy kereső mezőbe betűket beírva megjelennek a beírt karakterektől függő keresési javaslatok. Az AJAX alapötlete, hogy egy JavaScript-kódrész az XMLHttpRequest objektum segítségével (aszinkron) kapcsolatba lép a szerverrel, elküld egy kérést, és visszaérkezik egy kis szerver-oldali logika után a válasz, amit aztán föl lehet dolgozni. Tulajdonképpen így el lehet rejteni algoritmusainkat is, mivel nem JavaScriptben, hanem szerveren futtatjuk. Azóta többféle, AJAX-támogatást nyújtó JavaScript könyvtár (azaz függvénycsomag) is született, mint például a JQuery vagy a Prototype, illetve fejlesztő környezeteket egészítettek ki AJAX-elven, így a Ruby on Rails vagy a Google Web Toolkit. A projektben is használtam (eddig) két helyen AJAX-ot. Megvalósítottam, hogy a háttérben is el tudja menteni az oldalon történt változásokat, illetve az XML dokumentum fájlként való letöltésekor (exportálásakor) is a háttérben olvassa ki az adatbázisból a legutóbb elmentett XML dokumentumot, amit föltesz egy ideiglenes mappába a szerveren, és az elérési útját visszaküldi a böngészőnek, ahol egy script megjeleníti a letöltés gomb alatt a megfelelő linket. Mindezt a JQuery könyvtár segítéségével oldottam meg: le kellett tölteni a
32
5. Megvalósítás: „COREF 2”
Oltványi Gábor József - Diplomaterv
http://jquery.com/ oldalról a jquery.js fájlt, belinkelni a HTML-ünkbe, és máris meghívhattuk
a
$.post(
URL,
JSONdata,
function(data)
{
dataHandler(data); } ); metódust, ahol az URL a szerveroldali kezelő fájl
elérési útja; a JSONdata egy JSON objektum (lásd: JSON fejezet), ami tartalmazza a küldendő név:érték párokat; a függvényen belül megadott dataHandler(data) pedig a data sztringben visszaérkező választ dolgozza föl,
feltéve, ha ezt a függvény létezik a szkriptjeim között.
5.1.5. JSON JavaScript Object Notation. Ez egy általános adatszerkezet jelölés, amit kiértékelve a fordítóprogram létre tud hozni egy bármilyen komplex objektumot. Számos programozási nyelvre létezik megvalósítása. JavaScriptben például így néz ki: json={"nev1": [ {"tomb11": "ertek11", "tomb12": "ertek12" }, {"tomb21": "ertek21", "tomb22": "ertek22" } ], "nev2": "ertek2" };
Egy ilyen adatszerkezetben küldöm el háttérben mentéskor az űrlap összes mezőjét, illetve azokat a változásokat, amik a szerkesztés eredményei.
5.1.6. XML, XPath, DTD EXtensible Markup Language. Egy nagyon hasznos és elterjedt, hierarchikus információkat tárolni képes jelölő nyelv. Szinte az összes programozási nyelv támogatja a benne való keresést (például XPath-szal), illetve a bejárását. Mindezeket az algoritmusokat megkönnyíti, ha megadunk hozzá egy DTD (Document Type Definiton), vagy egy XSD (XML Schema Definiton) fájlt, ami az XML-ben használt lehetséges tag-ek és attribútumok típusait írja le. Adott volt, hogy XML-t kell földolgoznom: megjeleníteni, illetve módosítani kellett. Kliens oldalon a JavaScript is fel tud dolgozni XML-t, az XHTML akár maga is lehetne az XML tartalmilag (és akkor egy XSLT stíluslap transzformáció segítségével konvertálhatnánk megjeleníthető formában), de szerveroldalon a PHP is ugyanúgy kezelni tudja az XML-t, sőt, ahogy már tettem rá utalást, az Oracle adatbázis már azt is lehetővé teszi, hogy egy XMLType típusú objektumként tároljunk XML-t, és benne lekérdezéseket (XQuery-ket) hajtsunk
33
5. Megvalósítás: „COREF 2”
Oltványi Gábor József - Diplomaterv
végre. Vajon melyik szinten volna optimális az XML feldolgozása ebben a projektben?
5.1.7. PHP Hypertext Processor. Ingyenessége, dokumentáltsága, és egyszerű használata miatt talán a legelterjedtebb szerveroldali szkriptnyelv. Az első szerveroldali programozási lehetőség, a CGI-ben használatos Perl nyelvből, és a szintén népszerű
C
nyelvből
kölcsönzi
nyelvi
eszköztára
nagyját.
Számtalan
megvalósított függvénye van, sokszor ugyanarra a jelenségre több függvény is használható. Objektumokat itt is lehet létrehozni, de jóval kevésbé objektumorientált, mint mondjuk a JavaScript. 1995-től létezik, és egy hónapja jelent meg az 5.3-as verzió. A projektben pedig legalább az 5.2-esre van szükség (ami már csaknem 3 éves), mivel az XML kezelését a PHP-ra bíztam, és van néhány olyan XML-kezelő függvény, ami csak az 5.2-es változattól kezdve érhető el.
5.1.8. MySQL Ingyenes, elterjedt, viszont nem túl fejlett, de az alapvető funkciókat biztonsággal ellátó adatbázis-kezelő rendszer. Ebből is az 5. főverzió fut. Több táblát is létre kell hozni a projekt adatbázisához, egyeseket össze is kell kapcsolni, amit a FOREIGN KEY hivatkozással lehetne megoldani. Ezt a parancsot be is írtam a MySQL-nek, és nem is írt ki rá hibát, viszont semmi jelét nem láttam, hogy ez funkcionális volna… Ugyanis a MySQL alapból nem támogatja ezt a funkciót, csak ha kiegészítjük az ún. InnoDB-vel. Ebbe nem mentem bele, mert annyira nem lényeges eleme a projektnek, viszont a későbbiekben lehetne az adatbázist ezzel is följavítani. (Az adatbázisom fölépítéséről később írok.)
5.2. Lehetőségek megvalósításra A COREF 1 program .NET-ben íródott, ami sok szempontból nem volt megfelelő – például telepíteni kell hozzá, és még csak nem is platformfüggetlen. Ezért kellett koncepciót váltani, és egy olyan, még mindig felhasználóbarát környezetben
34
Oltványi Gábor József - Diplomaterv
5. Megvalósítás: „COREF 2”
dolgozni tovább, ami a legegyszerűbben követhető, javítható, illetve mindezek mellett még ingyenes és platformfüggetlen is. Eldőlt, hogy egy webes alkalmazás lesz erre a legalkalmasabb. Ám ekkor is még sok nyitott kérdés állt előttünk. A Microsoft ASP.NET-es webtechnikák nagyon vonzóak voltak, de mivel nem ingyenes, és Windows Servert sem sikerült időben beszerezni, a hagyományos, de annál robosztusabb PHP felé kellett fordulni. Még mindig kérdés az adatbázis lehetőség, hiszen az Oracle elég vonzó, és az XML-feldolgozási lehetőségét is kínálja, viszont csak 4 GB adatbázis méretig ingyenes. Ezzel szemben nekünk rengeteg adatra, XML-dokumentumra van szükség, azoknak is különböző változataira, amiket ha adatbázisban akarunk tárolni, jelentősen felduzzasztja az adatbázis méretét. Lényegében emiatt és az EasyPHP minden gond nélküli föltelepíthetősége miatt a későbbiekben már elvetettem minden Oracle-ös gondolatot, noha hozzá képest a MySQL gyakran igen primitív (lásd: foreign key-ek)… Most már csak az a két kérdésünk maradt, hogy hol tároljuk a szerkesztendő és szerkesztett XML dokumentumokat, illetve, hogy a projekt mely funkcióit lássa el a szerver-, és melyeket a kliensoldal. Ha a kliensoldalon akarnánk tárolni az XML-t, amit a JavaScript dolgozna föl, mindig föl és le kellene töltögetni a fájlokat (feltéve, ha magunk között közzé akarjuk tenni), ami minden alkalommal kicsit elavult érzéseket kelt…
Szerveroldalon pedig két
lehetőség adódik: a szerver fájlrendszerében, illetve az adatbázisban tárolni az
XML-jeinket. Talán a levédhetőség és az adatok integritása helyezi mérlegre a nagyobb súlyokat az adatbázis oldalára. Pláne, ha verziókat is követni kell, sokkal egyszerűbb minden XML-lel kapcsolatos információt az adatbázisban tárolni. Tehát, miután a felhasználó bejelentkezett, kiválaszthatja a szerkeszteni kívánt XML dokumentumot, amit kiolvas az adatbázisból a PHP, megkeresi azonosítókkal a szavakat és írásjeleket, amiket lineárisan megjelenít, elküld a kliensnek, ahol kattintgatással összegyűlik egy változtatni-való-lista, amit a dokumentum mentésekor az adatbázisban frissítünk. Praktikus tehát a
35
5. Megvalósítás: „COREF 2”
Oltványi Gábor József - Diplomaterv
felhasználó minden módosítási szándékát egy listában összegyűjteni, és csak ezt a listát visszaküldeni a szervernek, amikor menteni szeretnénk. Az XML-ből HTML generálás talán a leghosszabb feladat, ezek mennyiségét is lehet csökkenteni néhány AJAX-os mentéssel. Elénk tárult egy újabb kérdés is: hiszen a PHP az XML dokumentumok kezelésére számos megvalósítást nyújt. Vajon melyiket praktikus használni? Mik ezek a lehetőségek? Egyik a DOM (DOMNode és belőle származtatható elemek, a megfelelő bejáró és lekérdező függvényekkel), egy másik a SimpleXML (tényleg egyszerű,
létrehozzuk
a
SimpleXMLElement
gyökérelemet
és
objektum-
orientáltan bejárhatjuk az egész XML-t, módosítani is tudunk), XML Parser (ez kicsit bonyolultabbnak tűnik, régebbi megvalósítás), illetve az XMLReader és
XMLWriter osztályok (melyekkel a lineáris bejárás és módosítás oldható meg). Munkámban a SimpleXML-t választottam, és ez pont elég is volt a teendőkhöz, nem volt szükség a bonyolításra.
5.3. A megvalósítás Jelenlegi
változat
tehát
a
http://firefly.itk.ppke.hu/~gabrosz/coref/
oldalon
tekinthető meg (egyelőre). Lássuk, hogy mire ad lehetőséget ez a program! (Alapvetően megjegyzem, hogy mivel még nem indult be a projekt, amiben ez az eszköz föl lesz használva, sok helyen még nincs leszögezve a konkrét felhasználói igény, ami miatt a jelen, beadott weblapon több helyen hiányosságok fordulnak elő, vagy a későbbiekben megváltozhat egy-két funkció…)
5.3.1. Felhasználók, jogosultságok Egy szokásos „loginbox” teszi lehetővé, hogy be tudjunk jelentkezni az oldalra (Login), vagy ha még nincs felhasználói fiókunk, hozzunk létre egyet (Register). Ha pedig elfelejtettük bejelentkező jelszavunkat, lehessen valahogy emlékeztetőt kérni, vagy új jelszót generáltatni.
15. ábra: Loginbox - be/kijelentkeztető doboz: a túloldalon
36
5. Megvalósítás: „COREF 2”
Oltványi Gábor József - Diplomaterv
Négy (plusz egy) féle felhasználói szintet definiáltam: az adminisztrátor (admin), a főnök (manager), a sima felhasználó (user), és a vendég (guest), illetve be
nem
jelentkezettek
jogosultságaik
vannak,
(not-logged-in). amiket
az
Mindegyik adatbázisból
szintnek
különböző
szabályozhatunk:
engedélyezhetünk és tilthatunk bizonyos szerepköröknek egy-egy funkciót, azaz egy-egy oldal megtekintését. Minden oldal betöltésének az elején egy szkript ellenőrzi az adott felhasználó jogosultságait, és csak akkor engedi tovább, ha van joga megnézni az adott oldalt, egyébként megjelenik a loginbox. (Ezt az opciót az oldal php scriptjének elejére beírt $noVisibilityCheck = true; parancs tiltja le.) Bejelentkezéskor létrejön egy session (munkamenet), ami addig fennáll, amíg a felhasználó ki nem jelentkezik, vagy be nem zárja a böngészőt. Így a „isset($_SESSION['user_uid'])” PHP parancs mindig megmondja, hogy bejelentkezett-e már a felhasználó, és az azonosítója is innen kérhető le. Egyelőre nem titkosított csatornán keresztül történik a bejelentkezés, de a későbbiek folyamán, ha erre lesz igény, hozzátehető a projekthez.
5.3.2. Az adatbázis A projekt adatbázis tábláiról és attribútumairól lásd az egyed-kapcsolat diagramját a 16. ábra. Még igény szerint bővíthető tulajdonságokkal, például, ha majd a felhasználó testre fogja tudni szabni, hogy milyen megjelenésű, nyelvű, stb. legyen a saját oldala. A jelszó ellenőrzése a PASSWORD('***') MySQL függvénnyel történik, ami tapasztalataim szerint MySQL verziónként különbözik, ugyanis amikor a felhasználói adatokat átmásoltam a saját gépemen futó EasyPHP-s adatbázisból a webszerveren futó adatbázisba, ott már nem fogadta el a megfelelő jelszót bejelentkezéskor… Ha ott újra regisztráltam, és megnéztem a kódolt jelszót, egészen más kódolt sztringet kaptam. Hogy ne legyen ebből gond, tesztelési időre megelégedtem azzal, hogy a felhasználói adatok webes adatbázisba másolása után lefuttattam az „UPDATE PASSWORD(`uName`);”
`user`
SET
`uPwd`
=
SQL-parancsot, amivel minden felhasználó megkapta a saját
felhasználónevét jelszóul. De a későbbiekben lehet még módosítani, általánosítani a jelszó ellenőrzésen.
37
Oltványi Gábor József - Diplomaterv
5. Megvalósítás: „COREF 2”
16. ábra: A COREF v2 adatbázisának EK-diagramja
5.3.3. Menüpontok A menüpontok listázására egy külön modult fejlesztettem ki, hogy a felhasználó jogosultságainak megfelelő menüsort adjon neki (e jogosultságok az adatbázis
Rights táblájában adminisztrálhatók, a menü feliratok pedig a Pages táblában). Kijelentkezve (nli, not-logged-in) csak a bejelentkezéssel kapcsolatos menük jelennek meg, illetve a nyitólap és a súgó menü. A vendég felhasználó (guest) meg tudja nézni a saját felhasználói adatait, de még nem tudja szerkeszteni. És tud néhány „demo” XML dokumentumot szerkeszteni is, amit nem tud elmenteni. Egy jóváhagyott felhasználó (user) már tudja szerkeszteni saját adatait, tud saját verziókat létrehozni és elmenteni XML dokumentumokból (a CanEdit adatbázis táblában leírtaknak megfelelően), fel tud tölteni XML-fájlt, (és jelenleg még elérhető neki a zérónévmások automatikus fölismeréséhez szükséges listát generáló oldal is, de ez a funkció még változni fog, lásd később) .
Egy manager szerepkörű felhasználó ezeken túl tud törölni XMLdokumentumokat, össze tudja hasonlítani egy dokumentum többféle szerkesztett változatát, és meg tudja tekinteni az oldalakat „user”-, illetve „guest”-nézetben is.
38
5. Megvalósítás: „COREF 2”
Oltványi Gábor József - Diplomaterv
Az admin felhasználó pedig mindezeken túl képes szerkeszteni az egyes felhasználók adatait, vissza tudja állítani a(z ideiglenesen) letörölt XMLdokumentumokat, vagy véglegesíteni tudja a törlést. Mindegyik felhasználó számára elérhető a Help menü, amire kattintva az előzőleg betöltött oldalhoz tartozó súgó menü jelenik meg, aminek az információi a Pages adatbázis táblából olvashatóak ki.
5.3.4. XML szerkesztése Tulajdonképpen ez az a rész, ami már a COREF 1-ben is elkészült, az eddigi menüpontok a hálózati környezet megvalósításáról szóltak.
5.3.4.1. XML-dokumentum kiválasztása (Choose XML) Ezen az oldalon (view.php) megjelenik egy lista, ami az eddig létrehozott dokumentumok alap információit hordozza, vagyis a dokumentum azonosítóját, címét,
verzióját,
létrehozóját,
utolsó
mentését,
és
a
megjegyzését.
Ha
választottunk a listából (dupla kattintással, vagy kijelölve, és alul a jóváhagyó gombra kattintva), akkor fog betöltődni a megadott XML-dokumentum az adatbázisból.
5.3.4.2. XML beolvasása Röviden a szerveroldali algoritmusról, ami az XML-ből beolvasott szöveget megjeleníthető formába generálja: az "//w|//c|//p" XPath kifejezéssel a $wcp változóba mentjük az összes <w> szó vagy
be,
ha
akkor
kiírjuk
a
whitespace-ektől
megtisztított
szövegtartalmát, ha pedig <w>, akkor generálunk neki egy <span>-t a megfelelő attribútumokkal és eseménykezelőkkel, valamint ezen belül egy nem túl szabályos
39
Oltványi Gábor József - Diplomaterv
5. Megvalósítás: „COREF 2”
$x = 0; $data = array(); $wcp = $body->xpath("//w | //c | //p"); while(list( , $node) = each($wcp)) { if ($node->getName()=="p") // data[$x] =
<span class="wRB" id="Nepszava.1.1.2.2.g6" onMouseUp="wMouseClick('Nepszava.1.1.2.2.g6', 'NP', event)" onMouseOver="wMouseIn('Nepszava.1.1.2.2.g6', 'NP')" onMouseOut="wMouseOut(this)" title="Nepszava.1.1.2.2.g6 referencing to: Nepszava.1.1.1.15 (REPEATED) Nepszava.1.1.2.2 Nepszava.1.1.2.1 Nepszava.1.1.2 Nepszava.1.1 Nepszava.1">ország
/>
5.3.4.3. XML-dokumentum szerkesztése (Edit XML) Tulajdonképpen ez a leginteraktívabb felület, és a lehető legnagyobb mértékben igyekeztem a COREF 1-hez hasonló mintájú és logikájú szerkesztési lehetőségeket támogatni. Nézzük egy kicsit részletesebben. Egy böngésző információ jelenik meg fölül, ami megmondja, hogy mennyire van támogatva az a böngésző, amivel éppen megjelenítjük a lapot.
40
5. Megvalósítás: „COREF 2”
Oltványi Gábor József - Diplomaterv
Baloldalon
a
szópanel jelenik meg, jobboldalon menü
pedig
a
lehetőségek,
illetve alatta a választó listák,
amiből
majd
koreferenciakapcsolatokat létrehozni.
lehet (A
későbbiekre van egy új terv a kinézetre, így módosulni fog az itt leírt elrendezés.) Antecedensnek és
anaforának bal, illetve jobb kattintással lehet megjelölni egy adott szószerkezetet, amik
zöld,
illetve
piros
aláhúzással jelennek meg, és a
jobb
oldali
listákból lesznek
választó
módosíthatóak a
szószerkezetek
egyes szintjei. A zöld, piros és
kék
beállítása
választó
listák
után
[Make
a
CoRef!]
gomb
megnyomásával
lehet
fölvenni a koreferenciát, ám ekkor
még
ideiglenes, formában
csak
nem jön
az
mentett
létre
(vastag
betűs).
A
szópanelon
történő
egér-mozgás
következtében különböző helyeken megjelennek információk az adott szóról, illetve,
ha
van
koreferencia-kapcsolata, akkor kap egy háttérszínt is, ami megkönnyíti az átláthatóságot.
41
5. Megvalósítás: „COREF 2”
Oltványi Gábor József - Diplomaterv
5.3.4.4. Koreferenciák törlése
Alul egy táblázat foglalja össze a dokumentumban eddig elmentett vagy még el nem mentett koreferencia kapcsolatokat – ez az információ mindig követi a kattintásokat, tehát egy nagyon dinamikus rész. Ha itt rákattintunk az egyik sorra, fölugrik a megfelelő bekezdéshez a szövegpanelon, és megvilágítja a kattintott koreferencia antecedensét és anaforáját. Továbbá ekkor visszatöltődik a listázó felületekbe is a koreferencia-kapcsolat információja. Ilyenkor lehet
eltávolítani egy koreferenciát, amikor így ki lett jelölve – ha a listázó felület alatti „Remove Coref if exists” szövegre kattintunk. Nem mentett koreferenciát azonnal
eltávolítja,
koreferenciát
a
mentett
dokumentum
mentésekor. Továbbá törölni úgy is lehet, ha az alsó összesítő táblázat
első
előhívjuk
a
oszlopából
jelölőnégyzeteket,
kijelölünk néhány sort, és a jobb szélen megjelenő [Remove All Checked] gombra kattintunk.
5.3.4.5. XML mentése, exportálása Az XML-szerkesztő oldal jobb fölső
mezőjét
megtekintve
láthatjuk a dokumentum címét,
42
5. Megvalósítás: „COREF 2”
Oltványi Gábor József - Diplomaterv
verzióját, szerzőjét, és a hozzá fűzött megjegyzést. Ezekből, ami szerkeszthető információ, azt a feliratokra kattintva szerkeszteni tudjuk: egy-egy szövegdoboz jelenik meg a felirat mögött, amiből eltávolítva a fókuszt visszaalakul a megfelelő szövegű felirattá. Ekkor viszont még nincs elmentve a megváltoztatott cím. Oldalt a [Save
XML]
gomb fogja a mentést elindítani, amivel
alapértelmezésben újra be fog töltődni az oldal. Ha viszont kipipáljuk az alatta lévő „in
background” feliratú jelölőnégyzetet, és így
próbálunk menteni, akkor egy AJAX-kéréssel a háttérben fogja az oldalt elmenteni,
aminek
a
sikeréről
kiír
egy
üzenetet
az
oldal
tetején.
Ha le akarjuk tölteni a mentett XML-t, a [Download
XML]
megnyomásával
az
alatta
lévő
szövegmezőbe beírt fájlnevű fájlt fog generálni szintén egy AJAX-kérés a háttérben a szerveren, aminek a linkjét a szövegmező helyett jeleníti meg – ezt jobbklikkel tudjuk lementeni magunknak, bal klikkel pedig töröljük az ideiglenesen generált fájlt. Ha pedig zavarna ez a menü-mező nagy térfoglalása, kattintsunk a jobb fölső sarokban lévő [^] ikonra, és fölgördül a doboz egy csíkká, amit ugyanúgy visszagördíthetünk a [v] ikon segítségével.
5.3.5. Offline részfeladatok Azokat nevezhetjük „offline” feladatnak, amiket egyszer kell végrehajtani a Szeged Treebank földolgozása során, és utána már nem fog kelleni ezeket a újra elővenni.
43
Oltványi Gábor József - Diplomaterv
5. Megvalósítás: „COREF 2”
5.3.5.1. Cikkekre bontás A COREF 2-höz eddig még nem készült el a cikkekre bontás, viszont ez elérhető a COREF 1-ből is, ami ott helyesen működik. Talán emiatt nincs is szükség a COREF 2-ben rá. Sőt, a 4.3.1. fejezetben olvashatóan egy Python-script is megteszi ugyanezt.
5.3.5.2. Betöltés előtti előkészítés A COREF 2-höz eddig még nem készült el a betöltés előtti előkészítés (a feladat ismertetését, értelmét lásd a 4.4. fejezetben). Viszont a COREF 1-ben ez is elérhető. Noha nem hajtható végre tömegesen sok fájlra az előkészítés, de helyesen működik. A későbbiekben lehet, hogy bekerül a COREF 2-ben is, vagy legalább egy tömegesen elvégezhető változat a COREF 1-ben.
5.3.5.3. Zérónévmások automatikus beszúrása Az előzetes terveket lásd a COREF 1-nél, a 4.6.1. Automatikus zérónévmás-
felismerés fejezetben. Ez annyiban módosult, hogy a MorphoLogic cégnél elkészült egy program, ami alapvetően gépi fordítást végez, és kiegészült nemrég egy zéró elemeket fölismerő modullal is. Vagyis meg kell neki adni egy mondatot, amit ő lefordít, és a végére kiírja a zéró elemeket. Ha tehát tagmondatokra („CP”-kre) lebontom a szintaktikailag elemzett XML-eimet, és ezeket kigyűjtöm egy fájlban soronként, akkor az említett program elvégzi minden sorra a fordítást, és visszaadja a hiányzó elemet, annak mondattani esetével (NOM, ACC). Ezt a visszakapott információt aztán én tovább földolgozhatom hasonlóan, mint ahogy a 4.6.1. fejezetben terveztem, vagyis megnézve a tagmondat állítmányának számát és személyét, beszúrom mögé a megfelelő számú és személyű, illetve esetű személyes névmást. Egyelőre erről még nem érkeztek meg a tagmondatok fordításai a zéró elemekkel, így csak a tagmondatok generálását oldja meg a projekt „Zero Pronouns” menüpontja. De mivel ez is „offline szolgáltatás”, a későbbiekben
módosulhat a funkciója.
44
5. Megvalósítás: „COREF 2”
Oltványi Gábor József - Diplomaterv
5.3.6. Kódolás Mivel a PHP-ben használt XML-kezelő SimpleXML kiterjesztés az UTF-8-as kódolást preferálja, és az adatbázis „illesztésének”, vagyis mezőinek kódolásának lehetőségei közül is az utf8_hungarian_ci van elsősorban támogatva, eleinte fontosnak tartottam, hogy ezt kövessem, hogy ne legyen semmi kódolásbeli gond. Viszont a megadott Szeged Treebank XML-ei Latin 2-es (ISO-8859-2) karakterkészletet használnak, ami ezzel ellenkezik, de sikerült megoldanom, hogy a kellő időben a kellő konverziók (utf8_encode, utf8_decode) végrehajtódjanak, és így visszakapjuk a megfelelő kódolású szövegeket. A HTML-lap kódolása is mindig UTF-8-as a fent említett okok miatt. Mivel
a
forráskód-szerkesztő
programok
alapértelmezésként
ANSII
szövegfájlokat hoznak létre, szükséges minden új weblap-fájlunkat BOM nélküli UTF-8-as kódolásra konvertálni. (BOM: a szövegfájl elejére beilleszti egy Byte Order Mark-ot, ami bizonyos helyeken szükséges, viszont a PHP nem tudja értelmezni, ezért e nélkülivé kell átalakítanunk a szövegfájljainkat…) A későbbiekben lehetne egyszerűsíteni a felhasznált kódolásokon.
5.4. Böngésző sajátosságok és megoldások Ebben a fejezetben az általam használt böngészők megismert és figyelemre méltó sajátosságait,
eltéréseit
foglalom
össze,
illetve
az
ezekre
talált
(pót-)
megoldásokra is kitérek. Ezek hasznosak lehetnek azok számára, akik még nem találkoztak a böngészők számtalan inkompatibilitásával… Az általam használt, tesztelt böngészők: Microsoft Internet Explorer 8.0, Opera 9.64, Mozilla Firefox
3.0.10, Google Chrome 2.0.172, Apple Safari 5.28. Linuxon és Macintoshon még nem teszteltem, de mivel a Firefox, Opera és Safari platformfüggetlen, vélhetően ott is működni fog a weblap. A fejlesztés során elhagytam az Internet Explorer és az Opera támogatását, mivel ezek eléggé különböznek a Netscape-böngészőktől. Internet Explorerben, egy JavaScript fájlban a globális változókat nem tudom simán elérni, mindig meg kell adni, hogy window.GlobalVariable. A statikus vagy beépített változókat/objektumokat, mint pl. az „event”, ha átadjuk
45
5. Megvalósítás: „COREF 2”
Oltványi Gábor József - Diplomaterv
egy függvénynek, aminek a paraméterei között megadjuk a neki megfelelő változót, pl. function handler(e) { e.which; event.button; }, akkor a függvényen belül Chrome-mal megérti, ha event-ként hivatkozok az eseményre, a Firefox viszont nem ismeri az event helyi változót. Az egérkattintás eseménykezelésére praktikus egy böngészőfüggetlen függvényt megírni, hiszen minden böngésző máshogy kéri le a gombokat:
17. ábra: Böngészőfüggetlen eseménykezelő függvény a kattintó egérgomb lekérdezésére Az Operában fontos motívum a helyi tartalom szerinti jobbklikk-menü lehetősége. Ezért az egér-jobbklikk hatását, illetve egy szöveg kijelölését sehogy nem lehet letiltani JavaScripttel, amit másutt az oncontextmenu="return false"
illetve
az
attribútummal
onselectstart="return
tudnánk
false"
elérni.
opera:config#UserPrefs|AllowContextMenus, opera:config#System|DisableTextSelect
beállítási
eseménykezelő
Ezeket
az
illetve
az
oldalakon
tudjuk
globálisan engedélyezni vagy letiltani. Továbbá, a bal-duplaklikk hatására egy másik helyi menü jön elő, amit szintén nem lehet letiltani, csak a haladó beállítások eszköztárak menüjében… Még nem jutottam a megvalósításáig, de ötletként fölmerült, hogy az egér eseményeinek általános, dokumentum-szintű kezelésekor lehetne a jobbklikk-helyi menü tiltást beszúrni. Hasonlóan Firefoxban és Safariban nem lehet a letiltani egy weblap vagy egy
részén,
hogy
a
felhasználó
ki
tudjon
jelölni
a
szöveget
(onselectstart="return false"). Ezt egy nem szabványos, böngésző-függő CSS-tulajdonsággal lehet mégis elérni: „-moz-user-select: none; -khtmluser-select: none;”. (Internet Explorerben ugyanez: „user-select: none;”)
Ez oldotta meg azt a Safari-sajátosságot is, hogy jobb kattintásra egy szó kijelölődjön a helyi menü megjelenésével.
46
5. Megvalósítás: „COREF 2”
Oltványi Gábor József - Diplomaterv
Ha fix szélességű táblázat cellákat szeretnék megvalósítani, viszont a cellába írandó tartalom meghaladja az adott szélességet, akkor lehetőség adódik az overflow: auto; tulajdonság révén, hogy görgethető legyen a cella tartalma. Ám ezt minden böngésző máshogy értelmezi, például a Chrome kiteszi rendesen a 16 pixel széles scrollbart, a Firefox pedig táblázat-cellára nem engedélyezi ezt a tulajdonságot, hanem a túlcsorduló szöveget a mellette lévő cella fölé írja. Firefoxban lehetne azt is csinálni, hogy a határolókon belülre mégegy
ez fölöslegesnek tűnik. Egyébként ekkor a Firefox nem teszi ki a scrollbart, de a középső egérgombot lenyomva és húzva az egeret, arrébb tud mozdulni a túlcsorduló szöveg. Mindezek miatt egy olyan megoldáshoz folyamodtam, hogy az olyan szöveget, ami túl tudna csordulni egy fix szélességű cellában, betűnként szétválasztom
nulla-szélességű
szóköz
karakterekkel
(ZWSP,
zero-width
whitespace). Ekkor a túlcsorduló karakterek új sorba fognak kerülni minden böngészőben, kivéve Internet Explorerben, de azt egyelőre úgysem támogatjuk a projektben. Nem biztos, hogy ez az ideális megoldás, hiszen ha valaki ki akarja másolni ezt a ZWSP-ekkel tagolt szöveget és máshova beillesztené, akkor az nem mindig lesz jó neki. Erre a későbbiekben keresek megoldást, pl. a vágólapra másolás eseménykezelőjébe kellene beiktatni egy visszatranszformálást… Az Internet Explorer nem ismeri a legördülő menüknél a disable tulajdonságot, amivel le lehetne tiltani, hogy kijelölhető legyen az adott érték. Már említettem a javascriptes HTML-objektumok .innerText, illetve Firefox esetében .textContent tulajdonságának különbözőségét. Egy példa:
id="id1">szövegrész
IE és Chrome esetében az
elem=document.getElementById("id1"); elem.innerText értéke a „szöveg”
lesz, Firefoxnál az elem.textContent értéke a „szövegrész”. Az ezekkel való vesződés helyett javaslom a DOM-kifejezéseket: az elem.firstChild(), illetve a for (e in elem.childNodes) elem.childNodes[e]… bejárást.
47
5. Megvalósítás: „COREF 2”
Oltványi Gábor József - Diplomaterv
Az aposztrófok bármelyike használható PHP-ban és JavaScriptben is, ám egy praktikum, hogy "" esetben a "\n" sortörést szúr be (míg a '\n' nem), illetve PHP-ban egy változót is megadhatunk ""–ös szövegen belül: "vmi$var vmi". Ha egy HTML-elem id vagy name attribútumának értéke megegyezik az eseménykezelőjében megadott függvénynévvel, akkor nem fogja tudni értelmezni a böngésző, pl.: A Szeged Treebank előkészítés utáni XML-eiben gyakran előfordul egy olyan
jelenség,
hogy:
„
id=…g6><w>arab
5.5. Hogy teljes legyen a projekt… A fejlesztés szempontjából kisebb prioritású, de a felhasználói élményt fokozó apróságokon kívül az olyan dolgok is hátra vannak, amik még nem lettek letisztázva, hogy hogyan legyenek. Ilyen az egyes menüpontok konkrétabb testreszabása, az egyes működések praktikusabbá tétele, a verzió számozás kitalálása, illetve (noha az nem szükséges, de) az annak elérése, hogy ki lehessen tenni az AnyBrowser, illetve a W3C Valid ikont is… További szépítés lenne, ha a felhasználó beállíthatná magának néhány színt, vagy betűtípust, akár egy saját (részleges) CSS fájlból. A későbbiekben lehetne támogatni a többnyelvűséget, amihez egy nagy címke adatbázis-táblára lenne szükség, és minden feliratot minden oldalon onnan olvasna be. Ezt akár az adminisztrátorok számára szerkeszthetővé is lehetne tenni. Valamint már
48
5. Megvalósítás: „COREF 2”
Oltványi Gábor József - Diplomaterv
megszületett a fejemben egy új elrendezése a szerkesztőfelületnek, ami jobban átláthatóbbá tenné az amúgyis elég szűkös helyet. Programozási szempontból pedig újra át lehetne gondolni a megvalósítási választásaimat, illetve az algoritmusokat – hiszen rejteget még a JavaScript számomra lehetőségeket, jobban ki lehetne használni az eszköztárát. Például, a dokumentum szintű eseménykezelők bevezetése, eseményekre való föliratkozások (megfigyelők) létrehozása, és még több AJAX-os művelet. Továbbá kellene még
tesztelni, hogy a hibákat szűrjük. A JavaScript függvényeket csoportosítva, külön fájlba szedni, hogy jobban át lehessen látni őket, illetve a nem használatos függvényeket eltávolítani, a hasznosakat pedig dokumentálni. Ezeken túl át lehetne
gondolni,
hogy
megérné-e
HTML-generáló
algoritmust
átírni
hierarchikusabb formába, ahogy az előző fejezet végén is említettem.
49
6. Összefoglalás
Oltványi Gábor József - Diplomaterv
6. ÖSSZEFO G LALÁS Elkészült tehát a COREF, a koreferencia-annotáló hálózati eszköz. Egy korábbi verziója, a COREF 1 csak helyi munkára alkalmas, de egyes „offline” feladatiban praktikusabb, mint a COREF 2. Az utóbbi pedig teljes körűen támogatja a csoportmunkát, vagyis a hálózaton keresztül felhasználók nyilvántartását, a munkák elkülönítését és menedzselését. Eszközünk
segítségével
a
Szeged
Treebank
2.0
XML-jeit
tudjuk
földolgozni, mégpedig koreferencia kapcsolatokkal tudjuk annotálni a már meglévő dokumentumait. Mindezt interaktívan, gyorsan tudjuk elvégezni, hiszen programunk a felhasználóbarátság alapelvével készült. A nagyméretű XML-fájlokat logikus földarabolását a COREF 1 elvégzi. Zérónévmások kézi beszúrására szintén alkalmas a COREF 1, megtalálásuknak automatizálására egy külső (ám csak engedéllyel hozzáférhető) program segítségével lehet megvalósítani (amiről a dolgozat beadásakor még nincs eredmény). A hatékony eszköz alkalmas lesz egy későbbi, nagyméretű kutatást megalapozni. A Szeged Treebank szövegeit végig annotálva egy tanulóhalmazt hozhatnak majd létre nyelvész szakértők, amiken tanuló algoritmusokat végrehajtva lehetőség nyílhatna a koreferenciák automatikus föloldására. Ez utat adna további számos mesterséges intelligencia témakörébe tartozó újabb kutatás számára, például ilyen az információkivonatolás.
50
Oltványi Gábor József - Diplomaterv
7. Irodalomjegyzék
7. IRODALO MJEGYZÉ K 7.1. Felhasznált/ajánlott irodalom – a Szeged Korpusz 1.0, 2.0, ill. a Szeged Treebank 1.0 és 2.0 leírások, és a Treebank XML-ei, készítették: SZTE, Informatikai Tanszék, Nyelvtechnológiai Csoport, MorphoLogic Kft. Budapest , MTA Nyelvtudományi Intézet, Korpusznyelvészeti Osztály Leírás: http://www.inf.u-szeged.hu/projectdirs/hlt/ (Letöltés menüpont) – Miháltz, Márton: Knowledge-based Coreference Resolution for Hungarian In: Proceedings of The Sixth International Conference on Language Resources and Evaluation (LREC 2008), Marrakesh, Morocco, 2008. – Bócz Péter, Szász Péter: A Világháló lehetőségei, interaktív weblapok készítése, ComputerBooks, Budapest, 2001 (Lektor: Pásztor Miklós)
Noha már igen réginek számít a HTML 4 és a JavaScript 1.2 is, de aki most kezd el komolyabban foglalkozni webfejlesztéssel, azok számára igen könnyen érthető, jól követhető könyv – én is ennek a segítségével írtam meg első javascriptjeimet. – Officina Textologica. Koreferáló elemek – koreferenciarelációk – Magyar nyelvű szövegek elemzése; és diszkusszió. Előszó megtalálható: http://mek.oszk.hu/html/vgi/vkereses/ful.phtml?id=1757 http://mek.oszk.hu/html/vgi/vkereses/ful.phtml?id=1759
Elsősorban a következő fejezet az utóbbiból: 5. PETŐFI S. JÁNOS-DOBI EDIT: Tezaurisztikus explikációk alkalmazása a szemiotikai-textológiai koreferenciaelemzésben – Officina Textologica. A korreferencialitás poliglott megközelítése - Szerkesztő: Petőfi S. János, Szikszainé Nagy Irma, Kiadó: Kossuth Egyetemi Kiadó, Debrecen, ISBN 963 472 907 X, http://mek.oszk.hu/03200/03263/03263.pdf
IX
Oltványi Gábor József - Diplomaterv
7. Irodalomjegyzék
– Dr. Boda István Károly, Porkoláb Judit, 2004.– előadás jegyzet (Debreceni Egyetem, Informatikai Kar):Verselemzés koreferenciákkal (Radnóti Miklós: Koranyár), http://www.inf.unideb.hu/~bodai/eloadas/jegyzetek.html#kulcsszo_grafok
7.2. Felhasznált/ajánlott web linkek – GATE annotator program: http://gate.ac.uk/download/index.html – PALinkA: http://clg.wlv.ac.uk/projects/PALinkA/ – COREF v2 projekt jelenlegi oldala: http://firefly.itk.ppke.hu/~gabrosz/coref/ – EasyPHP (Apache+PHP+MySQL): http://www.easyphp.org/ – Notepad++: http://notepad-plus.sourceforge.net/hu/site.htm – W3C XHTML ajánlás: http://www.w3.org/TR/xhtml1/ – W3C CSS szabvány: http://www.w3.org/Style/CSS/ – W3SCHOOLS: Nagyon jó leírások és példák szinte minden általam is használt eszközről: http://www.w3schools.com/ , illetve: HTML, CSS, XML, JavaScript, DOM, AJAX, PHP, SQL – JSON objektum: http://www.json.org/ , JSON JavaScriptben: http://www.json.org/js.html – http://www.php.net/manual/en/refs.xml.php PHP XML – ez a teljes angol változat gyökere, ebből emelném ki a következőket: o o o o o
http://docs.php.net/manual/en/book.simplexml.php - SimpleXML – PHP5 http://docs.php.net/manual/en/book.dom.php – DOM, PHP5 (magyar kivonat) http://docs.php.net/manual/en/book.xmlreader.php – XMLReader osztály http://docs.php.net/manual/en/book.xmlwriter.php – XMLWriter osztály http://docs.php.net/manual/en/book.xml.php – XML Parser (magyar kivonat)
– http://www.zvon.org/xxl/XPathTutorial/General/examples.html XPath Tutorial, nagyon érthető, hatékony. o További tutorialok ezen az oldalon: DTD, XML, XSLT, egyéb. – Grafikus segítségek dizájnoláshoz: o Szín választó: http://developer.sysco.ch/javascript/ColorChooser.htm o Színkód-konvertáló: http://www.javascripter.net/faq/hextorgb.htm o CSS font style wizard: http://www.somacon.com/p334.php
X
Oltványi Gábor József - Diplomaterv
7. Irodalomjegyzék
o kurzor-stílusok: http://www.echoecho.com/csscursors.htm o relatív, és egymásba úszó dobozok: CSS positioning http://www.barelyfitz.com/screencast/html-training/css/positioning/ – JavaScript DOM fa leírás: http://www.howtocreate.co.uk/tutorials/javascript/dombasics – JavaScript cookie-k: http://www.braemoor.co.uk/software/cookies.shtml – JQuery, AJAX: o http://docs.jquery.com/Ajax/jQuery.ajax#options o post: http://docs.jquery.com/Ajax/jQuery.post#urldatacallbacktype – XMLHTTPRequest: http://www.w3.org/TR/XMLHttpRequest/#opened-state – JavaScript eseménykezelés alapjai: http://www.hscripts.com/tutorials/javascript/dom/select-events.php – Egér eseménykezelésről: o minden tudnivaló: http://unixpapa.com/js/mouse.html o kattintás szimuláció: initMouseEvent W3C ajánlása: http://www.w3.org/TR/2001/WD-DOM-Level-3-Events20010823/events.html#Events-Event-initMouseEvent o erre példa: http://stackoverflow.com/questions/433919/javascriptsimulate-right-click-through-code
XI
Oltványi Gábor József - Diplomaterv
8. Mellékletek
8. MELLÉKLETEK A diplomához mellékelt CD tartalma: – Coref1 mappa: a COREF 1 anyaga o source: forráskód o xml_examples: példafájlok o CorefCS.exe: a futtatható program o divbonto.py (lásd: 4.3.1. fejezet) – Coref2 mappa: a COREF 2 forráskódja a beadás alkalmával. o php és js szkriptek, css stíluslapok.
a connect.inc-ben állítható az adatbázis-kapcsolat paraméterei
o db: az adatbázist létrehozó és feltöltő script. o xml: példafájlok, mégtöbb: lásd: COREF1-nél – Documentation
o beadott dokumentum docx, doc, pdf és odt formátumban. – Installers_if_needed – telepítő csomagok a projecthez fölhasznált, vagy a
dokumentumban említett eszközökhöz o a két annotátor program (GATE, PALinkA – 3.2.) o az öt említett böngésző o programming: a .NET 3.5-ös környezet és a Python 2.6 telepítője o az EasyPHP localhost server telepítője o két fejlesztéshez hasznos eszköz:
Notepad++ ~intelligens, programozási nyelv független
Google Quick Search Toolbar – amivel, ha keresni kell, a megfelelő helyre irányít (IE7/8 Google Toolbarjával telepíthető)
– Coref2_weblink.url – a project jelenlegi webhelye.
XII
Sign In