Difference between revisions of "HFST ile yeni bir dile başlamak"

From Apertium
Jump to navigation Jump to search
 
(25 intermediate revisions by 2 users not shown)
Line 2: Line 2:
:''HFST'nin kurulumu hakkında bilgi için, [[HFST]]'ye bakınız.''
:''HFST'nin kurulumu hakkında bilgi için, [[HFST]]'ye bakınız.''


Bu sayfa [[HFST]] ile yeni bir dile nasıl başlanılacağını hakkında bilgi verecek. Burada [[lexc]] ve [[twol]] biçimciliklerine bazı referanslar var, örneğin [http://www.fsmbook.com FSMBook], ana bunların çoğu özel Xerox uygulamalarıyla ilgilidir, ücretsiz HFST uygulamasıyla ilgili değildir.
Bu sayfa [[HFST]] ile yeni bir dile nasıl başlanılacağını hakkında bilgi verecek. Burada [[lexc]] ve [[twol]] biçimciliklerine bazı referanslar var, örneğin [http://www.fsmbook.com FSMBook], ama bunların çoğu özel Xerox uygulamalarıyla ilgilidir, ücretsiz HFST uygulamasıyla ilgili değildir.


Güncel biçimcilikler daha çok veya daha az farklı iken, onları derlemek için kullanılar komutların aynı olması şart değil. HFST Unix ile daha çok uyumlu bir felsefeye sahip. Bu yüzden bunun avantajlarını kullanacağız. Hint-Avrupa dillerinin çoğuyla ve yalınlayan dillerle [[lttoolbox]] ile kurallara uygun bir şekilde ve kolayca uğraşılabilir. biz ise bu dil ailelerinden olmayan bir dil ile uğraşacağız, ve karışık bir morpolojiye(yapı bilimine) sahip [[lttoolbox]] ile kolayca uğraşılamacak bir dil.
Güncel biçimcilikler daha çok veya daha az farklı iken, onları derlemek için kullanılan komutların aynı olması şart değil. HFST Unix ile daha çok uyumlu bir felsefeye/yapıya sahip. Bu yüzden bunun avantajlarını kullanacağız. Hint-Avrupa dillerinin çoğuyla ve yalınlayan dillerle [[lttoolbox]] ile kurallara uygun bir şekilde ve kolayca uğraşılabilir. Biz ise bu dil ailelerinden olmayan bir dil ile uğraşacağız, ve karışık bir morfolojiye(yapı bilimine) sahip [[lttoolbox]] ile kolayca uğraşılamayacak bir dil.


==Başlangıç==
==Başlangıç==
Diğer dosya <code>twol</code> veya <code>xfst</code> dosyası olabilir.
Diğer dosya <code>twol</code> veya <code>xfst</code> dosyası olabilir.
Bir morfolojik dönüştürücü olan HFST iki temel ilkeye sahiptir, bunlardan biri <code>lexc</code> dosyası. Bu, bu dildeki morfemlerin(anlambirimler) biçim dizgeleriyle birlikte nasıl katılacağını, ekleneceğini tanımlar. Diğer dosya <code>twol</code> veya <code>xfst</code> dosyası olabilir. These describe what changes happen when these morphemes are joined together, ''morphographemics'' or ''morphophonology'' . For example,
Bir morfolojik dönüştürücü olan HFST iki temel ilkeye sahiptir, bunlardan biri <code>lexc</code> dosyası. Bu, bu dildeki morfemlerin(anlambirimler) biçim dizgeleriyle birlikte nasıl katılacağını, ekleneceğini tanımlar. Diğer dosya <code>twol</code> veya <code>xfst</code> dosyası olabilir. Bu, morfemler ''morphographemics'' (veya "morphophonology") ile birlikte eklenildiğinde gerçekleşecek değişiklikleri tanımlar.
Bu, morfemler ''morphographemics'' (veya "morphophonology") ile birlikte eklenildiğinde gerçekleşecek değişiklikleri tanımlar.
:Morphotactics: <code>wolf<n><pl></code> → <code>wolf + s</code>
:Morphotactics: <code>wolf<n><pl></code> → <code>wolf + s</code>
:Morphographemics: <code>wolf + s</code> → <code>wolves</code>
:Morphographemics: <code>wolf + s</code> → <code>wolves</code>


Burada <code>twol</code> ile ilişkilendireceğiz. Eğer <code>xfst</code> ile ilgileniyorsan, [[Foma]]'nın sitesinde güzel bir [http://foma.sourceforge.net/dokuwiki/doku.php?id=wiki:morphtutorial öğretici ders] var.
Burada <code>twol</code> ile ilişkilendireceğiz. Eğer <code>xfst</code> ile ilgileniyorsanız, [[Foma]]'nın sitesinde güzel bir [http://foma.sourceforge.net/dokuwiki/doku.php?id=wiki:morphtutorial öğretici ders] var.


Bir sonraki bölümde lexicon ile (<code>lexc</code> dosyası ile) başlayacağız ve morphographemics (<code>twol</code> dosyası) ile devam edeceğiz.
Bir sonraki bölümde lexicon ile (<code>lexc</code> dosyası ile) başlayacağız ve morphographemics (<code>twol</code> dosyası) ile devam edeceğiz.
Line 21: Line 20:
==Dil==
==Dil==
Üzerinde çalışacağımız dil çifti Türkçe--Türkmence.
Üzerinde çalışacağımız dil çifti Türkçe--Türkmence.
Şimdi modelleyeceğimiz dil Türkmence, Türkmenistan'da konuşulan bir dil. Üzerinde çalışacağımız dil çifti Türkçe--Türkmence. İsim kategorisin basit bir çekimlemesini yapacağız. Türkmen isimlerinin basit çekimlemesi şöyledir: Altı isim hali, iki çoğul eki, ve iyelik hali. Ekler kelimenin sonundaki bir ünlü ya da ünsüz harfe bağlı olarak farklı durumlarda olabilirler.
Şimdi modelleyeceğimiz dil Türkmence, Türkmenistan'da konuşulan bir dil. Üzerinde çalışacağımız dil çifti Türkçe--Türkmence. İsim kategorisin basit bir çekimlemesini yapacağız. Türkmen isimlerinin basit çekimlemesi şöyledir: Altı isim hali, iki çoğul eki, ve iyelik eki. Ekler kelimenin sonundaki bir ünlü ya da ünsüz harfe bağlı olarak farklı durumlarda olabilirler.


===Ünlü Uyumu===
===Ünlü Uyumu===


Çok basitleştirecek olursak,<ref>Bu aslında çok karışıktır, bu didaktik örnek için, böyle diyoruz</ref> Türkmence'deki kelime kökleri iki tür olabilir, kalın ünlü kelimesi gövdesi, ya da ince ünlü gövdesi. Kalın ünlü gövdesi, örneğin "mugallym" "öğretmen" sadece kalın ünlüsü olan bir kelime, ve ince ünlü gövdesi, örneğin kädi "kabak" sadece ince ünlüsü olan bir kelime.Türkmence'deki kalın ünlüler: "a, y, o" ve "u". İnce ünlüler: ä, e, i, ö, ve ü.
Çok basitleştirecek olursak,<ref>Bu aslında çok karışıktır, bu didaktik örnek için, böyle diyoruz</ref> Türkmence'deki kelime kökleri iki tür olabilir, kalın ünlü kelime gövdesi, ya da ince ünlü gövdesi. Kalın ünlü gövdesi, örneğin "mugallym" "öğretmen" sadece kalın ünlüsü olan bir kelime, ve ince ünlü gövdesi, örneğin kädi "kabak" sadece ince ünlüsü olan bir kelime.Türkmence'deki kalın ünlüler: "a, y, o" ve "u". İnce ünlüler: ä, e, i, ö, ve ü.


Kelimenin gövdesine bir ek ekleneceği zaman, eke koyacağımız doğru ünlüyü seçmek için gövdedeki hangi ünlülerin olduğunu bilmemiz gerekiyor.
Kelimenin gövdesine bir ek ekleneceği zaman, eke koyacağımız doğru ünlüyü seçmek için gövdedeki hangi ünlülerin olduğunu bilmemiz gerekiyor.
Line 97: Line 96:


==Lexicon==
==Lexicon==
Küçük bir tanıtımdan sonra, lexicon ile başlayalım. Yapacağımız dosyanın ismi <code>apertium-tr-tk.tk.lexc</code>, ve o dönüştürücümüzün lexicon'unu içerecek. Şimdi text editörünü açınız.


===Temeller===
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.
Tanımlamamız gereken ilk şey üretmek istediğimiz etiketler. [[lttoolbox]]'da, bu <code><.dix></code> dosyasının <code><sdefs></code> bölümünde doğrudan yapılır.

===The basics===

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.


<pre>
<pre>
Multichar_Symbols
Multichar_Symbols


%<n%> ! Noun
%<n%> ! İsim
%<nom%> ! Nominative
%<nom%> ! Yalın Hal
%<pl%> ! Plural
%<pl%> ! Çoğul
</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>
<code>&lt;</code> ve <code>&gt;</code> sembolleri <code>lexc</code>'in içinde tutulur, bu yüzden <code>%</code> ile çıkmaya ihtiyacımız var.

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]]:


Tanımlamamız gereken bir diğer şey ise Lexicon <code>NounStems</code> kodunun içinde isim köklerinin listesini gösterecek bir <code>Root</code> lexicon'udur.
<pre>
<pre>


Line 124: Line 120:
</pre>
</pre>


Şimdi iki kelimemizi ekleyelim:
Now let's add our two words:


<pre>
<pre>
Line 133: Line 129:
</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.
Önce isim kökünü koyduk, ve sahip olduğu ''paradigm''(çekim örneği) koyduk, <code>Ninfl</code> yolluyla, ve son olarak, bir komutla(<code>!</code> komut sembolüdür) derleriz.


Ve çekimin en temelini tanımlamak, {{tag|n}} ile bir isim belirtmek için isim kökünü etiketlemek:
And define the most basic of inflection, that is, tagging the bare stem with <code><n></code> to indicate a noun:


<pre>
<pre>
Line 143: Line 139:
</pre>
</pre>


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.
Bu <code>LEXICON</code>, <code>NounStems</code> lexiconundan önce konulmalıdır. <code>#</code> sembolü sözcüğün sonudur. Bunu koymak çok önemlidir, bu dönüştürücünün nerede duracağını söyler.


===Compiling===
===Derlemek===
Şimdi temel bir lexicon'umuz var, derleyelim ve test edelim. <code>hfst-lexc</code> ile derleriz:

So, now we've got our basic lexicon, let's compile it and test it. We compile with <code>hfst-lexc</code>:


<pre>
<pre>
Line 153: Line 148:
</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>)
(Eğer bilgisayarınızda <code>hfst-lexc</code> kurulu değlse, muhtemelen sorunlar çıkacaktır. <code>--enable-lexc</code> ile derlemeniz gerekir, ama <code>hfst-lexc</code>'nin yerine <code>hfst-lexc2fst</code>'yi de kullanabilirsiniz.)


And we can test it both with <code>hfst-fst2strings</code>:
Ve <code>hfst-fst2strings</code> ile test edelim:


<pre>
<pre>
Line 163: Line 158:
</pre>
</pre>


===Continuation lexica===
===Lexica'nın devamı===
Şimdi, ''maşgala'' ve ''esger'' kelimelerinin isim olduğunu tanımlanayı başardık, peki ya çekim. Bunlar [[lttoolbox]]'daki 'paradigms''(çekim örnekleri) gibi.

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]].


The basic morphotactics of the Turkmen noun is:
Türkmen isminin temel morphotactics (biçim dizgesi):


:{{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:
<code>?</code> isteğe bağlı olarak belirtilir. Burada tekil-çoğul ve durum halleriyle çalışıyoruz, bu yüzden çekimi tanımlayalım, ilk olarak tekil-çoğul ile başlayabiliriz. Dosyanın <code>LEXICON Ninfl</code> bölümünde, bir sonraki satırda:


<pre>
<pre>
Line 177: Line 171:
</pre>
</pre>


Oov, Bu çol karışık gözüküyor. Belki, ama her bölüm gerekli, şimdi onları tanımlayalım:
Phew, that looks pretty complicated!! Well, perhaps, but each part has it's reason, let's describe them:


{|class=wikitable
{|class=wikitable
! Part !! Description
! Bölüm !! Tanımı
|-
|-
| <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> || Soldaki bölüm çözümlemeyi tanımlar, bu durumda isim, çoğul. Not, bu çözümlemenin sağ tarafta yapıldığı lttoolbox'ın tam tersidir.
|-
|-
| <code>:</code> || The symbol <code>:</code> delimits the left and right sides (or surface side, and lexical side)
| <code>:</code> || <code>:</code> sembolü sağ ve sol tarafı ayırır.
|-
|-
| <code>%&gt;%&gt;l%{A%}r</code> || This is the surface form, which is split into:
| <code>%&gt;l%{A%}r</code> || Burası bölümlere ayrılmış yüzeysel formdur:
|-
|-
|&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> || Morfem sınır ayırıcısı (bunu sonra açıklayacağız, değişikliklerin olabileceği morfemlerin arasına koyarız.
|-
|-
|&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> || Yüzeysel morfem, bu durumda ''-lar'' or ''-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> || Bir "archivowel"(üst ünlü)... Bir ünlünün 'a'' veya ''e'' olabileceği yer için bir yer tutucu.
|-
|-
| <code>#</code> || The end of word boundary
| <code>#</code> || Kelimenin sonu
|-
|-
| <code>;</code> || End of line
| <code>;</code> || Satır sonu
|-
|-
|}
|}


Karışık gözükmesinin bir nedeni de <code>%</code> sembolleri. Eğer onları kaldırırsak, daha okunaklı gözükecektir.
Part of the reason it looks complicated is all of the <code>%</code> symbols. If we remove them it looks far more readable:


<pre>
<pre>
Line 206: Line 200:
</pre>
</pre>


Karşılaştırma yapıcak olursak, lttoolbox'da, bu şu şekilde olurdu.
(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:


<pre>
<pre>
Line 214: Line 206:
</pre>
</pre>


Şimdi, çekimlemelerimizin ilkini ekledik, çoğul. Onu test etmeden önce iki şey yapmamız gerekiyor. İlk olarak dosyanın <code>Multichar_Symbols</code> kısmına <code>%{A%}</code> eklememiz gerekiyor, üste çık ve ekle, böyle bir şey almalısınız:
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:

<pre>
<pre>
Multichar_Sembolleri
Multichar_Symbols


%<n%> ! Noun
%<n%> ! Noun
Line 226: Line 217:
</pre>
</pre>


Şimdi dosyayı kaydet. Yapmamız gereken ikinci şey ise yeniden derlemek:
Now save the file. The next thing we need to do is compile again:


<pre>
<pre>
Line 232: Line 223:
</pre>
</pre>


Ve test edelim:
And then we can test:


<pre>
<pre>
Line 241: Line 232:
esger<n>:esger
esger<n>:esger
</pre>
</pre>
Çok iyi, ama bir yönden de kötü, bunlar gerçek yüzeysel formlar değildir. Biz herhangi bir parçada asla ''esger>l{A}r'' görmeyiz. Aradığımız kelime ''esgerler''.
Peki ya onu nasıl yapabiliriz?


==<code>twol</code>'a Giriş==
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 ?
<code>twol</code>'un ana fikri lexc ile üretilmiş yüzeysel formları almak ve kuralları uygulayıp gerçek yüzeysel forma dönüştürmek. İşte burası''-l{A}r'' ı alıp ''-lar'' veya ''-ler'' yapacağımız yer.
Biz temel olarak "eğer kelime kökü ince ünlü içeriyorsa, ince ünlüye değişim istiyoruz, ve eğer kelime kökü kalın ünlü içeriyorsa, kalın ünlü değişimi istiyoruz" diyebiliyoruz. Aynı zamanda, morfem sonunu kaldırırız. Şimdi bir deneyelim.


==Enter <code>twol</code>==
Şimdi <code>apertium-tr-tk.tk.twol</code> adlı bir dosya yapacağız.


İlk olarak alfabeyi tanımlamamız gerekiyor:
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''.

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

First we need to define the alphabet:


<pre>
<pre>
Alphaet
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 261: Line 250:
</pre>
</pre>


Büyük ve küçük harfleri ayrı satırlarda tanımlamanıza gerek yok, ancak bu daha temiz ve okunaklı yapıyor.
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>:


Biz şunu da tanımlamak istiyoruz, ne olursa olsun, morfem sonlarını <code>;</code> yüzeysel formlardan kaldırmak istiyoruz, bu yüzden bir sonraki satıra, küçük harf satırının altına, <code>;</code> öncesinde şunu ekleyiniz:
<pre>
<pre>
%>:0
%>:0
</pre>
</pre>
Burası, morphotactic formun sol kısmı, ve sağ kısmı da yüzeysel form. <code>%&gt;:0</code> yapmak, <code>%&gt;</code> kodunu <code>0</code> koduna çevirir. <code>0</code> sembolü çıktı değildir.


Şimdi, son alfabe görünümü bunun gibi olmalıdır:
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.

So, the final alphabet section will look like this:


<pre>
<pre>
Line 280: Line 267:
</pre>
</pre>


Şimdi onunla çalışmak için bazı "sets" tanımlamamız gerekiyor, bunlar temel olarak özelliklere çeviri yöntemleri vermek içindir, örneğin kurallarda bahsedeceğimiz "back vowel"(kalın ünlü) ve "front vowel"(ince ünlü).
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 295: Line 282:
</pre>
</pre>


So now we've got everything set up, to add the rule, there is a new section, <code>Rules</code>:
Şimdi yüklenecek her şeye sahibiz, kural eklemek için, yeni bir bölüm var, <code>Rules</code>:

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

</pre>
</pre>
Kural esas olarak şöyle diyor: "Eğer önceki harfler kalın ünlüler bekliyorsa, yani kalın ünlü gelecekse, {A}'nın yerine e koy, devamında bir morfem sonu var, ondan sonra kalın ünlü yok, ve bir yerde bir ince ünlü var."


Şimdi ise, kuralı derlemek ve test etmek:
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"

Next up, to compile the rule and test it:


<pre>
<pre>
Line 321: Line 305:
</pre>
</pre>


===Kesişen Birleşimin Gücü İle===
===With the power of intersecting composition!===
Son dönüştürücüyü elde etmek için, yapmamız gereken şey morphographemic model (<code>twol</code>) ile morphotactic model'i(<code>lexc</code>) birleştirmek. Bunu yapmanın bir yolu oldukça etkin olan "intersecting composition". HFST'de kullanacağımız <code>hfst-compose-intersect</code> isimli bir araç da var.

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.

<pre>
<pre>
$ hfst-compose-intersect -1 tr-tk.lexc.hfst -2 tr-tk.twol.hfst -o tr-tk.autogen.hfst
$ hfst-compose-intersect -1 tr-tk.lexc.hfst -2 tr-tk.twol.hfst -o tr-tk.autogen.hfst
</pre>
</pre>


Şimdi son dönüştürücümüzü test edebiliriz:
Now we can test the final transducer:


<pre>
<pre>
Line 339: Line 321:
</pre>
</pre>


Harika!! İstediğimiz formlara ulaştık!!!.
Great!! We have the desired forms.

==Analysis and generation==

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:


==Analiz ve Oluşum==
Yukarıda yaptığımız dönüştürücü oluşturmak içindi, ama biz format yüzünden henüz onu <code>hfst-proc</code> ile kullanamıyorduk.Eğer <code>hfst-proc</code> ile onu kullanmak istersek, ihtiyacımız olan her şey aşağıdaki komutla formatı değiştirmek:
<pre>
<pre>
$ hfst-fst2fst -O -i tr-tk.autogen.hfst -o tr-tk.autogen.hfst.ol
$ hfst-fst2fst -O -i tr-tk.autogen.hfst -o tr-tk.autogen.hfst.ol
</pre>
</pre>


Şimdi çoğullarımızı oluşturabilmeliyiz.
Now we should be able to generate both of our plurals:

<pre>
<pre>
$ echo "^maşgala<n><pl>$" | hfst-proc -g tr-tk.autogen.hfst.ol
$ echo "^maşgala<n><pl>$" | hfst-proc -g tr-tk.autogen.hfst.ol
Line 356: Line 335:
</pre>
</pre>


and
ve


<pre>
<pre>
Line 363: Line 342:
</pre>
</pre>


Peki ya bazı kelimeleri analiz etmek ? Şimdi dönüştürücüyü ''invert''(çevirmek) etmemiz gerekiyor. Bu sol tarafı sağ tarafa çevirir, ve sağ tarafı da sol tarafa, iki aşamada yapalım ve sonuçları görelim:
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>
$ hfst-invert -i tr-tk.autogen.hfst -o tk-tr.automorf.hfst
$ hfst-invert -i tr-tk.autogen.hfst -o tk-tr.automorf.hfst
Line 375: Line 353:
</pre>
</pre>


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:
Gördüğümüz gibi sol taraf yüzeysel form ve sağ taraf da analiz. Şimdi ise çözümleyici ''optimised lookup'' formatına çevirmek:

<pre>
<pre>
$ hfst-fst2fst -O -i tk-tr.automorf.hfst -o tk-tr.automorf.hfst.ol
$ hfst-fst2fst -O -i tk-tr.automorf.hfst -o tk-tr.automorf.hfst.ol
</pre>
</pre>


Ve bazı analizler yap:
And do some analysis:


<pre>
<pre>
Line 391: Line 368:
</pre>
</pre>


==Troubleshooting==
==Sorun Giderme==

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>.
Tüm "multicharacter symbols" tanımlandı ? Eğer hepsini eklediğini düşünüyorsan, üçlü kontrol yap. Bu <code>twol</code>'daki sorunlarını <code>lexc</code>'de olduğu kadar giderir.


==Notes==
==Notlar==
<references/>
<references/>


==Further reading==
==Ek Bilgi==


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

Latest revision as of 13:10, 29 March 2012

HFST'nin kurulumu hakkında bilgi için, HFST'ye bakınız.

Bu sayfa HFST ile yeni bir dile nasıl başlanılacağını hakkında bilgi verecek. Burada lexc ve twol biçimciliklerine bazı referanslar var, örneğin FSMBook, ama bunların çoğu özel Xerox uygulamalarıyla ilgilidir, ücretsiz HFST uygulamasıyla ilgili değildir.

Güncel biçimcilikler daha çok veya daha az farklı iken, onları derlemek için kullanılan komutların aynı olması şart değil. HFST Unix ile daha çok uyumlu bir felsefeye/yapıya sahip. Bu yüzden bunun avantajlarını kullanacağız. Hint-Avrupa dillerinin çoğuyla ve yalınlayan dillerle lttoolbox ile kurallara uygun bir şekilde ve kolayca uğraşılabilir. Biz ise bu dil ailelerinden olmayan bir dil ile uğraşacağız, ve karışık bir morfolojiye(yapı bilimine) sahip lttoolbox ile kolayca uğraşılamayacak bir dil.

Başlangıç[edit]

Diğer dosya twol veya xfst dosyası olabilir. Bir morfolojik dönüştürücü olan HFST iki temel ilkeye sahiptir, bunlardan biri lexc dosyası. Bu, bu dildeki morfemlerin(anlambirimler) biçim dizgeleriyle birlikte nasıl katılacağını, ekleneceğini tanımlar. Diğer dosya twol veya xfst dosyası olabilir. Bu, morfemler morphographemics (veya "morphophonology") ile birlikte eklenildiğinde gerçekleşecek değişiklikleri tanımlar.

Morphotactics: wolf<n><pl>wolf + s
Morphographemics: wolf + swolves

Burada twol ile ilişkilendireceğiz. Eğer xfst ile ilgileniyorsanız, Foma'nın sitesinde güzel bir öğretici ders var.

Bir sonraki bölümde lexicon ile (lexc dosyası ile) başlayacağız ve morphographemics (twol dosyası) ile devam edeceğiz.

Bunun için HFST3'ü derlediğinizden emin olmasınız.

Dil[edit]

Üzerinde çalışacağımız dil çifti Türkçe--Türkmence. Şimdi modelleyeceğimiz dil Türkmence, Türkmenistan'da konuşulan bir dil. Üzerinde çalışacağımız dil çifti Türkçe--Türkmence. İsim kategorisin basit bir çekimlemesini yapacağız. Türkmen isimlerinin basit çekimlemesi şöyledir: Altı isim hali, iki çoğul eki, ve iyelik eki. Ekler kelimenin sonundaki bir ünlü ya da ünsüz harfe bağlı olarak farklı durumlarda olabilirler.

Ünlü Uyumu[edit]

Çok basitleştirecek olursak,[1] Türkmence'deki kelime kökleri iki tür olabilir, kalın ünlü kelime gövdesi, ya da ince ünlü gövdesi. Kalın ünlü gövdesi, örneğin "mugallym" "öğretmen" sadece kalın ünlüsü olan bir kelime, ve ince ünlü gövdesi, örneğin kädi "kabak" sadece ince ünlüsü olan bir kelime.Türkmence'deki kalın ünlüler: "a, y, o" ve "u". İnce ünlüler: ä, e, i, ö, ve ü.

Kelimenin gövdesine bir ek ekleneceği zaman, eke koyacağımız doğru ünlüyü seçmek için gövdedeki hangi ünlülerin olduğunu bilmemiz gerekiyor.

Çoğul Eki[edit]

Türkmence'de kelime ya tekildir(ek olmadığı yerde) ya da çoğuldur -lar" yada -ler ekinin olduğu yerde. İlki kalın ünlüler ile kullanılır, ikincisi de ince ünlüler ile kullanılır.

Durum Halleri[edit]

Durum hallerini için ekleri göstermenin altında daha sıkı ve kısa bir gösterim kullanırız. { ve } aralarında eklerdeki ünlü değişimleri, ( ve ) aralarında ise ünlü türemelerini gösteririz.

Durum Ek Kullanım Örnek
V C V C
Yalın Cümlenin öznesini belirtir pagta gazan
Sahiplik -n{y,i,u,ü}ň -{y,i,u,ü}ň Şahıs belirtir pagtanyň gazanyň
Yönelme -{a,ä} , -n{a,e} -{a,e} Dolaylı tümleç pagta gazana
Belirtme -n{y,i} -{y,i} Nesne pagtany gazany
Bulunma -(n)d{a,e} -d{a,e} Yer/Zaman pagtada gazanda
Ayrılma -(n)d{a,e}n -d{a,e}n Nereden çıktığını belirtir pagtadan gazandan

Çekim Örneği[edit]

Not: Bu iyelik halini içermiyor.

maşgala "aile"
Durum Tekil Çoğul
Yalın maşgala maşgalalar
Sahiplik maşgalanyň maşgalalaryň
Yönelme maşgala maşgalalara
Belirtme maşgalany maşgalalary
Bulunma maşgalada maşgalalarda
Ayrılma maşgaladan maşgalalardan
esger "asker"
Durum Tekil Çoğul
Yalın esger esgerler
Sahiplik esgeriň esgerleriň
Yönelme esgere esgerlere
Belitme esgeri esgerleri
Bulunma esgerde esgerlerde
Ayrılma esgerden esgerlerden

Lexicon[edit]

Küçük bir tanıtımdan sonra, lexicon ile başlayalım. Yapacağımız dosyanın ismi apertium-tr-tk.tk.lexc, ve o dönüştürücümüzün lexicon'unu içerecek. Şimdi text editörünü açınız.

Temeller[edit]

Tanımlamamız gereken ilk şey üretmek istediğimiz etiketler. lttoolbox'da, bu <.dix> dosyasının <sdefs> bölümünde doğrudan yapılır.

Multichar_Symbols

%<n%>   ! İsim
%<nom%> ! Yalın Hal
%<pl%>  ! Çoğul

< ve > sembolleri lexc'in içinde tutulur, bu yüzden % ile çıkmaya ihtiyacımız var.

Tanımlamamız gereken bir diğer şey ise Lexicon NounStems kodunun içinde isim köklerinin listesini gösterecek bir Root lexicon'udur.


LEXICON Root

NounStems ;

Şimdi iki kelimemizi ekleyelim:

LEXICON NounStems

maşgala Ninfl ; ! "family"
esger Ninfl ;   ! "soldier"

Önce isim kökünü koyduk, ve sahip olduğu paradigm(çekim örneği) koyduk, Ninfl yolluyla, ve son olarak, bir komutla(! komut sembolüdür) derleriz.

Ve çekimin en temelini tanımlamak, <n> ile bir isim belirtmek için isim kökünü etiketlemek:

LEXICON Ninfl

%<n%>: # ;

Bu LEXICON, NounStems lexiconundan önce konulmalıdır. # sembolü sözcüğün sonudur. Bunu koymak çok önemlidir, bu dönüştürücünün nerede duracağını söyler.

Derlemek[edit]

Şimdi temel bir lexicon'umuz var, derleyelim ve test edelim. hfst-lexc ile derleriz:

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

(Eğer bilgisayarınızda hfst-lexc kurulu değlse, muhtemelen sorunlar çıkacaktır. --enable-lexc ile derlemeniz gerekir, ama hfst-lexc'nin yerine hfst-lexc2fst'yi de kullanabilirsiniz.)

Ve hfst-fst2strings ile test edelim:

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

Lexica'nın devamı[edit]

Şimdi, maşgala ve esger kelimelerinin isim olduğunu tanımlanayı başardık, peki ya çekim. Bunlar lttoolbox'daki 'paradigms(çekim örnekleri) gibi.

Türkmen isminin temel morphotactics (biçim dizgesi):

stem plural? possessive? case copula?

? isteğe bağlı olarak belirtilir. Burada tekil-çoğul ve durum halleriyle çalışıyoruz, bu yüzden çekimi tanımlayalım, ilk olarak tekil-çoğul ile başlayabiliriz. Dosyanın LEXICON Ninfl bölümünde, bir sonraki satırda:

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

Oov, Bu çol karışık gözüküyor. Belki, ama her bölüm gerekli, şimdi onları tanımlayalım:

Bölüm Tanımı
%<n%>%<pl%> Soldaki bölüm çözümlemeyi tanımlar, bu durumda isim, çoğul. Not, bu çözümlemenin sağ tarafta yapıldığı lttoolbox'ın tam tersidir.
: : sembolü sağ ve sol tarafı ayırır.
%>l%{A%}r Burası bölümlere ayrılmış yüzeysel formdur:
    %> Morfem sınır ayırıcısı (bunu sonra açıklayacağız, değişikliklerin olabileceği morfemlerin arasına koyarız.
    l%{A%}r Yüzeysel morfem, bu durumda -lar or -ler
    %{A%} Bir "archivowel"(üst ünlü)... Bir ünlünün 'a veya e olabileceği yer için bir yer tutucu.
# Kelimenin sonu
; Satır sonu

Karışık gözükmesinin bir nedeni de % sembolleri. Eğer onları kaldırırsak, daha okunaklı gözükecektir.

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

Karşılaştırma yapıcak olursak, lttoolbox'da, bu şu şekilde olurdu.

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

Şimdi, çekimlemelerimizin ilkini ekledik, çoğul. Onu test etmeden önce iki şey yapmamız gerekiyor. İlk olarak dosyanın Multichar_Symbols kısmına %{A%} eklememiz gerekiyor, üste çık ve ekle, böyle bir şey almalısınız:

Multichar_Sembolleri

%<n%>   ! Noun
%<nom%> ! Nominative
%<pl%>  ! Plural

%{A%}   ! Archivowel 'a' or 'e'

Şimdi dosyayı kaydet. Yapmamız gereken ikinci şey ise yeniden derlemek:

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

Ve test edelim:

$ 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 iyi, ama bir yönden de kötü, bunlar gerçek yüzeysel formlar değildir. Biz herhangi bir parçada asla esger>l{A}r görmeyiz. Aradığımız kelime esgerler. Peki ya onu nasıl yapabiliriz?

twol'a Giriş[edit]

twol'un ana fikri lexc ile üretilmiş yüzeysel formları almak ve kuralları uygulayıp gerçek yüzeysel forma dönüştürmek. İşte burası-l{A}r ı alıp -lar veya -ler yapacağımız yer. Biz temel olarak "eğer kelime kökü ince ünlü içeriyorsa, ince ünlüye değişim istiyoruz, ve eğer kelime kökü kalın ünlü içeriyorsa, kalın ünlü değişimi istiyoruz" diyebiliyoruz. Aynı zamanda, morfem sonunu kaldırırız. Şimdi bir deneyelim.

Şimdi apertium-tr-tk.tk.twol adlı bir dosya yapacağız.

İlk olarak alfabeyi tanımlamamız gerekiyor:

Alphaet
 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 ;

Büyük ve küçük harfleri ayrı satırlarda tanımlamanıza gerek yok, ancak bu daha temiz ve okunaklı yapıyor.

Biz şunu da tanımlamak istiyoruz, ne olursa olsun, morfem sonlarını ; yüzeysel formlardan kaldırmak istiyoruz, bu yüzden bir sonraki satıra, küçük harf satırının altına, ; öncesinde şunu ekleyiniz:

 %>:0 

Burası, morphotactic formun sol kısmı, ve sağ kısmı da yüzeysel form. %>:0 yapmak, %> kodunu 0 koduna çevirir. 0 sembolü çıktı değildir.

Şimdi, son alfabe görünümü bunun gibi olmalıdır:

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  ;

Şimdi onunla çalışmak için bazı "sets" tanımlamamız gerekiyor, bunlar temel olarak özelliklere çeviri yöntemleri vermek içindir, örneğin kurallarda bahsedeceğimiz "back vowel"(kalın ünlü) ve "front vowel"(ince ünlü).

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 %> ; 

Şimdi yüklenecek her şeye sahibiz, kural eklemek için, yeni bir bölüm var, Rules:

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

Kural esas olarak şöyle diyor: "Eğer önceki harfler kalın ünlüler bekliyorsa, yani kalın ünlü gelecekse, {A}'nın yerine e koy, devamında bir morfem sonu var, ondan sonra kalın ünlü yok, ve bir yerde bir ince ünlü var."

Şimdi ise, kuralı derlemek ve test etmek:

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

Kesişen Birleşimin Gücü İle[edit]

Son dönüştürücüyü elde etmek için, yapmamız gereken şey morphographemic model (twol) ile morphotactic model'i(lexc) birleştirmek. Bunu yapmanın bir yolu oldukça etkin olan "intersecting composition". HFST'de kullanacağımız hfst-compose-intersect isimli bir araç da var.

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

Şimdi son dönüştürücümüzü test edebiliriz:

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

Harika!! İstediğimiz formlara ulaştık!!!.

Analiz ve Oluşum[edit]

Yukarıda yaptığımız dönüştürücü oluşturmak içindi, ama biz format yüzünden henüz onu hfst-proc ile kullanamıyorduk.Eğer hfst-proc ile onu kullanmak istersek, ihtiyacımız olan her şey aşağıdaki komutla formatı değiştirmek:

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

Şimdi çoğullarımızı oluşturabilmeliyiz.

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

ve

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

Peki ya bazı kelimeleri analiz etmek ? Şimdi dönüştürücüyü invert(çevirmek) etmemiz gerekiyor. Bu sol tarafı sağ tarafa çevirir, ve sağ tarafı da sol tarafa, iki aşamada yapalım ve sonuçları görelim:

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

Gördüğümüz gibi sol taraf yüzeysel form ve sağ taraf da analiz. Şimdi ise çözümleyici optimised lookup formatına çevirmek:

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

Ve bazı analizler yap:

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

Sorun Giderme[edit]

Tüm "multicharacter symbols" tanımlandı mı? Eğer hepsini eklediğini düşünüyorsan, üçlü kontrol yap. Bu twol'daki sorunlarını lexc'de olduğu kadar giderir.

Notlar[edit]

  1. Bu aslında çok karışıktır, bu didaktik örnek için, böyle diyoruz

Ek Bilgi[edit]