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

Lásd még[szerkesztés]