Hunmorph-foma morfológiai elemző és generátor a magyar nyelvre.
Az elemző a foma generátoron alapul (http://code.google.com/p/foma), amely a Xerox laboratórium lexc/xfst nyelvtani analizátor eszköz szabad forráskódú implementációja. A Xerox laboratórium eszközeinek kézikönyve (fsmbook néven is ismert) a https://victorio.uit.no/langtech/tags/DIVVUN-NO_1_0_RELEASE/gt/doc/book.pdf_1.pdf címen található meg.
Ebben a formában ismert szabad forráskódú, szabadon használható eszközök:
A hunmorph eszköz (http://mokk.bme.hu/resources/hunmorph/) több komponensű eszköz, szótára nem módosítható, mert az ahhoz szükséges eszközök nem dokumentáltak. Szókészlete töredéke a Hunmorph-fomának. Automatizálása nincs megoldva, az esetleges felhasználónak magának kell a kiszolgáló,felhasználó modellt elkészítenie. Nekem lassúnak és memóriaigényesnek tűnt a működése, ami általában nem előnyös semmilyen alkalmazásnál.
A hunspell a lehetséges ragozási alakok kb. 60%-ával képes megbirkózni, a többit nem ismeri. Szókincse szegényes, sok helyes magyar szó hiányzik belőle. Működése nyelvtani analízis módban instabil, pontosítva ebben a módban gyakran rohad le. A http://bug.openscope.org hibabeadó rendszeren megtekinthetők a hunspell hibajelentései, melyek a problémákat példákkal illusztrálják.
A fenti hátrányok kiküszöbölése indokolja a Hunmorph-Foma előállításának értelmét és szükségességét.
Használata:
$ foma -l hfnnum.foma 27.3 MB. 599957 states, 1788091 arcs, Cyclic. Foma, version 0.9.16alpha Copyright © 2008-2011 Mans Hulden This is free software; see the source code for copying conditions. There is ABSOLUTELY NO WARRANTY; for details, type "help license"
Type "help" to list all commands available.
Type "help
A Hunmorph-fomával természetesen program segítségével is lehet társalogni, azaz működése teljes mértékben automatizálható, részletesebben erről: http://code.google.com/p/foma/wiki/FlookupDocumentation
Hunmorph-foma alkalmazási lehetőségei sokoldalúak, többek között:
Hunmorph-foma szófajai:
Főnevek ragozása így zajlik le a magyarban:
Példa
szó| birtokrag | családias rag | birtokosi rag | ragok ||sógoromékéra
szó| többesszám ragja | birtokosi rag | ragok ||sógorokénak
szó| családias rag | birtokosi rag | ragok ||sógoréktól
Hunmorph-foma jelölései
Példa
szó |birtokrag (Poss) | családias rag (Fam)| birtokosi rag (Gen)| ragok|| sógoromékéra
szó |többesszám ragja(Plur)| birtokosi rag (Gen)| ragok || sógorokénak
szó |családias rag (Fam) | birtokosi rag (Gen)| ragok || sógoréktól
A ragok jelölésére Hunmorph-foma a következő rövidítéseket használja, hasonlóan a Szeged-Korpuszhoz, a Szószablyához vagy a Hunspellhez: használt név | rag Abl | tól,től Acc | t, ot, et öt Ade | nál, nél All | hoz, hez, höz Cau | ért Dat | nak, nek Ela | ból, ből Ess | ul, ül Fac | vá, vé For | ként, Forp | képp Forpen | képpen Ill | ba, be Ine | ban, ben Ins | val, vel Nom | Sub | ra, re Sup | on, en, ön, n Ter | ig Tem | kor
Dis | anként, enként Soc | astul, estül
Dis és Soc-t csak közvetlenül a szóra alkalmazzuk, nem Poss, Plur vagy Fam után.
Gen alkalmazása csak egyszer történik, noha elméletileg tetszőleges mélységig alkalmazható (kutyáéé..), az alkalmazott korpuszok (Szószablya korpusz és Szeged korpusz) ilyenre nem szolgáltak példával.
Melléknevek
A melléknevek a főnevekkel analóg módon ragozódnak. Mellékneveket ezen kívül fokozni is lehet, amikor felső és túlzófokban előtagot is kapnak.
Melléknév fokozás:
Alapfok Középfok Felsőfok Túlzófok szó (fnragozás) | abb, ebb, obb, bb (fnragozás)| leg .. abb, ebb, obb, bb (fnragozás)| legesleg .. abb, ebb, obb, bb (fnragozás)
A fokozás tényét a "Mid" szóval jelzi Hunmorph-foma, a felső és túlzófok jelenlétét a leg vagy legesleg előtag megadása mutatja. Példák: szebbek: szebbek szép+Adj+Mid+Plur+Nom legokosabbak: legokosabbak legokos+Adj+Mid+Plur+Nom legeslegcsúnyábbak: legeslegcsúnyábbak legeslegcsúnya+Adj+Mid+Plur+Nom
Igék ragjai egyes szám első személytől harmadik személyig, és többes szám első személytől harmadik személyig tartanak.
Ige állhat főnévi igenévi alakban is, amely lehet egyes szám első-harmadik személyű vagy többes szám első-harmadik
személyű.
A személyt és számot kifejező rag előtt még állhat a felszólítás (tat,tet) illetve az ismétlés (gat,get) képzője.
Az ige lehet tárgyas vagy tárgyatlan ragozású, jelen vagy múlt idejű, feltételes ragozású vagy
kötő módban levő.
Példa szó | ismétlés | felszólítás | ismétlés | felszólítás | szám, személy, tárgyatlan | írogattatgattatok szó | ismétlés | felszólítás | ismétlés | (felszólítás) | szám, személy, tárgyatlan | írogattatgatok szó | ismétlés | felszólítás | (ismétlés| felszólítás) | szám, személy, tárgyatlan | írogattatok szó | ismétlés | (felszólítás| ismétlés | felszólítás) | szám, személy, tárgyatlan | írogatok szó | (ismétlés | felszólítás| ismétlés)| felszólítás | szám, személy, tárgyatlan | íratok szó | (ismétlés)|felszólítás | ismétlés | (felszólítás | szám, személy, tárgyatlan | íratgatok szó | (ismétlés| felszólítás | ismétlés | felszólítás) | szám, személy, tárgyatlan | írok szó |(ismétlés| felszólítás | ismétlés | felszólítás) | szám, személy, tárgyas | írom szó |(ismétlés| felszólítás | ismétlés | felszólítás) | szám, személy, tárgyas, feltételes| írnám szó |(ismétlés| felszólítás | ismétlés | felszólítás) | szám, személy, tárgyatlan, feltételes| írnék szó |(ismétlés| felszólítás | ismétlés | felszólítás) | szám, személy, tárgyas, kötő mód | írjam szó |(ismétlés| felszólítás | ismétlés | felszólítás) | szám, személy, tárgyatlan, kötő mód | írjak
Hunmorph-foma jelölései
........................
Az ismétlés jele a Rep,
A felszólítás jele Imper.
Tárgyas: Def Tárgyatlan: Indef
Feltételes: Cond
Kötő mód: Conj
A számnevek ragozása teljesen azonos a főnevekével
A névmások egyes szám első..harmadik és többes szám első.. harmadik személyben lehetnek. Névmások kapcsolódnak szinte minden főnévi raghoz, és esetenként névutókhoz is.
Példák: enyém mellettünk tőletek ....
Határozók, kötőszavak és egyéb szófajok ragozatlanok.
A rendhagyó főnevek osztályai:
Rendhagyó főnevek esetén az összes összetett szó, melyek utótagja a rendhagyó szó, a rendhagyó csoportba sorolandó be. Például a hintaló a lóval azonos .lexc fájlba sorolandó be.
Az igéknél kb. 25 féle ragozású ige létezik. Az ikes igék külön csoportban vannak az egyszerűség kedvéért, pl enhuige7.lexc és enhuige7ik.lexc. A nem rendhagyó igék az enhuige.lexc fájlban vannak.
Igekötők nemcsak igékhez járulhatnak, hanem főnevekhez és melléknevekhez is (kinézés, benézés, kilátó, belátó, stb...) Az igekötők szavakhoz adása a LEXICON Prefigekoto blokknak a LEXICON Verb blokk elé kapcsolásával valósítjuk meg.
Azaz:
LEXICON Root Verb; Prefigekoto;
LEXICON Prefigekoto +Pref+:keresztül Verb; ... +Pref+:be Verb;
LEXICON Verb abajgatásoz AddVerbmelyik; ...
Ez a szerkezet garantálja, hogy minden igekötő minden igével kombinálva lesz. Ilyen szerkezet van még az enhuadjigem.lexc, enhuadjmelyige.lexc, enhuadjfnmn.lexc, enhufnige.lexc, az összes igével kapcsolatos és más fájlokban is, ahol gyakori az igekötővel való kombináció.
Meg kell állapítani, hogy a beadandó szó főnév, melléknév, melléknév és főnév, ige, számnév vagy egyéb-e.
Meg kell nézni, hogy hasonló végződéssel van-e már szó a szókészletben.
A hozzá leghasonlóbb szó mellé betenni, ugyanolyan ragozási utasítással, mint amilyen a hasonló szóé. Ha a szóhoz igekötők is tartoznak, olyan helyre kell betenni, ahol az igekötőket is hozzáadjuk.
Példa: Tegyük fel, a facsart szó hiányzik. A szó melléknév. Igekötők tartozhatnak hozzá (kifacsart, stb..)
grep "art " lexc/adj/* enhuadjigem.lexc jó jelölt, mivel ez az igekötőket is kezeli
a csavart szó így van benne: csavart AddAdjboeet;
tehát ez után berakjuk: facsart AddAdjboeet;
és újra kompilálás után a szó része a szókészletnek.
Az adj fában előfordulnak képzős ragozási utasítások, pl. enhuadjfnmn.lexc-ben: AddAdjeEnd AddAdjeEndat AddAdjeEndnyi AddAdjeEndnyiat
ragozási utasítások, melyek kizárólag képzőket állítanak elő (szerű, féle, fajta, nyi, i); Ezzel sok helyet lehet megtakarítani, viszont az analízis kissé áttekinthetetlenebb lesz, mert pl. a próba szó esetén a próbaszerű illetve próbaféle szavak esetén az alapszót próba-nak adja meg és nem próbaszerűnek. Példa: apply up> próbaszerűt próba+Adj+Acc apply up>
Az összetett szavak kezelését eredetileg úgy terveztem, hogy egyszerű szavak listáját ragozási utasítással "fésülöm össze". Az egyszerű szavak listája kb. 30 ezer szót tartalmazott volna. Ez gyakorlatilag nem volt járható út, mert a .lexc fájl lefordítása több, mint 30 percet vett volna igénybe.
Ezért saját gyűjtésű korpuszból vett listát használok. A korpuszból vett szógyűjtemény a noun/enhuossz3.lexc fájlban található meg. A szógyűjtemény nem szabályos szavait ezután kézzel átraktam a megfelelő .lexc fájlokba. A tesztelést és a szógyűjtemény javítását ezután magával a szógyűjteménnyel, a Szeged korpusz szókészletével majd a Szószablya projekt szókészletének felhasználásával végeztem. Minden esetben a Hunspellt használtam szűrőként.
Mivel az enhuossz3.lexc fordítása kb. 3 percet vesz igénybe, ez lelassítja a fordítást. Esetleges szókészleti munka megkönnyítésére bevezettem a "nagy" és "kis" szótár használatának lehetőségét. A "nagy" szótár a végleges forma, a "kis" szótár a szabályos összetett főnevek nélküli forma. Az átkapcsolást a nagy és kis szótár között automatizáltam az smake.sh szkript segítségével. használata: ./smake.sh k kicsi
vagy: .smake.sh n nagy
parancsok segítségével lehetséges. Ezután a make a kiválasztott változatot fogja lefordítani.
A módszer előnye a rendkívül egyszerű átkapcsolás, és ennek során esetleges hibák elkerülése. A módszer hátránya az, hogy létezik egy enhu2.foma.kicsi és egy enhu2.foma.nagy fájl, és ha az enhu2.foma fájlt változtatjuk a változást az enhu2.foma.kicsi és az enhu2.foma.nagy fájlon is végre kell hajtani. Ugyanígy létezik egy Makefile.kics és Makefile nagy fájl. Minden változást a makefile fájlon ezekre is alkalmazni kell.
Analízis esetén célszerű, ha az eszköz lehetőleg minden lehetséges alakot fölismer. Generálás esetén viszont az kívánatos, hogy a legszokásosabb alakot generálja az eszköz. A jelenlegi forma analízisre jó, de generálásra nem optimális, mivel sokféle formát generálhat. A "legszokásosabb" forma eléréséhez a lexikont célszerű redukálni és a lexc fájlokat leegyszerűsíteni, hogy ne generálják a ritkán előforduló formákat. Erre példa az írnánk/írnók pár, ahol kétségtelenül az írnánk forma lényegesen gyakoribb, de az írnók formát sem lehet kizárni, mert az a analízis esetén a megértési pontosságot fölöslegesen csorbítaná.
A Hunmorph-foma készítése az SFST nevű eszközzel indult, ( http://www.ims.uni-stuttgart.de/projekte/gramotron/SOFTWARE/SFST.html SFST hazai oldal és lehozás) mivel az SFST áttekinthető analizátor/generátor, és segítségével már elkészült egy török morfológia, trmorph. A török nyelv meglehetősen hasonlít a magyarra, kb. német:angol megfelel a magyar:török viszonynak. A török morfológiát lényegesen leegyszerűsíti, hogy a török ragozás kicsit egyszerűbb, bár szinte minden szabálytalanság megvan benne mint a magyarban. Viszont a török nyelv nem használ sem igekötőket, sem összetett főneveket, ami egy morfológiai eszköz írását nagyban leegyszerűsíti. A török igeragozás ezzel szemben kissé komplikáltabb, mint a magyar, ez viszont nem nehezíti meg jelentősen a morfológiai eszköz írását.
Az SFST használata során ugyan sikerült kitalálni a csíziót, azaz megtalálni azt a módozatot, ahogy elfogadható memória használattal működjön az eszköz. A probléma az olvashatóság lett. Az SFST fájlok olyan nehezen olvashatók voltak, hogy kénytelen voltam új eszközt keresni, és ez a foma volt. A foma tökéletesen alkalmas a magyar nyelv komplexitásának a teljes körű kezelésére, és azt nagyon jó hatásfokkal teszi.
A lexc fájlok ellenőrzésére írtam egy kis programot, tools/fomachk/fomasyn2.pl, amely gyorsan megvizsgálja a lexc fájlok integritását. A program, mint minden segédprogram perl-ben íródott, és működéséhez működő perl interpreter jelenléte szükséges, ami modern rendszereken magától értetődő.
Első használat előtt a fomasyn2.pl programban levő $root változót, úgy kell beállítani, hogy az arra a mappára mutasson, ahol a Makefile van.
Egy paramétert kell megadni fomachk-nek, ami a lexc-ben levő szófaj neve, azaz noun, adj, verb, num, fxpp, vagy misc.
Használata ezután a fő mappából: $ perl tools/fomachk/fomasyn2.pl verb file:/home/en/program/foma/tktest1/lexc/verb/enhuigeik.lexc probably erroneous .o. line:oázik:oáz AddVerb;
Az utalás a hibás .o. sorra ártalmatlan; ezenkívül fxpp paraméter esetén panaszkodik még nem használt elemekről, ami szintén ártalmatlan. Esetleges más panaszait viszont érdemes komolyan venni és utánuk nézni.
Egy példa a kliens-szerver mód használatára a tools/chkwds mappában van. Használata:
A tools/perl mappában levő programok:
kivon.pl - hívása egy paraméterrel történik, a paraméter egy fájl neve kivon.pl beolvassa a megadott fájlt. Beolvassa stdin-t, a fájlban szereplő szavak kivételével listázza stdin-t.
kivon1.pl kivon.pl megfordítottja: kivon1.pl - hívása egy paraméterrel történik, a paraméter egy fájl neve kivon.pl beolvassa a megadott fájlt. Beolvassa stdin-t, listázza stdin azon szavait, melyek a megadott fájlban szerepelnek..