Difference between revisions of "Crearea unui dictionar folosind HFST"
Line 322: | Line 322: | ||
===With the power of intersecting composition!=== |
===With the power of intersecting composition!=== |
||
Pentru a obţine analizatorul final trebuie să combinăm cele două modele din fişierele <code>lexc</code> şi <code>twol</code>. Această operaţie se face prin intermediul unei intersecţii. Intersecţia e realizată folosind comanda <code>hfst-compose-intersect</code> pe care o vom folosi mai departe. |
|||
<pre> |
<pre> |
||
Line 328: | Line 328: | ||
</pre> |
</pre> |
||
Acum să testăm analizatorul final: |
|||
<pre> |
<pre> |
||
Line 338: | Line 338: | ||
</pre> |
</pre> |
||
Excelent!! Acum avem formele corecte ale substantivelor. |
|||
Great!! We have the desired forms. |
|||
==Analysis and generation== |
==Analysis and generation== |
Revision as of 17:21, 24 November 2011
- Pentru mai multe informaţii despre instalarea formatului HFST, apăsaţi aici.
Această pagină vă va prezenta cum să creaţi un nou dicţionar folosind HFST. Se pot găsi şi referinţe foarte utile cu privire la formalismele lexc şi twol, precum FSMBook, dar majoritatea lor folosesc implementaţia Xerox, nu cea gratuită oferită de HFST.
Deşi formalismele actuale sunt mai mult sau mai puţin asemănătoare, comenzile folosite pentru compilarea lor nu sunt tot timpul aceleași. HFST este bazat pe compatibilitatea cu sistemele de operare Unix. Noi vom profita de acest avantaj. Deoarece la majoritatea limbilor indo-europene şi cele simpliste pot fi tratate cu uşurinţă de lttoolbox, noi vom încerca să abordăm o limbă care nu face parte din această familie, una care are o morfologie complexă şi nu poate fi tratată cu uşurinţă de lttoolbox.
Introducere
Un analizator morfologic HFST are două fişiere cu reguli, unul dintre ele este lexc
. Acesta defineşte modul în care sunt formate cuvintele din morfeme. De exemplu, cuvântul lup + i
devine lupi
.
Cel de-al doilea fişier poate fi unul twol
(two-level rules) sau unul xfst
(reguli de rescriere secvenţiale). Acestea prezintă ce se întâmplă când morfemele formează cuvântul. Ca exemplu poate fi folosit lup<n><pl>
→ lup + i
.
Noi vom lucra pe această pagină cu tipul twol
, cel cu reguli pe două nivele. Dacă sunteţi interesat de xfst
, puteţi găsi un tutorial pe [Foma această pagină].
În următoarele secţiuni vom începe cu vocabularul (fişierul lexc
), iar apoi vom trece la fişierul twol
.
Mai întâi este necesar să compilaţi HFST3.
Limba
Limba pe care o vom folosi este cea vorbită în Turkmenistan, o limbă derivată din cea turcă. Vom lucra pe perechea de limbi turcă-turkmenistană. Vom încerca să schimbăm numărul şi cazul substantivelor. Substantivul în turkmenistană poate avea şase cazuri, 2 genuri şi posesiv. Sufixele pot avea forme diferite în funcţie de sfârşitul cuvântului de bază: dacă e vocală sau consoană.
Armonia vocalică
Simplificând mult, deoarece [1], se poate spune că în limba turkmenistană cuvintele de bază pot fi de două tipuri: care conţin vocale superioare sau conţin [vocale anterioare]. De exemplu mugallym "profesor" are doar vocale anterioare, iar kädi "dovleac" are doar vocale posterioare. Vocalele anterioare sunt: a, y, o, şi u. Cele posterioare sunt: ä, e, i, ö, şi ü.
Deci, când adăugam unui cuvânt de bază un sufix, trebuie să ştim ce tip de vocale conţine cuvântul pentru a alege vocala potrivită pentru sufix.
Numărul
Numărul în turkmenistană poate să fie singular (în cazurile în care nu prezintă sufix) sau plural, unde sufixul este -lar sau -ler. Primul este folosit pentru cuvintele cu vocale anterioare, iar cel de-al doilea este folosit pentru cuvintele cu vocale posterioare.
Cazurile
Noi am folosit o metodă compactă pentru a prezenta sufixele pentru cazuri. Între { şi } se află vocalele care pot fi folosite în sufixe, iar între ( şi ) sunt sunete adăugate.
Caz | Sufix | Utilizare | Exemple | ||
---|---|---|---|---|---|
V | C | V | C | ||
Nominativ | Subiectul propoziţiei | pagta | gazan | ||
Genitiv | -n{y,i,u,ü}ň | -{y,i,u,ü}ň | Arată posesiunea | pagtanyň | gazanyň |
Dativ | -{a,ä} , -n{a,e} | -{a,e} | Complement indirect | pagta | gazana |
Acuzativ | -n{y,i} | -{y,i} | Complement direct | pagtany | gazany |
Inesiv | -(n)d{a,e} | -d{a,e} | Timp/loc | pagtada | gazanda |
Instrumental | -(n)d{a,e}n | -d{a,e}n | Prin intermediul acestuia subiectul face acţiunea | pagtadan | gazandan |
Alte exemple
Notă: Acestea nu includ cazul posesiv.
maşgala "familie" | ||
---|---|---|
Caz | Singular | Plural |
Nominativ | maşgala | maşgalalar |
Genitiv | maşgalanyň | maşgalalaryň |
Dativ | maşgala | maşgalalara |
Acuzativ | maşgalany | maşgalalary |
Inesiv | maşgalada | maşgalalarda |
Instrumental | maşgaladan | maşgalalardan |
esger "soldat" | ||
---|---|---|
Caz | Singular | Plural |
Nominativ | esger | esgerler |
Genitiv | esgeriň | esgerleriň |
Dativ | esgere | esgerlere |
Acuzativ | esgeri | esgerleri |
Inesiv | esgerde | esgerlerde |
Instrumental | esgerden | esgerlerden |
Vocabularul
Deci, după descrierea de mai sus, să începem cu vocabularul (lexicon în limba engleză). Vom crea un fişier numit apertium-tr-tk.tk.lexc
, care va conţine vocabularul analizatorului. Deschideţi editorul de texte.
Începutul
Primul lucru pe care trebuie să îl facem este definirea etichetelor pe care vrem să le folosim. În lttoolbox, aceasta este făcută în secţiunea <sdefs>
a fişierului .dix
.
Multichar_Symbols %<n%> ! Substantiv %<nom%> ! Nominativ %<pl%> ! Plural
Simbolurile <
şi >
sunt rezervate în lexc
, deci trebuie să le introducem prin %
.
De asemenea, trebuie să definim un vocabular principal (Root
), care va cuprinde mai multe cuvinte ale vocabularului NounStems
. Vocabularul Root
este echivalent cu <section id="main" type="standard">
din lttoolbox:
LEXICON Root NounStems ;
Acum vom adăuga cele două cuvinte ale noastre:
LEXICON NounStems maşgala Ninfl ; ! "familie" esger Ninfl ; ! "soldat"
Prima dată scriem cuvântul de bază, apoi adăugăm categoria din care face parte, în cazul nostru Ninfl
, şi, în final, adăugăm un comentariu (folosind simbolul !
) în care scriem traducerea.
Apoi definim principala regulă de modificare a cuvântului, prin etichetarea cuvântului de bază cu <n>
pentru a indica faptul că e vorba de substantive:
LEXICON Ninfl %<n%>: # ;
Acest LEXICON
ar trebui pus înaintea vocabularului NounStems
. Simbolul #
indică sfârşitul cuvântului. Este important să îl includem, pentru că îi spune analizatorului unde să se oprească.
Compilarea
Deci, acum că avem vocabularul principal, putem să-l compilăm şi să-l testăm. Îl putem compila folosind hfst-lexc
:
$ hfst-lexc apertium-tr-tk.tk.lexc > tk-tr.lexc.hfst
Şi îl putem testa folosind hfst-fst2strings
:
$ hfst-fst2strings tk-tr.lexc.hfst maşgala<n>:maşgala esger<n>:esger
Continuation lexica
Am reuşit să implementăm că maşgala şi esger sunt substantive, dar cum rămâne cu schimbarea numărului şi a cazului? Aici intervine continuation lexica. Acestea sunt ca şi paradigm-urile din lttoolbox, adică legături între atributele substantivului (cazul/numărul/etc.) şi morfemul corespunzătoare acestora.
Principalul mod de a forma cuvintele din morfeme este în limba turkmenistană este:
- Cuvânt de bază plural? posesiv? caz copulativ?
Unde ?
arată că unele sufixe sunt opţionale. Nu e vorba doar de număr şi caz. Pentru a descrie noua formă, trebuie să începem cu numărul. În secţiunea LEXICON Ninfl
a fişierului, adăugaţi:
%<n%>%<pl%>:%>l%{A%}r # ;
Pare cam complicat! Probabil, dar fiecare parte este necesară. Ele pot fi descrise astfel:
Parte | Descriere |
---|---|
%<n%>%<pl%> |
În stânga se defineşte analiza, în cazul nostru substantiv, plural. Spre deosebire de HFST, în lttoolbox analiza este definită în dreapta. |
: |
Simbolul : delimitează jumătatea stângă de cea dreaptă (sau atributele cuvântului de morfemul corespunzător acestora)
|
%>%>l%{A%}r |
Aici este prezentat sufixul formei de plural a substantivelor. Poate fi împărţit în: |
%> |
Delimitatorul de morfeme (vom reveni la acestea mai târziu, dar, în principiu, sunt puse unde între morfeme, în locurile în care ar putea avea loc schimbări). |
l%{A%}r |
Morfemul corespunzător formei, în cazul nostru-lar sau -ler |
%{A%} |
O "arhivocală"... un înlocuitor pentru o vocală care poate fi ori a, ori e |
# |
Sfârşitul legăturii |
; |
Sfârşitul liniei |
Pare complicat mai ales datorită folosirii repetate a simbolului %
. Dacă le scoatem devine mult mai lizibil:
<n><pl>:>l{A}r # ;
(Totuşi, ele sunt obligatorii)
Pentru a face o comparaţie, în lttoolbox (se notează cu simbolul · legătura dintre morfem şi atribute, iar este echivalentul lui {A}), aceasta ar arăta cam aşa:
<e><p><l>·l<s n="A"/>r</l><r><s n="n"/><s n="pl"/></e>
Deci, acum am adăugat prima legătură, pluralul. Trebuie să mai facem două lucruri înainte de a o testa. În primul rând, trebuie să adăugăm %{A%}
la secţiunea fişierului Multichar_Symbols
, aşa că mergeţi înapoi şi faceţi schimbarea. Ar trebui să arate cam aşa:
Multichar_Symbols %<n%> ! Substantiv %<nom%> ! Nominativ %<pl%> ! Plural %{A%} ! Arhivocală 'a' sau 'e'
Salvaţi fişierul. Apoi compilaţi din nou:
$ hfst-lexc apertium-tr-tk.tk.lexc > tk-tr.lexc.hfst
Şi putem testa:
$ hfst-fst2strings tk-tr.lexc.hfst maşgala<n><pl>:maşgala>l{A}r maşgala<n>:maşgala esger<n><pl>:esger>l{A}r esger<n>:esger
Ok, asta e destul de tare, dar pe de altă parte, acestea nu sunt chiar formele reale. Nu există în niciun text esger>l{A}r. Noi vrem să obţinem forma esgerler. Dar cum o putem face?
Folosirea twol
Fişierul twol
are rolul de a lua formele produse le lexc şi, prin aplicarea unor reguli, să le transforme în forme reale ale cuvintelor. Deci, aici vom schimba -l{A}r în -lar sau -ler.
Noi vrem ca dacă acel cuvânt de bază conţine vocale posterioare, atunci dorim să adăugăm terminaţia pentru vocale posterioare, iar dacă conţine vocale anterioare, să adaugăm terminaţia pentru vocale anterioare. În acelaşi timp, dorim să înlăture legătura morfemului.
Vom face un nou fişier numit apertium-tr-tk.tk.twol
.
Prima dată trebuie să definim alfabetul:
Alphabet A B Ç D E Ä F G H I J Ž K L M N Ň O Ö P R S Ş T U Ü W Y Ý Z a b ç d e ä f g h i j ž k l m n ň o ö p r s ş t u ü w y ý z %{A%}:a ;
Nu este neapărat să scrieţi literele mari şi mici pe linii separate, dar scriindu-le astfel este mai lizibil.
De asemenea, dorim să înlăturăm legăturile %>
din cuvântul nostru, indiferent de ce s-ar întâmpla, deci adăugaţi următoarea linie sub ultima linie care conţine literele mici, înainte de ;
:
%>:0
Aici, partea din stânga este forma primită de la lexc, iar în cea dreaptă este forma pe care o dorim. Comanda %>:0
înlocuieşte %>
cu 0
, care e acelaşi lucru cu ştergerea. Simbolul 0
nu se afişează.
So, the final alphabet section will look like this:
Alphabet A B Ç D E Ä F G H I J Ž K L M N Ň O Ö P R S Ş T U Ü W Y Ý Z a b ç d e ä f g h i j ž k l m n ň o ö p r s ş t u ü w y ý z %{A%}:a %>:0 ;
Acum trebuie să definim nişte "seturi" cu care să lucrăm, care, în principiu, au rolul de a numi unele grupe de litere, precum "vocală posterioară" şi "vocală anterioară", pe care le vom folosi mai târziu în reguli:
Sets Consoana = B Ç D F G H J Ž K L M N Ň P R S Ş T W Z b ç d f g h j ž k l m n ň p r s ş t w z ; Vocala = A E Ä I O Ö U Ü Y Ý a e ä i o ö u ü y ý ; VocalaPosterioara = Ä E I Ö Ü ä e i ö ü ; VocalaAnterioara = A Y O U a y o u ; NuPosterioară = Consoana VocalaPosterioara %> ; NuAnterioară = Consoana VocalaAnterioara %> ;
Acum că avem totul pregătit, pentru a adăuga regulile creăm o nouă secţiune: Rules
:
Rules "Înlocuirea în cazul vocalelor posterioare" %{A%}:e <=> VocalăPosterioară: NuPosterioară:* %>: NuAnterioară:* _ ;
Această regulă înlocuieşte {A} cu e dacă ultimele litere sunt orice în afară de vocale anterioare, atunci este o legătură de morfeme, nu sunt vocale anterioare şi există pe undeva o vocală posterioară.
Urmează să compilăm regula şi să o testăm:
$ hfst-twolc -R -i apertium-tr-tk.tk.twol -o tk-tr.twol.hfst Reading input from tk.twol. Writing output to tk.twol.hfst. Reading alphabet. Reading sets. Reading rules and compiling their contexts and centers. Compiling and storing rules. Compiling rules. Storing rules.
With the power of intersecting composition!
Pentru a obţine analizatorul final trebuie să combinăm cele două modele din fişierele lexc
şi twol
. Această operaţie se face prin intermediul unei intersecţii. Intersecţia e realizată folosind comanda hfst-compose-intersect
pe care o vom folosi mai departe.
$ hfst-compose-intersect -1 tr-tk.lexc.hfst -2 tr-tk.twol.hfst -o tr-tk.autogen.hfst
Acum să testăm analizatorul final:
$ hfst-fst2strings tr-tk.autogen.hfst maşgala<n>:maşgala maşgala<n><pl>:maşgalalar esger<n>:esger esger<n><pl>:esgerler
Excelent!! Acum avem formele corecte ale substantivelor.
Analysis and generation
The transducer we made above was for generation, but we can't yet use it with hfst-proc
because of the format. If we want to use it with hfst-proc
, all we need to do is change the format, with the following command:
$ hfst-fst2fst -O -i tr-tk.autogen.hfst -o tr-tk.autogen.hfst.ol
Now we should be able to generate both of our plurals:
$ echo "^maşgala<n><pl>$" | hfst-proc -g tr-tk.autogen.hfst.ol maşgalalar
and
$ echo "^esger<n><pl>$" | hfst-proc -g tr-tk.autogen.hfst.ol esgerler
But what if we want to analyse some words ? Well, then we need to invert the transducer. This is changing the left side to the right side, and the right side to the left side, let's do it in two stages so we can see the results:
$ hfst-invert -i tr-tk.autogen.hfst -o tk-tr.automorf.hfst $ hfst-fst2strings tk-mor.hfst maşgala:maşgala<n> maşgalalar:maşgala<n><pl> esger:esger<n> esgerler:esger<n><pl>
As we can see, now the left side is the surface form, and the right side the analysis. Now just to convert the analyser to optimised lookup format:
$ hfst-fst2fst -O -i tk-tr.automorf.hfst -o tk-tr.automorf.hfst.ol
And do some analysis:
$ echo "maşgalalar" | hfst-proc tk-tr.automorf.hfst.ol ^maşgalalar/maşgala<n><pl>$ $ echo "esgerler" | hfst-proc tk-tr.automorf.hfst.ol ^esgerler/esger<n><pl>$
Troubleshooting
Here is a brief troubleshooting checklist for when you do something, but it isn't working:
- Are all your multicharacter symbols defined ? Including archivowels/consonants. If you think you added them, triple check. This goes for problems in
twol
as well as inlexc
.
Notes
- ↑ Acest subiect este foarte complicat, dar pentru un exemplu didactic, este de ajuns