2011. május 17.

Számoljunk magyar nyelven

Következő írásomban magyar nyelven megfogalmazott alapvető számítási műveletek felismerésére és elvégzésére fogjuk megtanítani a számítógépünket. Az összeadás, a kivonás, a szorzás műveletét lesz képes felismerni és megadni az eredményt magyar nyelven. A tanításhoz a szabályalapú megközelítést fogunk használni és a Prolog programozási nyelvet.



Leírás

Maga a program nagyon szűk keretek között fog mozogni. Egytől ezerig fogjak felismerni a magyar nyelvű tőszámneveket[1] és ezeken fogjuk értelmezni az összeadás, a kivonás és a szorzás műveletén. Az osztást a szűk szótár miatt, ami csak a tőszámneveket tartalmazza, ki kellett hagynom az elemzésből. De a szótárbővítéssel és a szóképző szabályokkal a bemutatott analógia alapján könnyen elvégezhetjük sajátkezűleg.

Prolog

Maga az eszköz a Prolog (SWI-Prolog) programozási nyelv lesz. Erről már szóltunk itt a logikai programozással kapcsolatban, de az algoritmusok világában is szóba került. A Prolog lényegét talán egy mondatban is összefoglalhatjuk: amit képes elemezni, azt képes generálni is. Ezt a tulajdonságát fogjuk mi is kihasználni. Nem csak felismerni lesz képes, hogy egy adott karaktersorozat a magyar tőszámnevek része, hanem egy számot képes lesz lefordítani magyar nyelvre. Sőt, az aritmetikai műveletek implementálásával képes lesz műveleteket végezni a magyar nyelvű tőszámnevekkel, és az eredményt is magyarul adja meg. (Különlegességként még megemlíteném, hogy egy-egy számról képes lesz megmutatni, hogy hányféle magyar mondattal lehet előállítani.)

A szótár és a szabályhalmaz

Első feladat előállítani a tőszámnevek szótárát. Ezt két módon lehet. Egy, felsoroljuk az összeset. (Mivel megadtunk egy alsó és felső határt, ezért ez véges idő alatt és gépelési sebességétől függően lehetséges.) A másik módszer, hogy megkeressük a leírandó szótár szabályszerűségeit. A szabályszerűségeinek felismerése és betáplálásával, a szabályok felállításával ráhagyhatjuk a gépre, hogy előállítsa a megadott határok között előállítható összes grammatikus magyar nyelvű tőszámnevet.

Ehhez először a legkisebb, bonthatatlan elemeire kell szednünk a tőszámneveket. Továbbá a szótári elemeket egy kis kiegészítéssel is ellátjuk. A szótári elem mellett annak értékét is feltüntetjük. Ez a számítások elvégzése miatt szükséges és hogy a szóképzés útján előállított újabb tőszámnevekről el tudjuk dönteni, hogy mennyi az értékük.

Aztán meg kell határoznunk azon szóképző szabályokat, amelyek a szótár elemeit felhasználva, azok kombinálásaival leírják a kívánt, 1-től 1000-ig tartó tőszámnevek tartományát.

Továbbá fel kell töltenünk azon plusz szabályokkal, amelyek képesek a műveletek felismerni és elvégezni.

Eredmények tesztelése

A kettős pont az új eredmény kérését jelenti. Ha erre 'false' értéket kapunk, akkor nincs több ilyen érték. Ha van, akkor kiírja a következőt.

Hiányosságok

  • A magánhangzó-harmónia hiánya. A szorzás (-szor/-szer) és a kivonás (-ból/-ból) ragjai nem illeszkednek az első tőszámnévhez. Ez a könnyen orvosolható lenne, de a szabályokat és a szótárt is át kellene alakítani. Mivel ez inkább bemutató jellegű írás, így ettől eltekintettem.

  • Kétszer kettő”. Az eset különlegessége úgy foglalható össze, hogy a szorzás első részében helyes a 'két' alak a szó végén. Ezt nem képes kezelni a program. Mivel a számok/3 predikátum nem generálja és nem is ismeri fel tőszámnévként a 'két' alakot. Pedig a szorzás esetében ennek van értelme. (További példa: "Tizenkétszer kettő")

  • Továbbá a legnyilvánvalóbb hiányosság, a szótár és a szóképző szabályok nem teljesek. Azt viszont megemlíteném, hogy a szótárat két-három elemmel bővítve, a szóképző szabályokat hasonló analógiával bővítve egy öt perc alatt akár a 999 milliót is képes lenne kezelni a program...

Összefoglalás

Ebben az írásban egy szabályalapú nyelvleírásra mutattam példát. A magyar nyelv egy részhalmazát adtuk meg. Ez nem a teljes tőszámnevek halmaz, annak csak részhalmaza. De példát láthattunk arra, hogy a szóképző szabályokat milyen formában lehet megfogalmazni és a Prolog segítségével tesztelni, kipróbálni.

[1] A magyar tőszámnevek szabályalapú generálásának példáját Szécsényi Tibor: Nyelvtechnológia: a nyelv és a számítógép című szemináriumáról származik (Szegedi Tudományegyetem, 2009). Ezt a példát bővítettem ki azzal, hogy képes legyen ne csak felismerni, hanem műveletek is végezni magyar nyelven.

A teljes forráskód elérhető a Számítógépes Nyelvészet Github tárolójából.

Nincsenek megjegyzések: