SFST magyar főnevek va-ve-val-vel rossz példa
A Programozás Wiki wikiből
Ez a példa, azt illusztrálja, hogyan nem szabad építkezni SFST-vel. Egy nagy ALPHABET megadja a változtatandó változókat, majd egymás után képezzük a szabályokat, és and-al (&) összekapcsoljuk őket, és a végén az összekapcsolt nagy szabályt alkalmazzuk a szavakra. A program működik ugyan, az eredmény helyes, de a memóriafogyasztás nagy és a működés lassú. Ehelyett a SFST magyar főnevek va-ve-val-vel módszert javasoljuk, amely minimális memóriahasználattal és gyors fordítási idővel lényegesen hatásosabban működik.
%%%%%%%%%%%%%% raggenpl2and.fst %%%%%%%%%%%%%%%%%%% % http://wiki.prog.hu/wiki/SFST_magyar_főnévragozás vá-vé-val-vel %%%%%%%%%%%%%% Hungarian nouns vá,vé, val, vel endings (case: ins, fac) %%%%%%%%%%% % ins val, vel % fac vá, vé %%% words % tar % né %%%% rule % tar-rá % né-vé % tar-é-vá % tar-ok-ká % nék-ké % né-é-vé %%%%%%%%%%%%%%% symbols %%%%%%%%%%%%%%%%%%%% #cons# = bcdfghjklmnprstvwxyz #vowel# = aeiouáéíówúöüőű #letter# = #cons##vowel# #magas# = eéiíöőüű #magas1# = eéií #mely# = aáouóú #mely1# = ouóú #oe# = öüőű #aa# = aá %%%%%%%%%%%%%%% phon rules %%%%%%%%%%%%%%%%%%%% ALPHABET = [#cons#] [#vowel#] <AA>:e <AA>:a \ <AAA>:[éá] \ <oeoez>:o <oeoez>:e <oeoez>:ö <oeoez>:<> \ <VV>:[v<>] \ <OEOE>:o <OEOE>:e <OEOE>:ö \ <OEOE1>:o <OEOE1>:e <OEOE1>:ö <OEOE1>:<> \ <Noun> <dup> <ins> <fac> $ma0$ = ([#mely#] [#cons#]* <Noun> .*) <AA> <=> a $ma1$ = ([#mely#] [#cons#]* <Noun> .*) <AAA> <=> á $As2$ = ([#mely#] [#cons#]+ <Noun> .*) <oeoez> <=> o $As3$ = ([#oe#] [#cons#]+ <Noun> .*) <oeoez> <=> ö $As4$ = ([#magas1#] [#cons#]+ <Noun> .*) <oeoez> <=> e $ma2$ = ($As2$ & $As3$ & $As4$) $oeoe1$ = ([#mely#] [#cons#]* <Noun> .*) <OEOE> <=> o $oeoe2$ = ([#magas1#] [#cons#]* <Noun> .*) <OEOE> <=> e $rp1$ = $oeoe1$ & $oeoe2$ $oeoe11$ = ([#mely#] [#cons#]+ <Noun> .*) <OEOE1> <=> o $oeoe12$ = ([#magas1#] [#cons#]+ <Noun> .*) <OEOE1> <=> e $oeoe13$ = ([#oe#] [#cons#]+ <Noun> .*) <OEOE1> <=> ö $rp2$ = $oeoe11$ & $oeoe12$ & $oeoe13$ $rp3$ = ((<Noun>.*[#vowel#].*[<dup>] .*) | ([#vowel#] <Noun>[^#vowel#]*[<dup>] .*)) <VV> <=> v % tarévá, lévé #=D# = #cons# $T$ = {[#=D#]}:{[#=D#][#=D#]} ALPHABET = [#cons#] [#vowel#] <Noun> <fac> <dup><ins> % tar-> tarrá $duplicate1$ = $T$ ^-> ( __ <Noun> [^#letter#]* <dup> .*) % tarok -> tarokká $duplicate2$ = $T$ ^-> ( <Noun> .* __ [^#vowel#]* <dup> .*) % a to á and e to é if word ends with a or e $a_to_aa$ = {a}:{á} ^-> (__ [<Noun>] [^k].*) $e_to_ee$ = {e}:{é} ^-> (__ [<Noun>] [^k].*) % delete pos tags ALPHABET = [#cons#] [#vowel#] [<Noun><dup>]:<> $delete_POS$ = .* %%%%%%%%%%%%%%%%%% inflections%%%%%%%%%%%%%%%%%%%%%%%%%%5 % <Noun> is needed to see the word''s end $plu$ = <pl>:{<oeoez>k} $nom$ = <nom>:{} $ins$ = <ins>:{<dup><VV><AA>l} $fac$ = <fac>:{<dup><VV><AAA>} $case$ = $fac$ | $ins$ | $nom$ $posss1$ = {<posss1>}:{<OEOE1>m} $poss$ = $posss1$ $gen$ = {<gen>}:{é} $gen$ = $gen$ % (ház-aknak ház-amnak ház-ak-é(i)nak ház-am-é(i)nak ház-nak) $CASEP$ = ($plu$? | $poss$?) $gen$? $case$ %%%%%%%%%%%%%%%%%%%%%%% HU morphology for nouns%%%%%%%%%%%%%%% $morph$ = "noun-reg001.lex" <Noun> $morph$ >> "morph8.a" $morph$ = $morph$ $CASEP$ $morph$ >> "morph1.a" $morph$ = $morph$ || ($ma0$ & $ma1$ & $ma2$ & $rp1$ & $rp2$ & $rp3$ ) || $duplicate1$ || $duplicate2$ || $a_to_aa$ || $e_to_ee$ || $delete_POS$ $morph$ >> "morph3.a" $morph$ %%%%%%%%%%% noun-reg001.lex %%%%%%%%%%%%%%%%%%%% % tar % né %%%%%%%%%% fst-generate reggenpl1.a %%%%%%%%%%%%% % tar<>:r<Noun><fac>:<dup><>:á % tar<>:r<Noun><ins>:<dup><>:a<>:l % tar<Noun><gen>:é<fac>:<dup><>:v<>:á % tar<Noun><gen>:é<ins>:<dup><>:v<>:a<>:l % tar<Noun><pl>:a<>:k<gen>:é<fac>:<dup><>:v<>:á % tar<Noun><pl>:a<>:k<gen>:é<ins>:<dup><>:v<>:a<>:l % tar<Noun><pl>:a<>:k<>:k<fac>:<dup><>:á % tar<Noun><pl>:a<>:k<>:k<ins>:<dup><>:a<>:l % tar<Noun><posss1>:o<>:m<gen>:é<fac>:<dup><>:v<>:á % tar<Noun><posss1>:o<>:m<gen>:é<ins>:<dup><>:v<>:a<>:l % tar<Noun><posss1>:o<>:m<>:m<fac>:<dup><>:á % tar<Noun><posss1>:o<>:m<>:m<ins>:<dup><>:a<>:l % né<Noun><gen>:é<fac>:<dup><>:v<>:é % né<Noun><gen>:é<ins>:<dup><>:v<>:e<>:l % né<Noun><pl>:e<>:k<>:k<fac>:<dup><>:é % né<Noun><pl>:e<>:k<>:k<ins>:<dup><>:e<>:l % né<Noun><pl>:e<>:k<gen>:é<fac>:<dup><>:v<>:é % né<Noun><pl>:e<>:k<gen>:é<ins>:<dup><>:v<>:e<>:l % né<Noun><posss1>:<><>:m<>:m<fac>:<dup><>:é % né<Noun><posss1>:<><>:m<>:m<ins>:<dup><>:e<>:l % né<Noun><posss1>:<><>:m<gen>:é<fac>:<dup><>:v<>:é % né<Noun><posss1>:<><>:m<gen>:é<ins>:<dup><>:v<>:e<>:l % né<Noun><fac>:<dup><>:v<>:é % né<Noun><ins>:<dup><>:v<>:e<>:l %%%%%% do.sh%%%%%%%%% % fst-compiler-utf8 raggenpl1.fst raggenpl1.a % fst-generate morph9.a >/tmp/morph9 % fst-generate morph10.a >/tmp/morph10 % fst-generate morph11.a >/tmp/morph11 % fst-generate morph12.a >/tmp/morph12 % fst-generate raggenpl1.a >/tmp/tarne