Magyar főnévragozás fomával

A Programozás Wiki wikiből

Foma két fájltípust használ: A lexc fájl tartalmazza a szavakat, a használt nyelvtani szimbólumokat és a ragok összetevésének listáját. A .foma fájl a szabályos kifejezések (regular expression) listája, ezek összeállítása nyelvtanná. A mellékelt példaprogram egyetlen egy ragot használ de megmutatja az elvet. Az elv az, hogy a lexc fájlban kézzel kell összeállítani a lehetséges toldalékok listáját. A magyar nyelvben, lerövidítve ezek:

  • ((plu? | poss? | fam?) gen? case) |tem|soc|dis|ess

ahol

NévMagyarázat
pluplural (házak)
famfam rag (ék)
gengenitiv (é, éi)
caseragok (ba,be, ban,ben, tól, től, stb...)
tem|soc|dis|essragok, melyeket csak közvetlenül a főnévhez kapcsolódva használunk, pl. estül
?Azt jelenti, hogy a rag hozzáfűzése opcionális, azaz nem kötelező

Lexc fájl:[szerkesztés]

!!!enhu2.lexc!!!

Multichar_Symbols  +Noun

+Noun
+Dis+Ess +Soc +Tem +Posss1

+Plur +Fam +Gen +Genpl

+Abl +Acc +Ade +All +Cau +Dat +Del
+Ela +Fac +For +Ill +Ine +Ins +Nom
+Sub +Sup +Ter

§EOA§ §uue§ §ooez3§ §OEOE1§ §J§ §UUE§ §OEOE§ §JP§ §AE§ §OEOE2§
§UUE1§ §oeoez1§ §oooe§ §oeoez2§ §AAA§ §oeoe§ §AA§ §oeoez§ §AE1§
§VV§

LEXICON Root
Noun ;

!define Cons [b | c | d | f | g | h | j | k | l | m | n | p | q | r | s | t | v | w | x | y | z];
!define Vowel [a | á | e | é | i | í | o | ó | u | ú | ü | ű | ö | ő];
!define Root [ [Cons^{0,4} Vowel^{1,3}] | [Cons^{0,4} Vowel^{1,3} Cons^{1,4} Vowel^{0,3} ]* ] ;


LEXICON Noun
!rém   AddNoun;
!rab   AddNoun;
!kapa  AddNoun;
!rege  AddNoun;
< [ [[b | c | d | f | g | h | j | k | l | m | n | p | q | r | s | t | v | w | x | y | z]^{0,4} [a | á | e | é | i | í | o | ó | u | ú | ü | ű | ö | ő]^{1,3} ] | [ [b | c | d | f | g | h | j | k | l | m | n | p | q | r | s | t | v | w | x | y | z]^{0,4} [a | á | e | é | i | í | o | ó | u | ú | ü | ű | ö | ő]^{1,3}  [b | c | d | f | g | h | j | k | l | m | n | p | q | r | s | t | v | w | x | y | z]^{1,4} [a | á | e | é | i | í | o | ó | u | ú | ü | ű | ö | ő]^{0,3} ]* ] >    AddNoun;

LEXICON AddNoun
+Noun:0     Poss;
+Noun:0     Plur;
+Noun:0     Fam;

LEXICON Poss
+Dis:^+cDis^§ooez3§nként    #;    ! anként, enként
+Ess:^+cEss^§uue§l          #;    ! ul, ül
+Soc:^+cSoc^§EOA§st§uue§l   #;    ! astul, estül
+Tem:^+cTem^kor             #;    ! kor
+Posss1:^+cPosss1^§OEOE1§m        Gen;  ! m
+Posss2:^+cPosss2^§OEOE1§d        Gen;  ! d
+Posss3:^+cPosss3^§J§§AE1§        Gen;  ! ja, je, aa,e
+Possp1:^+cPossp1^§UUE§nk         Gen;  ! unk, önk
+Possp2:^+cPossp2^§OEOE1§t§OEOE§k Gen;  ! etek, atok
+Possp3:^+cPossp3^§J§§UUE1§k      Gen;  ! ük, uk
+Posss1p:^+cPosss1p^§JP§§AE§im    Gen;  ! aim
+Posss2p:^+cPosss2p^§JP§§AE§id    Gen;  ! aid
+Posss3p:^+cPosss3p^§JP§§AE§i     Gen;  ! ai, jai, ei, jei
+Possp1p:^+cPossp1p^§JP§§AE§ink   Gen;  ! aink, eink
+Possp2p:^+cPossp2p^§JP§§AE§it§OEOE2§k Gen; ! aitok, eitek
+Possp3p:^+cPossp3p^§JP§§AE§ik    Gen;  !aik, jaik, eik, jeik
                                  Gen;

LEXICON Plur
+Plur:^+cPlur^§oeoez1§k    Gen;
                            Gen;
        
LEXICON Fam
+Fam:^+cFam^ék         Gen;
                       Gen;

LEXICON Gen
+Gen:^+cGen^é          Case;
+Genpl:^+cGenpl^éi     Case;
                       Case;
 
LEXICON Case
+Abl:^+cAbl^t§oooe§l      #;  ! tól, től
+Acc:^+cAcc^§oeoez2§t     #;  ! ot, et, öt, t
+Ade:^+cAde^n§AAA§l       #;  ! nál, nél
+All:^+cAll^h§oeoe§z      #;  ! hoz, hez, höz
+Cau:^+cCau^ért           #;  ! ért
+Dat:^+cDat^n§AA§k        #;  ! nak, nek
+Del:^+cDel^r§oooe§l      #;  ! ról, ről
+Ela:^+cEla^b§oooe§l      #;  ! ból, ből
+Fac:^+cFac^§VV§§AAA§     #;  ! val, vel
+For:^+cFor^ként          #;  ! ként, képp, képpen
+Ill:^+cIll^b§AA§         #;  ! ból, ből
+Ine:^+cIne^b§AA§n        #;  ! ban, ben
+Ins:^+cIns^§VV§§AA§l     #;  ! val, vel
+Nom:^+cNom^0             #;  ! 
+Sub:^+cSub^r§AA§         #;  ! ra, re
+Sup:^+cSup^§oeoez§n      #;  ! on, en, ön, n
+Ter:^+cTer^ig            #;  ! ig

A <..> közé zárt rendszeres kifejezés (regular expression) minden szót engedélyez, amely egy magyar szóhoz hasonlóan néz ki, azaz legalább egy magánhangzó van benne, és sehol nincs háromnál több magánhangzó illetve négynél több mássalhangzó egymás mellett benne. Ez azért szükséges, mert a magyar nyelv a tárgyak viszonyát ragozással fejezi ki, és tetszőleges, azaz a szótárban nem szereplő szavak ragozása is szükséges, például idegen városok folyók, személyek neve, stb....

foma fájl:[szerkesztés]

### enhu2.foma ###

# Vowels
define Vowel [ a | á | e | é | i | í | o |ó | u | ú | ü | ű | ö | ő ];
define BackVowel [ a | á | o | ó | u | ú ];
define FrontUnroundedVowel [ e | é | i | í | ü | ű ];
define Front1UnroundedVowel [ e | é | i | í ];
define FrontRoundedVowel [ ö | ő ];
define Front1RoundedVowel [ ö | ő | ü | ű ];
define FrontVowel [ e | é | i | í | ü | ű | ö | ő ];
define PlosivCons [ b | d | g | h | p | t ];
define NonPlosivCons [ c | j | l | r | s | v | z ];
define OppNonPlosivCons [ b | d | f | g | h | k | m | n | p | q | t | w | x | y ];

# Consonant doubling: 1-letter consonant doubled before -ing/-ed (beg/begging)
define Etoee e -> é ||  _ "^"  ?*  [ "+" {cAbl} | "+" {cAcc} | "+" {cAde} | "+" {cAll} | "+" {cCau} | "+" {cDat} | "+" {cDel} | "+" {cEla} | "+" {cFac} | "+" {cIll} | "+" {cIne} | "+" {cIns} | "+" {cSub} | "+" {cSup} | "+" {cTer} | "+" {cFam} | "+" {cDis} | "+" {cEss} | "+" {cSoc}  | "+" {cPosss1}  | "+" {cPosss2}  | "+" {cPosss3}  | "+" {cPossp1}  | "+" {cPossp2}  | "+" {cPossp3} | "+" {cPosss1p} | "+" {cPosss2p} | "+" {cPosss3p} | "+" {cPossp1p} | "+" {cPossp2p} | "+" {cPossp3p} | "+" {cPlur} | "+" {cGen} | "+" {cGenpl}] ?* ; # \0: not zero kor & ként excluded
define Atoaa a -> á ||  _ "^"  ?*  [ "+" {cAbl} | "+" {cAcc} | "+" {cAde} | "+" {cAll} | "+" {cCau} | "+" {cDat} | "+" {cDel} | "+" {cEla} | "+" {cFac} | "+" {cIll} | "+" {cIne} | "+" {cIns} | "+" {cSub} | "+" {cSup} | "+" {cTer} | "+" {cFam} | "+" {cDis} | "+" {cEss} | "+" {cSoc}  | "+" {cPosss1}  | "+" {cPosss2}  | "+" {cPosss3}  | "+" {cPossp1}  | "+" {cPossp2}  | "+" {cPossp3} | "+" {cPosss1p} | "+" {cPosss2p} | "+" {cPosss3p} | "+" {cPossp1p} | "+" {cPossp2p} | "+" {cPossp3p} | "+" {cPlur} | "+" {cGen} | "+" {cGenpl}] ?* ; # \0: not zero kor & ként excluded

define HarmRuleO §oeoez1§ -> 0 // .#. \"^"+ Vowel %^ ?*  _  .o.
                 §oeoez1§ -> o // .#. \"^"+ BackVowel \Vowel+ "^" ?*  _ ,,
                 §oeoez1§ -> e // .#. \"^"+ FrontUnroundedVowel \Vowel+ "^" ?* _ ,,
                 §oeoez1§ -> ö // .#. \"^"+ FrontRoundedVowel \Vowel+  "^" ?* _ ;
define HarmRuleC §AE1§ -> á // .#. \"^"+ BackVowel \Vowel* "^" ?* _ "^"  ?*  [ "+" {cAbl} | "+" {cAcc} | "+" {cAde} | "+" {cAll} | "+" {cCau} | "+" {cDat} | "+" {cDel} | "+" {cEla} | "+" {cFac} | "+" {cIll} | "+" {cIne} | "+" {cIns} | "+" {cSub} | "+" {cSup} | "+" {cTer} | "+" {cFam} | "+" {cDis} | "+" {cEss} | "+" {cSoc}  | "+" {cPosss1}  | "+" {cPosss2}  | "+" {cPosss3}  | "+" {cPossp1}  | "+" {cPossp2}  | "+" {cPossp3} | "+" {cPosss1p} | "+" {cPosss2p} | "+" {cPosss3p} | "+" {cPossp1p} | "+" {cPossp2p} | "+" {cPossp3p} | "+" {cPlur} | "+" {cGen} | "+" {cGenpl}] ?* .o.
                 §AE1§ -> é // .#. \"^"+ FrontVowel \Vowel* "^" ?* _ "^"  ?*  [ "+" {cAbl} | "+" {cAcc} | "+" {cAde} | "+" {cAll} | "+" {cCau} | "+" {cDat} | "+" {cDel} | "+" {cEla} | "+" {cFac} | "+" {cIll} | "+" {cIne} | "+" {cIns} | "+" {cSub} | "+" {cSup} | "+" {cTer} | "+" {cFam} | "+" {cDis} | "+" {cEss} | "+" {cSoc}  | "+" {cPosss1}  | "+" {cPosss2}  | "+" {cPosss3}  | "+" {cPossp1}  | "+" {cPossp2}  | "+" {cPossp3} | "+" {cPosss1p} | "+" {cPosss2p} | "+" {cPosss3p} | "+" {cPossp1p} | "+" {cPossp2p} | "+" {cPossp3p} | "+" {cPlur} | "+" {cGen} | "+" {cGenpl}] ?* .o.
                 §AE1§ -> a // .#. \"^"+ BackVowel \Vowel* "^" ?*  _ %^ [ 0 ] .o. 
                 §AE1§ -> e // .#. \"^"+ FrontVowel \Vowel* "^" ?* _ %^ [ 0 ] ;
define HarmRuleJ §J§ -> j || .#. \"^"+ Vowel %^ ?* _ .o.
                 §J§ -> j || .#. \"^"+ OppNonPlosivCons  %^ ?* _ .o.
                 §J§ -> 0 // .#. \"^"+ PlosivCons "^" ?*  _ ;
define HarmRuleU §oooe§ -> ó // .#. \"^"+ BackVowel \Vowel* "^" ?* _ ,,
                 §oooe§ -> ő // .#. \"^"+ FrontVowel \Vowel* "^" ?* _ ;
define HarmRuleZ §uue§ -> u // .#. \"^"+ BackVowel \Vowel* "^" ?* _ ,,
                 §uue§ -> ü // .#. \"^"+ FrontVowel \Vowel* "^" ?* _ ;
define HarmRuleAAA §AAA§ -> á // .#. \"^"+ BackVowel \Vowel* "^" ?* _ ,,
                   §AAA§ -> é // .#. \"^"+ FrontVowel \Vowel* "^" ?* _ ;
define HarmRuleAA §AA§ -> a // .#. \"^"+ BackVowel \Vowel* "^" ?* _ ,,
                  §AA§ -> e // .#. \"^"+ FrontVowel \Vowel* "^" ?* _ ;
define HarmRuleVV §VV§ -> v || Vowel %^  _ ,,
                  §VV§ -> b || b %^ _ ,,
                  §VV§ -> c || c %^ _ ,,
                  §VV§ -> d || d %^ _ ,,
                  §VV§ -> f || f %^ _ ,,
                  §VV§ -> g || g %^ _ ,,
                  §VV§ -> h || h %^ _ ,,
                  §VV§ -> j || j %^ _ ,,
                  §VV§ -> k || k %^ _ ,,
                  §VV§ -> l || l %^ _ ,,
                  §VV§ -> m || m %^ _ ,,
                  §VV§ -> n || n %^ _ ,,
                  §VV§ -> p || p %^ _ ,,
                  §VV§ -> q || q %^ _ ,,
                  §VV§ -> r || r %^ _ ,,
                  §VV§ -> s || s %^ _ ,,
                  §VV§ -> t || t %^ _ ,,
                  §VV§ -> v || v %^ _ ,,
                  §VV§ -> z || z %^ _ ;
define HarmRuleG §oeoez2§ -> 0 // Vowel %^ _  .o.
                 §oeoez2§ -> a // .#. \"^"+ BackVowel \Vowel* "^" ?* [ \"^" ] ?* _ .o.
                 §oeoez2§ -> o // .#. \"^"+ BackVowel \Vowel* "^" [ \"^" ]* _ ,,
                 §oeoez2§ -> e // .#. \"^"+ FrontUnroundedVowel \Vowel* "^" ?* _ ,,
                 §oeoez2§ -> ö // .#. \"^"+ FrontRoundedVowel \Vowel*  "^" ?* _ ;
define HarmRuleI §oeoe§ -> o // .#. \"^"+ BackVowel \Vowel* "^" ?* _ .o.
                 §oeoe§ -> e //  Front1UnroundedVowel \Vowel* "^" [ \"^" & \Vowel ]+ _ .o.
                 §oeoe§ -> ö //  Front1RoundedVowel \Vowel* "^" [ \"^" & \Vowel ]+ _ ;
define HarmRuleonen §oeoez§ -> 0 //   Vowel %^ _ .o.
                 §oeoez§ -> o // .#. \"^"+ BackVowel \Vowel* "^" ?* _ .o.
                 §oeoez§ -> e //  Front1UnroundedVowel \Vowel* "^" [ \"^" & \Vowel ]* _ .o.
                 §oeoez§ -> ö //  Front1RoundedVowel \Vowel* "^" [ \"^" & \Vowel ]* _ ;
define HarmRuleL §ooez3§ -> 0 // .#. \"^"+ Vowel %^ ?* _  .o.
                 §ooez3§ -> o // .#. \"^"+ BackVowel \Vowel+ "^" ?* _ ,,
                 §ooez3§ -> e // .#. \"^"+ FrontUnroundedVowel \Vowel+ "^" ?* _ ,,
                 §ooez3§ -> ö // .#. \"^"+ FrontRoundedVowel \Vowel+  "^" ?* _ ;
define HarmRuleN §EOA§ -> 0 // .#. \"^"+ Vowel %^  ?* _  .o.
                 §EOA§ -> o // .#. \"^"+ BackVowel \Vowel* "^" ?* _ ,,
                 §EOA§ -> e // .#. \"^"+ FrontUnroundedVowel \Vowel* "^" ?* _ ,,
                 §EOA§ -> ö // .#. \"^"+ FrontRoundedVowel \Vowel*  "^" ?* _ ;
define HarmRuleH §UUE§ -> 0 // .#. \"^"+ Vowel %^ ?* _  .o.
                 §UUE§ -> u // .#. \"^"+ BackVowel \Vowel+  "^" ?* _ ,,
                 §UUE§ -> ü // .#. \"^"+ FrontVowel \Vowel+ "^" ?* _ ;
define HarmRuleK §OEOE1§ -> 0 // .#. \"^"+ Vowel %^  ?* _  .o.
                 §OEOE1§ -> o // .#. \"^"+ BackVowel \Vowel*  "^" ?* _ ,,
                 §OEOE1§ -> e // .#. \"^"+ FrontUnroundedVowel \Vowel* "^" ?* _ ,,
                 §OEOE1§ -> ö // .#. \"^"+ FrontRoundedVowel \Vowel*  "^" ?* _ ;
define HarmRuleQ §OEOE§ -> o // .#. \"^"+ BackVowel \Vowel*  "^" ?* _ ,,
                 §OEOE§ -> e // .#. \"^"+ FrontUnroundedVowel \Vowel* "^" ?* _ ,,
                 §OEOE§ -> ö // .#. \"^"+ FrontRoundedVowel \Vowel*  "^" ?* _ ;
define HarmRuleR §UUE1§ -> u // .#. \"^"+ BackVowel \Vowel*  "^" ?* _ ,,
                 §UUE1§ -> ü // .#. \"^"+ FrontVowel \Vowel* "^" ?* _ ;
define HarmRuleS §JP§ -> j || .#. \"^"+ \Vowel %^  ?* _ .o.
                 §JP§ -> 0 // .#. \"^"+ Vowel+ %^ ?* _ ;
define HarmRuleT §AE§ -> 0 || .#. \"^"+ Vowel %^ ?* _ .o.
                 §AE§ -> a // .#. \"^"+ BackVowel \Vowel+  "^" ?* _ ,,
                 §AE§ -> e // .#. \"^"+ FrontVowel \Vowel+ "^" ?* _ ;
define HarmRuleW §OEOE2§ -> o // .#. \"^"+ BackVowel \Vowel*  "^" ?* _ ,,
                 §OEOE2§ -> e // .#. \"^"+ FrontVowel \Vowel* "^" ?* _ ;


# Cleanup: remove morpheme boundaries
define Cleanup      "^"        -> 0;
define CleanupDis  "^" "+" {cDis}  -> 0;
define CleanupEss  "^" "+" {cEss}  -> 0;
define CleanupSoc  "^" "+" {cSoc}  -> 0;
define CleanupTem  "^" "+" {cTem}  -> 0;
define CleanupPosss1  "^" "+" {cPosss1}  -> 0;
define CleanupPosss2  "^" "+" {cPosss2}  -> 0;
define CleanupPosss3  "^" "+" {cPosss3}  -> 0;
define CleanupPossp1  "^" "+" {cPossp1}  -> 0;
define CleanupPossp2  "^" "+" {cPossp2}  -> 0;
define CleanupPossp3  "^" "+" {cPossp3}  -> 0;
define CleanupPosss1p  "^" "+" {cPosss1p}  -> 0;
define CleanupPosss2p  "^" "+" {cPosss2p}  -> 0;
define CleanupPosss3p  "^" "+" {cPosss3p}  -> 0;
define CleanupPossp1p  "^" "+" {cPossp1p}  -> 0;
define CleanupPossp2p  "^" "+" {cPossp2p}  -> 0;
define CleanupPossp3p  "^" "+" {cPossp3p}  -> 0;
define CleanupPlur    "^" "+" {cPlur}  -> 0;
define CleanupFam     "^" "+" {cFam}  -> 0;
define CleanupGen     "^" "+" {cGen}  -> 0;
define CleanupGenpl   "^" "+" {cGenpl} -> 0;
define CleanupAbl     "^" "+" {cAbl}  -> 0;
define CleanupAcc     "^" "+" {cAcc}  -> 0;
define CleanupAde     "^" "+" {cAde}  -> 0;
define CleanupAll     "^" "+" {cAll}  -> 0;
define CleanupCau     "^" "+" {cCau}  -> 0;
define CleanupDat     "^" "+" {cDat}  -> 0;
define CleanupDel     "^" "+" {cDel}  -> 0;
define CleanupEla     "^" "+" {cEla}  -> 0;
define CleanupFac     "^" "+" {cFac}  -> 0;
define CleanupFor     "^" "+" {cFor}  -> 0;
define CleanupIll     "^" "+" {cIll}  -> 0;
define CleanupIne     "^" "+" {cIne}  -> 0;
define CleanupIns     "^" "+" {cIns}  -> 0;
define CleanupNom     "^" "+" {cNom}  -> 0;
define CleanupSub     "^" "+" {cSub}  -> 0;
define CleanupSup     "^" "+" {cSup}  -> 0;
define CleanupTer     "^" "+" {cTer}  -> 0;

read lexc enhu2.lexc
define Lexicon

define Grammar Lexicon           .o. 
               Etoee             .o. 
               Atoaa             .o. 
               HarmRuleC         .o. 
               CleanupDis        .o.
               CleanupEss        .o.
               CleanupSoc        .o.
               CleanupTem        .o.
               CleanupPosss1p    .o.
               CleanupPosss2p    .o.
               CleanupPosss3p    .o.
               CleanupPossp1p    .o.
               CleanupPossp2p    .o.
               CleanupPossp3p    .o.
               CleanupPosss1     .o.
               CleanupPosss2     .o.
               CleanupPosss3     .o.
               CleanupPossp1     .o.
               CleanupPossp2     .o.
               CleanupPossp3     .o.
               CleanupPlur       .o.
               CleanupFam        .o.
               CleanupGenpl      .o.
               CleanupGen        .o.
               CleanupAbl        .o.
               CleanupAcc        .o.
               CleanupAde        .o.
               CleanupAll        .o.
               CleanupCau        .o.
               CleanupDat        .o.
               CleanupDel        .o.
               CleanupEla        .o.
               CleanupFac        .o.
               CleanupFor        .o.
               CleanupIll        .o.
               CleanupIne        .o.
               CleanupIns        .o.
               CleanupNom        .o.
               CleanupSub        .o.
               CleanupSup        .o.
               CleanupTer        .o.
               HarmRuleO         .o. 
               HarmRuleJ         .o. 
               HarmRuleZ         .o. 
               HarmRuleR         .o. 
               HarmRuleL         .o. 
               HarmRuleN         .o. 
               HarmRuleH         .o. 
               HarmRuleK         .o. 
               HarmRuleQ         .o. 
               HarmRuleS         .o. 
               HarmRuleT         .o. 
               HarmRuleW         .o. 
               HarmRuleG         .o. 
               HarmRuleU         .o. 
               HarmRuleAAA       .o. 
               HarmRuleI         .o. 
               HarmRuleVV        .o. 
               HarmRuleAA        .o. 
               HarmRuleonen      .o. 
               Cleanup;


regex Grammar;

Több fájl (lexc/foma pár) összekapcsolása[szerkesztés]

Ha több fájlt akarunk összekapcsolni, akkor az egyes foma fájlok végén írjuk be:

read regex Grammar2;
save stack filename.fst

Ez kiirja a transzduktort egy fájlba.

A transzduktor fájlok összefűzése az osszefuz.foma fájlban történik:

read regex @"huna1.fst" | @"huna2.fst" ;


Tesztelés:[szerkesztés]

foma -l osszefuz.foma

>lower-words
szó1
..
szón
>up
>szó1ragokkal
szó1+N+...
>szó2ragokkal
szó2+N+...
>ctrl-D
>down
>szó2+N+PL+Gen+...
szó2ragokkal
>szó1+N+PL+Gen+...
szó1ragokkal
> Ctrl-d