Magyar főnévragozás fomával
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év | Magyarázat |
|---|---|
| plu | plural (házak) |
| fam | fam rag (ék) |
| gen | genitiv (é, éi) |
| case | ragok (ba,be, ban,ben, tól, től, stb...) |
| tem|soc|dis|ess | ragok, 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ő |
Tartalomjegyzék |
[szerkesztés] Lexc fájl:
!!!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....
[szerkesztés] foma fájl:
### 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;
[szerkesztés] Több fájl (lexc/foma pár) összekapcsolása
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" ;
[szerkesztés] Tesztelé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