2010. július 6., kedd

Magyar ragozó program

Nemrég fejeztem be egy projektet, amelynek keretében kb. 40 ezer főnév és 4500 melléknév ragozott alakját állítottam elő egy C++ nyelven írt programmal. Az algoritmusok kidolgozása után, a program megírásában nagy segítségemre volt Lakatos Ferenc informatika szakos egyetemi hallgató. Ezúton is köszönet neki!

A magyar nyelv, mint tudjuk, erősen ragozós (agglutináló) nyelv, a szavakhoz háromféle toldalék járulhat: képző, jel vagy rag.
  • A képzők megváltoztatják a szó jelentését, gyakran szófaját is. A képzőkkel igéből igét, névszóból igét, igéből névszót és névszóból névszót tudunk alkotni. A szótárakban ezek általában önálló bejegyzésként szerepelnek, a projekt keretében ezekkel nem foglalkoztam. 
  • A ragok a szó mondatban betöltött szerepét jelölik, a jelentését nem módosítják, tehát nem alkotnak új szót. Példák: birtokos rag, tárgyrag, határozói ragok...
  • A jelek sem alkotnak új szót, sőt, a szó mondatbeli szerepét sem változtatják meg. Példa a jelekre: többesszám jele, birtokos jel...
A jelen nyelvészeti munka során a két utolsó csoporttal dolgoztam. Megszámoltam: a magyar főneveknek 266 ragozott és jelekkel módosított alakjuk van, ezekből én 56 főnévi alakot és 20 melléknévi alakot dolgoztam fel a jelenlegi projektben. Az 56 főnévi alak ebben a táblázatban tekinthető meg (angolul). A "transitive" forma szokatlan lehet: én így jelöltem azt, amikor egy birtokos esetben lévő szó birtokos jelet is kap. Például: házamé.

Egy ragozó program természetesen nem tud minden magyar főnevet és melléknevet helyesen ragozni, ugyanis rengeteg a kivétel, amelyeket külön kell kezelni. Ráadásul, a kivételek alól is vannak kivételek! A szavaknak nem csak a formáját kell figyelni, hanem a jelentését is, ehhez pedig emberi intelligencia kell. Például: a főnév töbesszáma tavak, de a kilátó többesszáma nem kilátavak, hanem kilátók. A kivételek és a kivételek kivételeinek kezelése után is akad még javítgatnivaló.

A projekt keretében én egészen pontosan 38.084 főnévvel és 4771 melléknévvel dolgoztam, amelyeket akapvetően az on-line magyar-román szótáramból exportáltam, majd ellenőriztem. A korrektúra tehát 38084x56 + 4771x20 = 2 228 124 szóalak ellenőrzését jelentette, amely önmagában is egy hatalmas munka. Ebben 2 munkatárs segített, akik ennek a mennyiségnek kb. 5%-át ellenőrizték, a többi 95%  az én feladatom maradt.

A munka egy nagy internetes keresőszolgáltatónak készült, a projekt végső célja az internetes keresés optimalizálása (SEO). Konkrétabban: amikor a keresőben beírjuk például a „ház” szót, a keresés eredményei között ennek a szónak ragozott alakjai is (házam, házad, háza, házak stb.) jelenjenek meg. [Megj.: Ez a példa talán nem is a legjobb, hisz a „ház” kulcsszóra könnyű megtalálni a „házak” szót is, de például a „szerelem” szó esetében ez nem ilyen könnyű, mert többesszáma ”szerelmek”.] Tehát, aki mostantól az interneten keres, annak elvileg több és pontosabb találat adódik.
Részemről a munka menete a következő volt:
  • a feladat felmérése, munkaterv kidolgozása: kb. 2 hét;
  • szoftverfejlesztés: kb. 1 hónap;
  • korrektúra: kb. 3 hét.
Hasonló projekten a Morphologic Kft. dolgozhatott, amikor elkészítette a Microsoft Word helyesírás-ellenőrzőjét. Persze az ő emberi, pénzügyi és más erőforrásaik az enyémeket nagyságrendekkel meghaladják.

A projektért kapott díjazás természetesen nem fedezi a befektetett energiát, de ennek ellenére élveztem ezt a munkát, és szívesen dolgoznék a folytatásán. Ugyanis a 266 szóalaknak a negyede sem készült el.

8 megjegyzés:

  1. Hú! Az hatalmas munka lehetett! 266 alak egyetlen szónak? Nem is hittem volna, igaz, még sosem számoltam utána. :) Kész csoda, hogy ilyen jól meg tudjuk tanulni.

    VálaszTörlés
  2. Szia!
    A 266 toldalékos alak a főneveknél van. A mellékneveknek még több alakjuk van (mert fokozhatók). De ott vannak még az igék és a többi szófaj is. Tényleg komoly teljesítmény megtanulni magyarul, nem csoda, hogy "rááll" az agyunk a matematikára (ld.: kombinatorika). :-)

    VálaszTörlés
  3. No, én a szavakat elég jól forgatom, de matekból agyilag zokni vagyok. Az lehet, hogy van sok jó matematikusunk, meg programozónk, de szerintem ez nem függ össze a nyelvvel. Egyik humán, másik reál. Reálból sosem voltam jó. Matek, fizika, kémia... mindből bukdácsoltam. Énekből, rajzból, magyarból pedig kitűnő.

    Pedig egyik órára sem tanultam soha semmit! :D

    VálaszTörlés
  4. Nos, a matematikai érzéked egy olyan rejtett kincs, amelyet még fel kell fedezned magadban. :-)

    VálaszTörlés
  5. Helló, lehetne erről bővebben olvasni, vagy ez egy zárt forrású program? Kiváncsi lennék alapvetően hogyan lett megvalósítva nagy vonalakban a ragozás. Nem műhelytitkok érdekelnek én hobbi szinten írok C-ben ragozó függvényeket egy hobbi szöveges játékot fejlesztek.

    Elég nagy szenvedés nekem pld az alma szóból almát csinálni merthogy az eperből meg nem eperet hanem epret lesz. :-D

    Egyelőre ott tartok hogy ban-ben, ba-be, tól-től, nak-nek úgy ahogy működik.

    VálaszTörlés
  6. Szia Corda!

    A projektet tavaly fejeztem be, legalábbis az első részét, és remélem, hogy a nagy nemzetközi keresőcég folytatja, így még nem akarom nyilvánossá tenni a forráskódot.

    VálaszTörlés
  7. Értem. Én olyan függvényeket készítek ami egy szóból egy esetet ragoz. Ezután már lehet értelmes mondatokat generálni.

    Pár függvény példa: ACC("alma") = almát, SUB(szék) = székre, ELA(kabát) = kabátból.

    Ebből már lehet alkotni olyat hogy pld.:

    var1 = körte
    var2 = hátizsák
    var3 = asztal

    "Kiveszed a_az(var1) ACC(var1) a_az(var2) ELA(var2) és ráteszed a_az(var3) ACC(var3)."

    Ami azt eredményezi hogy: Kiveszed a körtét a hátizsákból és ráteszed az asztalra.

    :-D

    VálaszTörlés
  8. Szia!
    Nyilvánvaló, hogy függvényekkel kell generálni az egyes eseteket, másként nem is lehetne.

    VálaszTörlés

Írd be ide a megjegyzésed!