Difference between revisions of "HFST ile yeni bir dile başlamak"
(Created page with '''placeholder''') |
|||
(56 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
{{TOCD}} |
|||
''placeholder'' |
|||
:''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], 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ıç== |
|||
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. 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> |
|||
:Morphographemics: <code>wolf + s</code> → <code>wolves</code> |
|||
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. |
|||
Bunun için [[Hfst#Compiling_HFST3|HFST3]]'ü derlediğinizden emin olmasınız. |
|||
==Dil== |
|||
Ü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=== |
|||
Ç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. |
|||
===Çoğul Eki=== |
|||
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=== |
|||
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 [http://en.wikipedia.org/wiki/Epenthetic ünlü türemelerini] gösteririz. |
|||
{|class=wikitable |
|||
! Durum !!colspan=2| Ek !! Kullanım !!colspan=2| Örnek |
|||
|- |
|||
! !! V !! C !! !! V !! C |
|||
|- |
|||
| Yalın || || || Cümlenin öznesini belirtir || pagta || gazan |
|||
|- |
|||
| Sahiplik || ''-n{y,i,u,ü}ň'' || ''-{y,i,u,ü}ň'' || Şahıs belirtir || pagta<u>nyň</u> || gaza<u>nyň</u> |
|||
|- |
|||
| Yönelme || ''-{a,ä} , -n{a,e}'' || ''-{a,e}'' || Dolaylı tümleç || pagta || gazan<u>a</u> |
|||
|- |
|||
| Belirtme || ''-n{y,i}'' || ''-{y,i}'' || Nesne || pagta<u>ny</u> || gaza<u>ny</u> |
|||
|- |
|||
| Bulunma || ''-(n)d{a,e}'' || ''-d{a,e}'' || Yer/Zaman || pagta<u>da</u> || gazan<u>da</u> |
|||
|- |
|||
| Ayrılma || ''-(n)d{a,e}n'' || ''-d{a,e}n'' || Nereden çıktığını belirtir || pagta<u>dan</u> || gazan<u>dan</u> |
|||
|- |
|||
|} |
|||
===Çekim Örneği=== |
|||
Not: Bu iyelik halini içermiyor. |
|||
{|class=wikitable |
|||
!colspan=3|''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 |
|||
|- |
|||
|} |
|||
{|class=wikitable |
|||
!colspan=3|''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== |
|||
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=== |
|||
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. |
|||
<pre> |
|||
Multichar_Symbols |
|||
%<n%> ! İsim |
|||
%<nom%> ! Yalın Hal |
|||
%<pl%> ! Çoğul |
|||
</pre> |
|||
<code><</code> ve <code>></code> sembolleri <code>lexc</code>'in içinde tutulur, bu yüzden <code>%</code> ile çıkmaya ihtiyacımız var. |
|||
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> |
|||
LEXICON Root |
|||
NounStems ; |
|||
</pre> |
|||
Şimdi iki kelimemizi ekleyelim: |
|||
<pre> |
|||
LEXICON NounStems |
|||
maşgala Ninfl ; ! "family" |
|||
esger Ninfl ; ! "soldier" |
|||
</pre> |
|||
Ö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: |
|||
<pre> |
|||
LEXICON Ninfl |
|||
%<n%>: # ; |
|||
</pre> |
|||
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. |
|||
===Derlemek=== |
|||
Şimdi temel bir lexicon'umuz var, derleyelim ve test edelim. <code>hfst-lexc</code> ile derleriz: |
|||
<pre> |
|||
$ hfst-lexc apertium-tr-tk.tk.lexc -o tk-tr.lexc.hfst |
|||
</pre> |
|||
(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.) |
|||
Ve <code>hfst-fst2strings</code> ile test edelim: |
|||
<pre> |
|||
$ hfst-fst2strings tk-tr.lexc.hfst |
|||
maşgala<n>:maşgala |
|||
esger<n>:esger |
|||
</pre> |
|||
===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. |
|||
Türkmen isminin temel morphotactics (biçim dizgesi): |
|||
:{{sc|stem}} {{sc|plural?}} {{sc|possessive?}} {{sc|case}} {{sc|copula?}} |
|||
<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> |
|||
%<n%>%<pl%>:%>l%{A%}r # ; |
|||
</pre> |
|||
Oov, Bu çol karışık gözüküyor. Belki, ama her bölüm gerekli, şimdi onları tanımlayalım: |
|||
{|class=wikitable |
|||
! Bölüm !! Tanımı |
|||
|- |
|||
| <code>%<n%>%<pl%></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> || <code>:</code> sembolü sağ ve sol tarafı ayırır. |
|||
|- |
|||
| <code>%>l%{A%}r</code> || Burası bölümlere ayrılmış yüzeysel formdur: |
|||
|- |
|||
| <code>%></code> || Morfem sınır ayırıcısı (bunu sonra açıklayacağız, değişikliklerin olabileceği morfemlerin arasına koyarız. |
|||
|- |
|||
| <code>l%{A%}r</code> || Yüzeysel morfem, bu durumda ''-lar'' or ''-ler'' |
|||
|- |
|||
| <code>%{A%}</code> || Bir "archivowel"(üst ünlü)... Bir ünlünün 'a'' veya ''e'' olabileceği yer için bir yer tutucu. |
|||
|- |
|||
| <code>#</code> || Kelimenin sonu |
|||
|- |
|||
| <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. |
|||
<pre> |
|||
<n><pl>:>l{A}r # ; |
|||
</pre> |
|||
Karşılaştırma yapıcak olursak, lttoolbox'da, bu şu şekilde olurdu. |
|||
<pre> |
|||
<e><p><l>·l<s n="A"/>r</l><r><s n="n"/><s n="pl"/></e> |
|||
</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: |
|||
<pre> |
|||
Multichar_Sembolleri |
|||
%<n%> ! Noun |
|||
%<nom%> ! Nominative |
|||
%<pl%> ! Plural |
|||
%{A%} ! Archivowel 'a' or 'e' |
|||
</pre> |
|||
Şimdi dosyayı kaydet. Yapmamız gereken ikinci şey ise yeniden derlemek: |
|||
<pre> |
|||
$ hfst-lexc apertium-tr-tk.tk.lexc > tk-tr.lexc.hfst |
|||
</pre> |
|||
Ve test edelim: |
|||
<pre> |
|||
$ 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 |
|||
</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ş== |
|||
<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. |
|||
Şimdi <code>apertium-tr-tk.tk.twol</code> adlı bir dosya yapacağız. |
|||
İlk olarak alfabeyi tanımlamamız gerekiyor: |
|||
<pre> |
|||
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 ; |
|||
</pre> |
|||
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ı <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> |
|||
%>:0 |
|||
</pre> |
|||
Burası, morphotactic formun sol kısmı, ve sağ kısmı da yüzeysel form. <code>%>:0</code> yapmak, <code>%></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: |
|||
<pre> |
|||
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 ; |
|||
</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ü). |
|||
<pre> |
|||
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 %> ; |
|||
</pre> |
|||
Şimdi yüklenecek her şeye sahibiz, kural eklemek için, yeni bir bölüm var, <code>Rules</code>: |
|||
<pre> |
|||
Rules |
|||
"Front harmony in suffixes" |
|||
%{A%}:e <=> FrontVowel: NonBack:* %>: NonBack:* _ ; |
|||
</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: |
|||
<pre> |
|||
$ 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. |
|||
</pre> |
|||
===Kesişen Birleşimin Gücü İle=== |
|||
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. |
|||
<pre> |
|||
$ hfst-compose-intersect -1 tr-tk.lexc.hfst -2 tr-tk.twol.hfst -o tr-tk.autogen.hfst |
|||
</pre> |
|||
Şimdi son dönüştürücümüzü test edebiliriz: |
|||
<pre> |
|||
$ hfst-fst2strings tr-tk.autogen.hfst |
|||
maşgala<n>:maşgala |
|||
maşgala<n><pl>:maşgalalar |
|||
esger<n>:esger |
|||
esger<n><pl>:esgerler |
|||
</pre> |
|||
Harika!! İstediğimiz formlara ulaştık!!!. |
|||
==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> |
|||
$ hfst-fst2fst -O -i tr-tk.autogen.hfst -o tr-tk.autogen.hfst.ol |
|||
</pre> |
|||
Şimdi çoğullarımızı oluşturabilmeliyiz. |
|||
<pre> |
|||
$ echo "^maşgala<n><pl>$" | hfst-proc -g tr-tk.autogen.hfst.ol |
|||
maşgalalar |
|||
</pre> |
|||
ve |
|||
<pre> |
|||
$ echo "^esger<n><pl>$" | hfst-proc -g tr-tk.autogen.hfst.ol |
|||
esgerler |
|||
</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: |
|||
<pre> |
|||
$ 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> |
|||
</pre> |
|||
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> |
|||
$ hfst-fst2fst -O -i tk-tr.automorf.hfst -o tk-tr.automorf.hfst.ol |
|||
</pre> |
|||
Ve bazı analizler yap: |
|||
<pre> |
|||
$ 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>$ |
|||
</pre> |
|||
==Sorun Giderme== |
|||
Tüm "multicharacter symbols" tanımlandı mı? 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. |
|||
==Notlar== |
|||
<references/> |
|||
==Ek Bilgi== |
|||
[[Category:HFST]] |
|||
[[Category:Documentation in Turkish]] |
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 + s
→wolves
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]
- ↑ Bu aslında çok karışıktır, bu didaktik örnek için, böyle diyoruz