Difference between revisions of "Jaunas valodas uzsakšana ar HFST"

From Apertium
Jump to navigation Jump to search
 
(4 intermediate revisions by one other user not shown)
Line 8: Line 8:
==Priekšdarbi==
==Priekšdarbi==


Morfoloģiskais devējs HFST ir divi principiāli faili, viens ir <code>lexc</code> fails. Tas definē kā morfēmas valodā ir savienotas, ''morfotaktikas''. Otrs fails var būt <code>twol</code> (divu līmeņu noteikums) vai <code>xfst</code> (kārtas pārrakstīšanas noteikums) fails. Šie faili apraksta, kādas pārmaiņas notiks, ka šīs morfēmas savienosies kopā ''morfografemikas'' (vai ''morfonoloģija''). Piemēram,
Morfoloģiskais pārveidotājs HFST ir divi principiāli faili, viens ir <code>lexc</code> fails. Tas definē kā morfēmas valodā ir savienotas, ''morfotaktikas''. Otrs fails var būt <code>twol</code> (divu līmeņu noteikums) vai <code>xfst</code> (kārtas pārrakstīšanas noteikums) fails. Šie faili apraksta, kādas pārmaiņas notiks, ka šīs morfēmas savienosies kopā ''morfografemikas'' (vai ''morfonoloģija''). Piemēram,


:Morfotaktikas: <code>wolf<n><pl></code> → <code>wolf + s</code>
:Morfotaktikas: <code>wolf<n><pl></code> → <code>wolf + s</code>
Line 31: Line 31:
===Skaitļi===
===Skaitļi===


Skaitļi turkmēņiem var būt nedefinēti (kurā nav piedēkļu) vai daudzskaitļi, kurā piedēkļi ir ''-lar'' vai ''-ler''. Pirmais izmanto aizmugurējos patskaņus, bet otrais izmanto priekšējos patskaņus.
Number in Turkmen can either be undefined (where there is no suffix) or plural, where the suffix is ''-lar'' or ''-ler''. The first is used with back vowels, and the second with front vowels.


===Case===
===Locījumi===


We use a more compact representation below to show the suffixes for case. In between ''{'' and ''}'' are vowel alternations in the suffixes, and in between ''('' and '')'' are [http://en.wikipedia.org/wiki/Epenthetic epentheses].
Zemāk tiek izmantots vairāk kompakto attēlojumu, lai parādītu piedēkļus dažādos locījumos, un starpā ''{'' un ''}'' ir patskaņa maiņa piedēklī un starp ''('' un '')'' ir [http://en.wikipedia.org/wiki/Epenthetic epentheses].


{|class=wikitable
{|class=wikitable
! Case !!colspan=2| Suffix !! Usage !!colspan=2| Example
! Locījums !!colspan=2| Piedēklis !! Izmantojums !!colspan=2| Piemērs
|-
|-
! !! V !! C !! !! V !! C
! !! V !! C !! !! V !! C
|-
|-
| Nominative || || || Indicates the subject of the sentence || pagta || gazan
| Nominatīvs || || || Norāda priekšmetu teikumā || pagta || gazan
|-
|-
| Genitive || ''-n{y,i,u,ü}ň'' || ''-{y,i,u,ü}ň'' || Indicates possession || pagta<u>nyň</u> || gaza<u>nyň</u>
| Ģenitīvs || ''-n{y,i,u,ü}ň'' || ''-{y,i,u,ü}ň'' || Norāda pozīciju || pagta<u>nyň</u> || gaza<u>nyň</u>
|-
|-
| Dative || ''-{a,ä} , -n{a,e}'' || ''-{a,e}'' || Indirect object (directed action) || pagta || gazan<u>a</u>
| Datīvs || ''-{a,ä} , -n{a,e}'' || ''-{a,e}'' || Netiešs objekts (tieša darbība) || pagta || gazan<u>a</u>
|-
|-
| Accusative || ''-n{y,i}'' || ''-{y,i}'' || Direct object || pagta<u>ny</u> || gaza<u>ny</u>
| Akuzatīvs || ''-n{y,i}'' || ''-{y,i}'' || Tiešs obejkts || pagta<u>ny</u> || gaza<u>ny</u>
|-
|-
| Inessive || ''-(n)d{a,e}'' || ''-d{a,e}'' || Time/place || pagta<u>da</u> || gazan<u>da</u>
| Lokatīvs || ''-(n)d{a,e}'' || ''-d{a,e}'' || Laiks/vieta || pagta<u>da</u> || gazan<u>da</u>
|-
|-
| Instrumental || ''-(n)d{a,e}n'' || ''-d{a,e}n'' || Origin || pagta<u>dan</u> || gazan<u>dan</u>
| Instrumentālis || ''-(n)d{a,e}n'' || ''-d{a,e}n'' || izcelsme || pagta<u>dan</u> || gazan<u>dan</u>
|-
|-
|}
|}


===Full paradigm===
===Pilns piemērs===


Piezīme: Šis neietver ģenitīvu.
Note: This does not include the possessive.


{|class=wikitable
{|class=wikitable
!colspan=3|''maşgala'' "family"
!colspan=3|''maşgala'' "ģimene"
|-
|-
! Case !! Singular !! Plural
! Locījums !! Vienskaitlis !! Daduzskaitlis
|-
|-
| '''Nominative''' || maşgala || maşgalalar
| '''Nominatīvs''' || maşgala || maşgalalar
|-
|-
| '''Genitive''' || maşgalanyň || maşgalalaryň
| '''Ģenitīvs''' || maşgalanyň || maşgalalaryň
|-
|-
| '''Dative''' || maşgala || maşgalalara
| '''Datīvs''' || maşgala || maşgalalara
|-
|-
| '''Accusative''' || maşgalany || maşgalalary
| '''Akuzatīvs''' || maşgalany || maşgalalary
|-
|-
| '''Inessive''' || maşgalada || maşgalalarda
| '''Lokatīvs''' || maşgalada || maşgalalarda
|-
|-
| '''Instrumental''' || maşgaladan || maşgalalardan
| '''Instrumentālis''' || maşgaladan || maşgalalardan
|-
|-
|}
|}


{|class=wikitable
{|class=wikitable
!colspan=3|''esger'' "soldier"
!colspan=3|''esger'' "kareivis"
|-
|-
! Case !! Singular !! Plural
! Locījums !! Vienskaitlis !! Daudzskaitlis
|-
|-
| '''Nominative''' || esger || esgerler
| '''Nominatīvs''' || esger || esgerler
|-
|-
| '''Genitive''' || esgeriň || esgerleriň
| '''Ģenitīvs''' || esgeriň || esgerleriň
|-
|-
| '''Dative''' || esgere || esgerlere
| '''Datīvs''' || esgere || esgerlere
|-
|-
| '''Accusative''' || esgeri || esgerleri
| '''Akuzatīvs''' || esgeri || esgerleri
|-
|-
| '''Inessive''' || esgerde || esgerlerde
| '''Lokatīvs''' || esgerde || esgerlerde
|-
|-
| '''Instrumental''' || esgerden || esgerlerden
| '''Instrumentālis''' || esgerden || esgerlerden
|-
|-
|}
|}


==Lexicon==
==Vārdu krājums==


So, after going through the little description above, let's start with the lexicon. The file we're going to make is called <code>apertium-tr-tk.tk.lexc</code>, and it will contain the lexicon of the transducer. So open up your text editor.
Tātad, pēc iziešanas cauri nelielam aprakstam, sāksim ar vārdu krājumu. Fails ko mēs veidosim saucas <code>apertium-tr-tk.tk.lexc</code>, un tas satur vārdu krājumu no pārveidotāja. Tādēļ atveriet teksta redaktoru.


===The basics===
===Pamati===


The first thing we need to define are the tags that we want to produce. In [[lttoolbox]], this is done through the <code><sdefs></code> section of the <code>.dix</code> file.
Pirmā lieta, ko mums vajag definēt ir etiķetes, kuras mēs vēlamies radīt. Ar [[lttoolbox]], tas ir izdarāms ar <code><sdefs></code> sektoru no <code>.dix</code> faila.


<pre>
<pre>
Vairākzīmju simboli
Multichar_Symbols


%<n%> ! Noun
%<n%> ! Lietvārds
%<nom%> ! Nominative
%<nom%> ! Nominatīvs
%<pl%> ! Plural
%<pl%> ! Daudzskaitlis
</pre>
</pre>


The symbols <code>&lt;</code> and <code>&gt;</code> are reserved in <code>lexc</code>, so we need to escape them with <code>%</code>
Simboli <code>&lt;</code> un <code>&gt;</code> ir rezervēti ar <code>lexc</code>, tāpēc mums vajag izvairīties no tiem ar <code>%</code>


We also need to define a <code>Root</code> lexicon, which is going to point to a list of stems in the lexicon <code>NounStems</code>. The <code>Root</code> lexicon is analagous to the <code><section id="main" type="standard"></code> in [[lttoolbox]]:
Mēs arī definējam <code>Root</code> vārdnīcu, kas norādīs uz sarakstu celmu vārdnīcā <code>NounStems</code>. <code>Root</code> vārdnīca ir analoga <code><section id="main" type="standard"></code> iekš [[lttoolbox]]:


<pre>
<pre>
Line 126: Line 126:
</pre>
</pre>


Tagad pievienosim mūsu abus vārdus:
Now let's add our two words:


<pre>
<pre>
LEXICON NounStems
LEXICON NounStems


maşgala Ninfl ; ! "family"
maşgala Ninfl ; ! "ģimene"
esger Ninfl ; ! "soldier"
esger Ninfl ; ! "kareivis"
</pre>
</pre>


First we put the stem, then we put the ''paradigm'' (or ''continuation class'') that it belongs to, in this case <code>Ninfl</code>, and finally, in a comment (the comment symbol is <code>!</code>) we put the translation.
Sākumā ieliekam celmu, tad ieliekam ''piemēru'' (vai ''turpinošu klasi'') kurš te ieder, šajā gadījumā <code>Ninfl</code>, un beidzot, komentārā (komentāra simbols ir <code>!</code>) ieliekam tulkojumu.


Un definējam visparastāko locījumu, kas ir piestiprinājis atklāto celmu ar <code><n></code> lai norādītu lietvārdu:
And define the most basic of inflection, that is, tagging the bare stem with <code><n></code> to indicate a noun:


<pre>
<pre>
Line 144: Line 144:
%<n%>: # ;
%<n%>: # ;
</pre>
</pre>
Šim <code>VĀRDU KRĀJUMAM</code> vajadzētu būt ''pirms'' <code>lietvārda celma</code> vārdā. Šis <code>#</code> simbols ir vārda beigu robeža. Tas ir ļoti svarīgi, lai būtu tas, jo tas pasaka, kurā vietā apstāties.


===Kompilācija===
This <code>LEXICON</code> should go ''before'' the <code>NounStems</code> lexicon. The <code>#</code> symbol is the end-of-word boundary. It is very important to have this, as it tells the transducer where to stop.

===Compiling===


So, now we've got our basic lexicon, let's compile it and test it. We compile with <code>hfst-lexc</code>:
Tātad, tagad mums ir vienkārša vārdnīca, kompilēsim un pārbaudīsim to. Mēs kompilējam ar <code>hfst-lexc</code>:


<pre>
<pre>
Line 155: Line 154:
</pre>
</pre>


(If you do not have <code>hfst-lexc</code> installed, you have a problem -- probably you need to compile with <code>--enable-lexc</code>, but in the meantime you can use <code>hfst-lexc2fst</code> in place of <code>hfst-lexc</code>)
(Ja jums nav <code>hfst-lexc</code> instalēts, tev ir problēma -- iespējams jums vajag kompilēt ar <code>--enable-lexc</code>, bet tajā pašā laikā jūs varat izmantot <code>hfst-lexc2fst</code> šī vietā <code>hfst-lexc</code>)


And we can test it both with <code>hfst-fst2strings</code>:
Un abus mēs varam bārbaudīt ar <code>hfst-fst2strings</code>:


<pre>
<pre>
Line 165: Line 164:
</pre>
</pre>


===Continuation lexica===
===Vārdnīcas turpinājums===


So, we've managed to describe that ''maşgala'' and ''esger'' are nouns, but what about the inflection. This is where ''continuation lexica'' come in. These are like ''paradigms'' in [[lttoolbox]].
Tātad, mēs noskaidrojām, ka ''maşgala'' un ''esger'' ir lietvārdi, bet ar locīšanu. Tas ir kur ''vārdnīcas turpinājums'' sākas. Tie ir, piemēram ''paradigma'' iekš [[lttoolbox]].


Vienkāršās morphotaktikas turkmēņu lietvārdiem ir:
The basic morphotactics of the Turkmen noun is:


:{{sc|stem}} {{sc|plural?}} {{sc|possessive?}} {{sc|case}} {{sc|copula?}}
:{{sc|stem}} {{sc|plural?}} {{sc|possessive?}} {{sc|case}} {{sc|copula?}}


Where <code>?</code> denotes optionality. We're just working with number and case here, so let's describe the inflection, first we can start with number. In the section of the file <code>LEXICON Ninfl</code>, add the following line:
kurā <code>?</code> apzīmē iespējamību. Te mēs tikai strādājām ar skaitļiem un locījumiem, tātad aprakstīsim locīšanu, sāksim ar skaitli. Faila sekcijā <code>LEXICON Ninfl</code>, pievieno sekojošo rindiņu:


<pre>
<pre>
Line 179: Line 178:
</pre>
</pre>


Fuu, tas izskatās diezgan komplicēti!! Iespējams, taču katrai daļai ir savs iemesls, aprakstīsim tos:
Phew, that looks pretty complicated!! Well, perhaps, but each part has it's reason, let's describe them:


{|class=wikitable
{|class=wikitable
! Part !! Description
! Daļa !! Apraksts
|-
|-
| <code>%&lt;n%&gt;%&lt;pl%&gt;</code> || The part on the left side defines the analysis, in this case noun, plural. Note, this is in contrast to lttoolbox, where the analysis is usually on the right side.
| <code>%&lt;n%&gt;%&lt;pl%&gt;</code> || Kreisajā pusē notiek analīze, šajā gadījumā lietvārdam, daudzskaitlī. Ņemiet vērā, ka tas ir pretēji lttoolbox, kur analīze parasti ir labajā pusē.
|-
|-
| <code>:</code> || The symbol <code>:</code> delimits the left and right sides (or surface side, and lexical side)
| <code>:</code> || Simbols <code>:</code> norobežo labo un kreiso pusi (vai virsmas un leksikas pusi)
|-
|-
| <code>%&gt;%&gt;l%{A%}r</code> || This is the surface form, which is split into:
| <code>%&gt;l%{A%}r</code> || Šī ir virsmas forma, kas ir sadalīta:
|-
|-
|&nbsp;&nbsp;&nbsp; <code>%&gt;</code> || The morpheme boundary delimiter (we'll talk about this later, but you put it in between morphemes where changes might happen.
|&nbsp;&nbsp;&nbsp; <code>%&gt;</code> || Morfēmas norobežotājs(mēs par to runāsim vēlāk, bet jūs ielieciet to starp morfēmām kurās varētu notikt izmaiņas.)
|-
|-
|&nbsp;&nbsp;&nbsp; <code>l%{A%}r</code> || The surface morpheme, in this case ''-lar'' or ''-ler''
|&nbsp;&nbsp;&nbsp; <code>l%{A%}r</code> || Virsmas morfēma, šajā gadījumā ''-lar'' vai ''-ler''
|-
|-
|&nbsp;&nbsp;&nbsp; <code>%{A%}</code> || An "archivowel"... a placeholder for a vowel that can be either ''a'' or ''e''
|&nbsp;&nbsp;&nbsp; <code>%{A%}</code> || "Patskaņi"... vietturis patskanis, kas var būt ''a'' vai ''e''
|-
|-
| <code>#</code> || The end of word boundary
| <code>#</code> || Vārda beigu robeža
|-
|-
| <code>;</code> || End of line
| <code>;</code> || Rindas beigas
|-
|-
|}
|}


Part of the reason it looks complicated is all of the <code>%</code> symbols. If we remove them it looks far more readable:
Daļa no iemesla, kādēļ tas izskatās sarežģīti ir visi <code>%</code> simboli. Ja mēs tos noņemtu, tad izskatītos daudz salasāmāks:


<pre>
<pre>
Line 208: Line 207:
</pre>
</pre>


(Jums tie tālāk ir nepieciešami)
(You need to have them though)


For comparison, in lttoolbox (using · for morpheme boundary and <s n="A"/> for the {A}) for , this would look something like:
Salīdzinājumam, lttoolbox (izmantojot · priekš morfēmas robežas un <s n="A"/> par {A}), tas varētu izskatīties apmēram :


<pre>
<pre>
Line 216: Line 215:
</pre>
</pre>


So, we've added the first of our inflections, the plural. We need to do two things before we can test it. First we need to add <code>%{A%}</code> to the <code>Multichar_Symbols</code> section of the file, so scroll to the top and add it, you should get something like:
Tātad, mēs pievienojām pirmo fleksiju, daudzskaitli. Mums ir jāizdara divas lietas, pirms mēs to pārbaudam. Vispirms mums jāpievieno <code>%{A%}</code> pie <code>Multichar_Symbols</code> faila sekcijas, tādēļ dodaties uz augšu un pievienojiet to, jums vajadzētu iegūt kaut ko tādu:


<pre>
<pre>
Multichar_Symbols
Multichar_Symbols


%<n%> ! Noun
%<n%> ! Lietvārds
%<nom%> ! Nominative
%<nom%> ! Nominatīvs
%<pl%> ! Plural
%<pl%> ! Daudzskaitlis


%{A%} ! Archivowel 'a' or 'e'
%{A%} ! Patskaņi 'a' vai 'e'
</pre>
</pre>


Tagad saglabājiet failu. Nākamā lieta, ko mums vajag izdarīt, ir atkal kompilēt failu:
Now save the file. The next thing we need to do is compile again:


<pre>
<pre>
Line 234: Line 233:
</pre>
</pre>


Un tad mēs varam pārbaudīt:
And then we can test:


<pre>
<pre>
Line 244: Line 243:
</pre>
</pre>


Ok, so this is cool, but it also kind of sucks, these aren't real surface forms. We'll never see ''esger>l{A}r'' in any text. The surface form we're looking for is ''esgerler''. So how do we get that ?
Labi, tātad šis ir jauki, tomēr tas tāpat nav diezko labs, šīs nav īsti virsmas formas. Mēs nekad neredzēsim ''esger>l{A}r'' nevienā tekstā. Virsmas formas, kuras mēs meklējam, ir ''esgerler''. Tātad, to iegūt?


==Enter <code>twol</code>==
==Ievieto <code>twol</code>==


The idea of <code>twol</code> is to take the surface forms produced by lexc and apply rules to them to change them into real surface forms. So, this is where we change ''-l{A}r'' into ''-lar'' or ''-ler''.
<code>Twol</code> ideja ir paņemt virsmas formas, kas ir veidotas ar lexc un pievienot noteikumus tām, lai izmainītu to īsto virsmu formu. Tātad, šeit mēs to mainām ''-l{A}r'' par ''-lar'' vai ''-ler''.


Ko mēs būtībā gribam pateikt ir "ja celms satur priekšējos patskaņus, tad mēs vēlamies mainīt priekšējos patskaņus, ja tas satur aizmugurējos patskaņus, tad mēs vēlamies mainīt aizmugurējos patskaņus.". Un tajā pašā laikā noņemt morfēma robežu. Tātad izmēģināsim.
What we basically want to say is "if the stem contains front vowels, then we want the front vowel alternation, if it contains back vowels then we want the back vowel alternation". And at the same time, remove the morpheme boundary. So let's give it a shot.


We're going to make a new file <code>apertium-tr-tk.tk.twol</code>.
Mēs veidosim jaunu failu <code>apertium-tr-tk.tk.twol</code>.


Sākumā mums vajag definēt alfabētu:
First we need to define the alphabet:


<pre>
<pre>
Alfabēts
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 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
Line 263: Line 262:
</pre>
</pre>


Jums nevajag definēt lielos un mazos burtus dažādās rindās, bet tas var to padarīt uztveramāku.
You don't have to define the upper and lower case on separate lines, but it can help make it clearer.


We also want to define at this point, that whatever happens, we want to remove the morpheme boundaries <code>%&gt;</code> from the surface forms, so add the following line just below the last line of lower case letters, and before the <code>;</code>:
Mēs arī vēlamies definēt šajā punktā, jebko, kas notiek, mēs vēlamies noņemt morfēmu robežas <code>%&gt;</code> no virsmas formas, tādēļ pievienojiet sekojošo rindiņu tieši zem pēdējās rindas ar mazajiem burtiem, un pirms <code>;</code>:


<pre>
<pre>
Line 271: Line 270:
</pre>
</pre>


Here, the left side is the morphotactic form, and the right side is the surface form. Doing <code>%&gt;:0</code> changes <code>%&gt;</code> into <code>0</code>, which is the same as deleting it. The <code>0</code> symbol is not output.
Te, kreisajā pusē ir morfotaktikas forma, bet labajā pusē ir virsmas forma. Ar <code>%&gt;:0</code> mainās <code>%&gt;</code> par <code>0</code>, kas ir tas pats, kas izdzēst to. Simbols <code>0</code> neizvadās.


Tātad, beigās alfabēts izskatīsies kā šis:
So, the final alphabet section will look like this:


<pre>
<pre>
Alfabēts
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 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
Line 282: Line 281:
</pre>
</pre>


Tālāk mums vajag definēt dažas dekorācijas ar ko strādāt, tās ir vienkārši lai dotu memoniku vaibstiem, kā priekšējie patskaņi un aizmugurējie patskaņi, ko mēs vēlēsimies vēlāk atsaukties uz noteikumiem:
Next we need to define some "sets" to work with, these are basically for giving mnemonics to features, like "front vowel" and "back vowel" which we want to refer to later in the rules:


<pre>
<pre>
Line 297: Line 296:
</pre>
</pre>


So now we've got everything set up, to add the rule, there is a new section, <code>Rules</code>:
Tātad, mums viss ir uzstādīt, lai pievienotu noteikumus tur ir jauna sekcija, <code>Rules</code>:


<pre>
<pre>
Line 307: Line 306:
</pre>
</pre>


Noteikums vienkārši saka: "Aizstāj {A} ar e, ja iepriekšējais burts ir jebkas, izņemot aizmugurējo patskani, tad tur ir morfēmu robeža, tad tur nav neviena aizmugurējā patskaņa un reizēm ir priekšējais patskanis"
The rule is basically saying: "Substitute {A} with e if the previous letters are anything except back vowels, then there is a morpheme boundary, then there are no back vowels, and at some point there is a front vowel"


Nākamais, lai kompilētu noteikumu un pārbaudītu to:
Next up, to compile the rule and test it:


<pre>
<pre>
$ hfst-twolc -R -i apertium-tr-tk.tk.twol -o tk-tr.twol.hfst
$ hfst-twolc -R -i apertium-tr-tk.tk.twol -o tk-tr.twol.hfst
Reading input from tk.twol.
Nolasīt ievadu no tk.twol.
Writing output to tk.twol.hfst.
Ierakstīt izvadu uz tk.twol.hfst.
Nolasīt alfabētu.
Reading alphabet.
Nolasīt dekorācijas.
Reading sets.
Nolasīt noteikumus un kompilēt to kontekstu un centrus.
Reading rules and compiling their contexts and centers.
Kompilēt un ievietot krātuvē noteikumus.
Compiling and storing rules.
Kompilēt noteikumus.
Compiling rules.
Ievietot krātuvē noteikumus.
Storing rules.
</pre>
</pre>


===Ar varu krustot kompozīciju!===
===With the power of intersecting composition!===


In order to get the final transducer, what we need to do is combine the morphotactic model (<code>lexc</code>) with the morphographemic model (<code>twol</code>). There is a way of doing this called "intersecting composition" which is fairly efficient. There is also a tool in HFST called <code>hfst-compose-intersect</code> which is what we'll be using.
Lai iegūtu beidzamo pārveidotāju, ko mums vajag, lai sakombinētu morfotatikas modeli (<code>lexc</code>) ar morfografemikas modeli (<code>twol</code>). Ir veids to izdarīt, to sauc par "kompozīciju krustošanu", kas ir diezgan iedarbīga. Ir arī instruments no HFST, kas saucas <code>hfst-compose-intersect</code> to mēs izmantosim.


<pre>
<pre>
Line 331: Line 330:
</pre>
</pre>


Tagad mēs varam izmēģināt pēdējo pārveidotāju:
Now we can test the final transducer:


<pre>
<pre>
Line 341: Line 340:
</pre>
</pre>


Lieliski!! Mums ir kārotā forma.
Great!! We have the desired forms.


==Analysis and generation==
==Analīze un ģenerācija==


The transducer we made above was for generation, but we can't yet use it with <code>hfst-proc</code> because of the format. If we want to use it with <code>hfst-proc</code>, all we need to do is change the format, with the following command:
Pārveidotājs, kuru mēs izveidojām, bija paredzēts ražošanai, bet mēs nevaram vēl to izmantot ar <code>hfst-proc</code> formāta dēļ. Ja mēs vēlamies to izmantot ar <code>hfst-proc</code>, viss ko mums vajag pamainīt ir formāts, ar sekojošu komandu:


<pre>
<pre>
Line 351: Line 350:
</pre>
</pre>


Tagad mums vajadzētu varēt izveidot abus mūsu daudzskaitļus:
Now we should be able to generate both of our plurals:


<pre>
<pre>
Line 358: Line 357:
</pre>
</pre>


un
and


<pre>
<pre>
Line 365: Line 364:
</pre>
</pre>


Bet, kas būtu ja mēs vēlētos analizēt kādu vārdu? Tad mums vajag ''pārkonfigurēt'' pārveidotāju. Tas ir samainīt kreiso pusi ar labo pusi vietām, izdarīsim to divās stadijās, lai mēs varētu redzēt rezultātu:
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:


<pre>
<pre>
Line 377: Line 376:
</pre>
</pre>


Kā mēs varam redzēt, tagad kreisā puse ir virsmas forma, un labā puse ir analīze. Tagad tikai konvertējam analizētāju, lai ''optimizētu skatu'' formātam:
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:


<pre>
<pre>
Line 383: Line 382:
</pre>
</pre>


Un veicam analīzi:
And do some analysis:


<pre>
<pre>
Line 393: Line 392:
</pre>
</pre>


==Problēmu novēršana==
==Troubleshooting==


Te ir rezumējums, priekš dažādu problēmu novēršanas, ja jūs kaut ko izdarāt, bet tas nestrādā:
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 <code>twol</code> as well as in <code>lexc</code>.
* Vai visi jūsu ''daudzzīmju simboli'' ir definēti? Ieskaitot patskaņus/līdzskaņus. Ja jūs uzskatāt ka pievienojāt tos, tad trīs reizes pārbaudiet. Daudzas problēmas ir ar <code>twol</code> arīa ar <code>lexc</code>.


==Notes==
==Piezīmes==
<references/>
<references/>


==Veicinoša lasāmviela==
==Further reading==


[[Category:HFST]]
[[Category:HFST]]

Latest revision as of 11:39, 23 January 2012

Informācijai kā instalēt HFST, apskatiet HFST

Šī lapa paskaidros kā sākt jaunas valodas mācīties ar HFST. Šeit ir dažas lieliskas norādes ar lexc un twol formālismu, piemēram FSMBook, bet daudzi no viņiem nodarbojas ar patentēta Xerox realizāciju, nevis bezmaksas HFST patentēšanu.

Kamēr patiesais formālisms ir vairāk vai mazāk vienāds, komandas, kuras izmanto, lai kompilētu tos nevienmēr ir vienāds. HFST ir daudz saderīgāka ar Unix filozofiju. Tātad mēs to izmantosim. Lielākā daļa indoeiropiešu valodas un izolētās valodas var tikt viegli izskatītas ar lttoolbox, mēs varēsim tikt galā ar valodu, kas nav no šīs saimes, un vienu, kas ir morfoloģiski sarežģītāka, ko ir sarežģīti aplūkot ar lttoolbox.

Priekšdarbi[edit]

Morfoloģiskais pārveidotājs HFST ir divi principiāli faili, viens ir lexc fails. Tas definē kā morfēmas valodā ir savienotas, morfotaktikas. Otrs fails var būt twol (divu līmeņu noteikums) vai xfst (kārtas pārrakstīšanas noteikums) fails. Šie faili apraksta, kādas pārmaiņas notiks, ka šīs morfēmas savienosies kopā morfografemikas (vai morfonoloģija). Piemēram,

Morfotaktikas: wolf<n><pl>wolf + s
Morfografemikas: wolf + swolves

Šeit mēs darbosimies ar twol, divu līmeņu noteikumu. Ja jūs esat ieinteresēti xfst failā, šeit ir jauka pamācība pamācība Foma lapā.

Nākamajā sekcijā mēs sāksim ar leksikonu (lexc file) tad progresēsim morfografemētikas (twol failos).

Pārliecinaties, ka jums ir HFST3 kompilēts.

Valoda[edit]

Valodu, ko mēs gatavojamies modelēt šodien — ir turkmēņu valoda, Turku valodā runā Turkmenistānā. Valodu pāri ar kuriem mēs strādāsim ir turku--turkmēņu. Mēs gatavojamies modelēt un izmēģināt pamata locīšanas (skaitļi, locījumi) kategorijas lietvārdus. Pamata locīšana turkmēņu lietvārdiem ir: seši locījumi, divi skaitļu un piederība. Piedēkļiem var būt dažādas formas atkarībā no tā vai tie ir pievienoti patskaņa celmam, vai konstantam beigu celmam.

Patskaņu saskaņa[edit]

Vienkāršojot daudzus,[1], jo varam teikt, ka cenlms turkmēņu vārdiem var būt ar vienu no diviem tipiem, aizmugurējo patskaņu celms, vai priekšējo patskaņu celms. Aizmugurējo patskaņu celms, tādam vārdam kā mugallym "skolotājs" ir tikai aizmugurējie patskaņi, un priekšējo patskaņu celms, tādam vārdam kā kädi "ķirbis" ir tikai priekšējie patskaņi. Aizmugurējie patskaņi Turkmēņiem ir: a, y, o, un u. Priekšējie patskaņi ir: ä, e, i, ö, un ü.

Tātad, kad pievienojam priedēkli pie celma, mums ir jāzina ka patskaņi celmā ir secībā, lai izvēlētos pareizo patskani ko ievietot priedēklī.

Skaitļi[edit]

Skaitļi turkmēņiem var būt nedefinēti (kurā nav piedēkļu) vai daudzskaitļi, kurā piedēkļi ir -lar vai -ler. Pirmais izmanto aizmugurējos patskaņus, bet otrais izmanto priekšējos patskaņus.

Locījumi[edit]

Zemāk tiek izmantots vairāk kompakto attēlojumu, lai parādītu piedēkļus dažādos locījumos, un starpā { un } ir patskaņa maiņa piedēklī un starp ( un ) ir epentheses.

Locījums Piedēklis Izmantojums Piemērs
V C V C
Nominatīvs Norāda priekšmetu teikumā pagta gazan
Ģenitīvs -n{y,i,u,ü}ň -{y,i,u,ü}ň Norāda pozīciju pagtanyň gazanyň
Datīvs -{a,ä} , -n{a,e} -{a,e} Netiešs objekts (tieša darbība) pagta gazana
Akuzatīvs -n{y,i} -{y,i} Tiešs obejkts pagtany gazany
Lokatīvs -(n)d{a,e} -d{a,e} Laiks/vieta pagtada gazanda
Instrumentālis -(n)d{a,e}n -d{a,e}n izcelsme pagtadan gazandan

Pilns piemērs[edit]

Piezīme: Šis neietver ģenitīvu.

maşgala "ģimene"
Locījums Vienskaitlis Daduzskaitlis
Nominatīvs maşgala maşgalalar
Ģenitīvs maşgalanyň maşgalalaryň
Datīvs maşgala maşgalalara
Akuzatīvs maşgalany maşgalalary
Lokatīvs maşgalada maşgalalarda
Instrumentālis maşgaladan maşgalalardan
esger "kareivis"
Locījums Vienskaitlis Daudzskaitlis
Nominatīvs esger esgerler
Ģenitīvs esgeriň esgerleriň
Datīvs esgere esgerlere
Akuzatīvs esgeri esgerleri
Lokatīvs esgerde esgerlerde
Instrumentālis esgerden esgerlerden

Vārdu krājums[edit]

Tātad, pēc iziešanas cauri nelielam aprakstam, sāksim ar vārdu krājumu. Fails ko mēs veidosim saucas apertium-tr-tk.tk.lexc, un tas satur vārdu krājumu no pārveidotāja. Tādēļ atveriet teksta redaktoru.

Pamati[edit]

Pirmā lieta, ko mums vajag definēt ir etiķetes, kuras mēs vēlamies radīt. Ar lttoolbox, tas ir izdarāms ar <sdefs> sektoru no .dix faila.

Vairākzīmju simboli

%<n%>   ! Lietvārds
%<nom%> ! Nominatīvs
%<pl%>  ! Daudzskaitlis

Simboli < un > ir rezervēti ar lexc, tāpēc mums vajag izvairīties no tiem ar %

Mēs arī definējam Root vārdnīcu, kas norādīs uz sarakstu celmu vārdnīcā NounStems. Root vārdnīca ir analoga <section id="main" type="standard"> iekš lttoolbox:


LEXICON Root

NounStems ;

Tagad pievienosim mūsu abus vārdus:

LEXICON NounStems

maşgala Ninfl ; ! "ģimene"
esger Ninfl ;   ! "kareivis"

Sākumā ieliekam celmu, tad ieliekam piemēru (vai turpinošu klasi) kurš te ieder, šajā gadījumā Ninfl, un beidzot, komentārā (komentāra simbols ir !) ieliekam tulkojumu.

Un definējam visparastāko locījumu, kas ir piestiprinājis atklāto celmu ar <n> lai norādītu lietvārdu:

LEXICON Ninfl

%<n%>: # ;

Šim VĀRDU KRĀJUMAM vajadzētu būt pirms lietvārda celma vārdā. Šis # simbols ir vārda beigu robeža. Tas ir ļoti svarīgi, lai būtu tas, jo tas pasaka, kurā vietā apstāties.

Kompilācija[edit]

Tātad, tagad mums ir vienkārša vārdnīca, kompilēsim un pārbaudīsim to. Mēs kompilējam ar hfst-lexc:

$ hfst-lexc apertium-tr-tk.tk.lexc -o tk-tr.lexc.hfst

(Ja jums nav hfst-lexc instalēts, tev ir problēma -- iespējams jums vajag kompilēt ar --enable-lexc, bet tajā pašā laikā jūs varat izmantot hfst-lexc2fst šī vietā hfst-lexc)

Un abus mēs varam bārbaudīt ar hfst-fst2strings:

$ hfst-fst2strings tk-tr.lexc.hfst 
maşgala<n>:maşgala
esger<n>:esger

Vārdnīcas turpinājums[edit]

Tātad, mēs noskaidrojām, ka maşgala un esger ir lietvārdi, bet kā ar locīšanu. Tas ir kur vārdnīcas turpinājums sākas. Tie ir, piemēram paradigma iekš lttoolbox.

Vienkāršās morphotaktikas turkmēņu lietvārdiem ir:

stem plural? possessive? case copula?

kurā ? apzīmē iespējamību. Te mēs tikai strādājām ar skaitļiem un locījumiem, tātad aprakstīsim locīšanu, sāksim ar skaitli. Faila sekcijā LEXICON Ninfl, pievieno sekojošo rindiņu:

%<n%>%<pl%>:%>l%{A%}r # ;

Fuu, tas izskatās diezgan komplicēti!! Iespējams, taču katrai daļai ir savs iemesls, aprakstīsim tos:

Daļa Apraksts
%<n%>%<pl%> Kreisajā pusē notiek analīze, šajā gadījumā lietvārdam, daudzskaitlī. Ņemiet vērā, ka tas ir pretēji lttoolbox, kur analīze parasti ir labajā pusē.
: Simbols : norobežo labo un kreiso pusi (vai virsmas un leksikas pusi)
%>l%{A%}r Šī ir virsmas forma, kas ir sadalīta:
    %> Morfēmas norobežotājs(mēs par to runāsim vēlāk, bet jūs ielieciet to starp morfēmām kurās varētu notikt izmaiņas.)
    l%{A%}r Virsmas morfēma, šajā gadījumā -lar vai -ler
    %{A%} "Patskaņi"... vietturis patskanis, kas var būt a vai e
# Vārda beigu robeža
; Rindas beigas

Daļa no iemesla, kādēļ tas izskatās sarežģīti ir visi % simboli. Ja mēs tos noņemtu, tad izskatītos daudz salasāmāks:

<n><pl>:>l{A}r # ;

(Jums tie tālāk ir nepieciešami)

Salīdzinājumam, lttoolbox (izmantojot · priekš morfēmas robežas un par {A}), tas varētu izskatīties apmēram tā:

<e><p><l>·l<s n="A"/>r</l><r><s n="n"/><s n="pl"/></e>

Tātad, mēs pievienojām pirmo fleksiju, daudzskaitli. Mums ir jāizdara divas lietas, pirms mēs to pārbaudam. Vispirms mums jāpievieno %{A%} pie Multichar_Symbols faila sekcijas, tādēļ dodaties uz augšu un pievienojiet to, jums vajadzētu iegūt kaut ko tādu:

Multichar_Symbols

%<n%>   ! Lietvārds
%<nom%> ! Nominatīvs
%<pl%>  ! Daudzskaitlis

%{A%}   ! Patskaņi 'a' vai 'e'

Tagad saglabājiet failu. Nākamā lieta, ko mums vajag izdarīt, ir atkal kompilēt failu:

$ hfst-lexc apertium-tr-tk.tk.lexc > tk-tr.lexc.hfst

Un tad mēs varam pārbaudīt:

$ 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

Labi, tātad šis ir jauki, tomēr tas tāpat nav diezko labs, šīs nav īsti virsmas formas. Mēs nekad neredzēsim esger>l{A}r nevienā tekstā. Virsmas formas, kuras mēs meklējam, ir esgerler. Tātad, kā to iegūt?

Ievieto twol[edit]

Twol ideja ir paņemt virsmas formas, kas ir veidotas ar lexc un pievienot noteikumus tām, lai izmainītu to īsto virsmu formu. Tātad, šeit mēs to mainām -l{A}r par -lar vai -ler.

Ko mēs būtībā gribam pateikt ir "ja celms satur priekšējos patskaņus, tad mēs vēlamies mainīt priekšējos patskaņus, ja tas satur aizmugurējos patskaņus, tad mēs vēlamies mainīt aizmugurējos patskaņus.". Un tajā pašā laikā noņemt morfēma robežu. Tātad izmēģināsim.

Mēs veidosim jaunu failu apertium-tr-tk.tk.twol.

Sākumā mums vajag definēt alfabētu:

Alfabēts
 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 ;

Jums nevajag definēt lielos un mazos burtus dažādās rindās, bet tas var to padarīt uztveramāku.

Mēs arī vēlamies definēt šajā punktā, jebko, kas notiek, mēs vēlamies noņemt morfēmu robežas %> no virsmas formas, tādēļ pievienojiet sekojošo rindiņu tieši zem pēdējās rindas ar mazajiem burtiem, un pirms ;:

 %>:0 

Te, kreisajā pusē ir morfotaktikas forma, bet labajā pusē ir virsmas forma. Ar %>:0 mainās %> par 0, kas ir tas pats, kas izdzēst to. Simbols 0 neizvadās.

Tātad, beigās alfabēts izskatīsies kā šis:

Alfabēts
 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  ;

Tālāk mums vajag definēt dažas dekorācijas ar ko strādāt, tās ir vienkārši lai dotu memoniku vaibstiem, kā priekšējie patskaņi un aizmugurējie patskaņi, ko mēs vēlēsimies vēlāk atsaukties uz noteikumiem:

Sets

Consonant = 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 ; 
Vowel =     A E Ä I O Ö U Ü Y Ý 
            a e ä i o ö u ü y ý ;
FrontVowel = Ä E I Ö Ü ä e i ö ü ;  
BackVowel = A Y O U a y o u ;
NonBack = Consonant FrontVowel %> ;
NonFront = Consonant BackVowel %> ; 

Tātad, mums viss ir uzstādīt, lai pievienotu noteikumus tur ir jauna sekcija, Rules:

Rules
  
"Front harmony in suffixes"
%{A%}:e <=> FrontVowel: NonBack:* %>: NonBack:* _ ;

Noteikums vienkārši saka: "Aizstāj {A} ar e, ja iepriekšējais burts ir jebkas, izņemot aizmugurējo patskani, tad tur ir morfēmu robeža, tad tur nav neviena aizmugurējā patskaņa un reizēm ir priekšējais patskanis"

Nākamais, lai kompilētu noteikumu un pārbaudītu to:

$ hfst-twolc -R -i apertium-tr-tk.tk.twol -o tk-tr.twol.hfst
Nolasīt ievadu no tk.twol.
Ierakstīt izvadu uz tk.twol.hfst.
Nolasīt alfabētu.
Nolasīt dekorācijas.
Nolasīt noteikumus un kompilēt to kontekstu un centrus.
Kompilēt un ievietot krātuvē noteikumus.
Kompilēt noteikumus.
Ievietot krātuvē noteikumus.

Ar varu krustot kompozīciju![edit]

Lai iegūtu beidzamo pārveidotāju, ko mums vajag, lai sakombinētu morfotatikas modeli (lexc) ar morfografemikas modeli (twol). Ir veids kā to izdarīt, to sauc par "kompozīciju krustošanu", kas ir diezgan iedarbīga. Ir arī instruments no HFST, kas saucas hfst-compose-intersect to mēs izmantosim.

$ hfst-compose-intersect -1 tr-tk.lexc.hfst -2 tr-tk.twol.hfst -o tr-tk.autogen.hfst

Tagad mēs varam izmēģināt pēdējo pārveidotāju:

$ hfst-fst2strings tr-tk.autogen.hfst
maşgala<n>:maşgala
maşgala<n><pl>:maşgalalar
esger<n>:esger
esger<n><pl>:esgerler

Lieliski!! Mums ir kārotā forma.

Analīze un ģenerācija[edit]

Pārveidotājs, kuru mēs izveidojām, bija paredzēts ražošanai, bet mēs nevaram vēl to izmantot ar hfst-proc formāta dēļ. Ja mēs vēlamies to izmantot ar hfst-proc, viss ko mums vajag pamainīt ir formāts, ar sekojošu komandu:

$ hfst-fst2fst -O -i tr-tk.autogen.hfst -o tr-tk.autogen.hfst.ol

Tagad mums vajadzētu varēt izveidot abus mūsu daudzskaitļus:

$ echo "^maşgala<n><pl>$" | hfst-proc -g tr-tk.autogen.hfst.ol
maşgalalar

un

$ echo "^esger<n><pl>$" | hfst-proc -g tr-tk.autogen.hfst.ol
esgerler

Bet, kas būtu ja mēs vēlētos analizēt kādu vārdu? Tad mums vajag pārkonfigurēt pārveidotāju. Tas ir samainīt kreiso pusi ar labo pusi vietām, izdarīsim to divās stadijās, lai mēs varētu redzēt rezultātu:

$ 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>

Kā mēs varam redzēt, tagad kreisā puse ir virsmas forma, un labā puse ir analīze. Tagad tikai konvertējam analizētāju, lai optimizētu skatu formātam:

$ hfst-fst2fst -O -i tk-tr.automorf.hfst -o tk-tr.automorf.hfst.ol

Un veicam analīzi:

$ 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>$

Problēmu novēršana[edit]

Te ir rezumējums, priekš dažādu problēmu novēršanas, ja jūs kaut ko izdarāt, bet tas nestrādā:

  • Vai visi jūsu daudzzīmju simboli ir definēti? Ieskaitot patskaņus/līdzskaņus. Ja jūs uzskatāt ka pievienojāt tos, tad trīs reizes pārbaudiet. Daudzas problēmas ir ar twol kā arīa ar lexc.

Piezīmes[edit]

  1. šis patiesībā ir superkomplicēts, bet šim pamācošs piemērs, tas ir jādara

Veicinoša lasāmviela[edit]