• Sonuç bulunamadı

SİSTEM GERÇEKLEMESİ

Bu bölümde program kod bazında açıklanacaktır. Sırasıyla, genel olarak programın parçaları, sözlükteki (Lexicon) kelimelerin çeşit bazında özellikleri, öbek oluşturma kurallarımız (Phrase Structure Rules), ayrıştırıcı (Parser), öperatör tanımlama kuralları (Operator) ve tümünü ortaklaşa derlediğimiz compiler bölümlerinden bahsedilecektir.

Operator bölümünde kodlamada kullanılacak öperatör tanımları verilmiştir.

Prolog, bazı istisnalar dışında, varsayılan durum olarak operatörleri ‘prefix’ notasyonunda kabul eder. Kod okunurluğunu artırmak için biz baz operatörleri (&, ::

ve ==> gibi) ‘infix’ notasyonunda kullanacağız. Bu nedenle aşağıdaki bildirimlere

ihtiyacımız olacak:

(81) :- op(750,xfy,::).

:- op(800,xfy,&). :- op(850,xfy,==>).

6.1. Sözlük Özellikleri

Sözlükteki kelimeler için tanıtılan özellikler aşağıdaki gibidir: (82) fon : < fonetik içerik >

syn : < sözdizimsel içerik> tur : < türkçe karşılık >

Burada phon ile gösterilen özellik aslında kelimenin kendisini, yazılışını ifade eder. Phonology teriminin kısaltılmasıdır.

SYN kelimenin sözdizimsel özelliklerini ifade eder. Syntax teriminin

kısaltılmasıdır. Bu kısım alt kategorilere sahiptir. Alt kategorilerin anlamları sırasıyla şöyledir:

cat (category) kelimenin cinsini (isim, fiil, sıfat v.s. olduğunu) belirler. num (number) - kelimenin nicel özelliğini belirtir

per (person) - kelimenin şahıs özelliğidir (tekil, çoğul)

gen (gender) - kelimenin cins özelliğidir (masc : eril, fem : dişil, neut : nötr)

Bulgarca’da eril ve dişil cinsleri (gender) dışında birde nötr cinsi mevcuttur.

trk (turkish) ile de türkçedeki anlam ve özelliklerini vermeye çalıştık. Bu alanda

da kelimenin türkçe anlamını verdik.

Kelimeleri tanımladığımız genel çerçeveyi sunduk. Fakat bazı kelime türleri içn bu tanımlamalar daha ayrıntılı olabilmektedir. Bu farklılıklar ayrı ayrı kategorileri incelediğimizde verilecektir.

6.2. Sözlükteki Kelime Türleri

İsimler, Sıfatlar, Fiiller / Yardımcı Fiiller ve Belirteç.

6.2.1. İsimler

Bir ismin Prolog’daki tanımı aşağıdaki gibidir:

(83) word(phon::dete &

syn :: (cat :: noun & gender :: neut & num :: sg) & turkish :: 'çocuk').

Buradaki gösterim dete’nin bir isim olduğunu, cinsiyetinin nötr ve tekil olduğunu ifade etmektedir.

6.2.2. Sıfatlar

Bulgarca’da sıfatların özellikleri Türkçe’dekilerine göre daha farklı olduğundan bu bölümde diğerlerine göre değişik bir çalışma yapılmıştır. Daha önce de belirttiğimiz gibi programda bir morfolojik analiz modülü olmadığından, kelimeler takılarıyla birlikte girilmişlerdir. Burada bir sıfatın bulgarca 4 farklı hali olabilir: Üç tekil ve bir çoğul. Örneğin ‘malık’ (küçük) kelimesindeki durumu inceleyelim.

Burada ‘malık’ kelimesini sözlükte dört kez (malık, malka, malko, malki) tanımlıyoruz.

(84) word(phon::malik &

syn :: (cat :: adj & gender :: masc & num :: sg) & turkish :: 'küçük').

(85) word(phon::malka &

syn :: (cat :: adj & gender :: fem & num :: sg) & turkish :: 'küçük').

(86) word(phon::malko &

syn :: (cat :: adj & gender :: neut & num :: sg) & turkish :: 'küçük').

(87) word(phon::malki &

syn :: (cat :: adj & gender :: _ & num :: pl) & turkish :: 'küçük').

İlk üç örnekte tekil (num :: sg) tanımı, fakat cinsiyet (gender) farklılığı

durumlardır. Dördüncü (95) örnekte ise çoğul (num :: pl) ve bütün cinsiyetler (gender :: _) için geçerli bir tanımdır.

6.2.3. Fiiller

Fiiller de daha önce belirttiğimiz standartlarla tanımlanacaktır, fakat burada ek olarak bir zaman belirleyicisi de bulunmaktadır. Bulgarca’da da fiiller cümlenin zamanını belirttiği için bir zaman göstergesi de eklenmiştir.

(88) word(phon::kupih &

syn :: ( cat :: verb & gender :: _ & num :: sg & tense :: past) & turkish :: 'aldım').

Zaman gösterimindeki isimlendirme ingilizce olarak tanımlanmıştır. Örnekte olduğu gibi geçmiş zaman için ‘past’ ifadesi kullanılmıştır.

6.2.4. Belirteçler

Bulgarca’da belirteçlerin özellikleri aynı sıfatlar gibi Türkçe’dekilerine göre daha farklıdır. Bir belirtecin Bulgarca’da 4 farklı hali olabilir: üç tekil ve bir çoğul. Örneğin ‘edin’ (bir) kelimesindeki durumu inceleyelim.

Burada ‘edin’ kelimesini sözlükte dört kez (edin, edna, edno, edni) tanımlıyoruz.

(89) word(phon::edin &

syn :: (cat :: det & gender :: masc & num :: sg) & turkish :: 'bir').

(90) word(phon::edna &

syn :: (cat :: det & gender :: fem & num :: sg) & turkish :: 'bir').

(91) word(phon::edno &

syn :: (cat :: det & gender :: neut & num :: sg) & turkish :: 'bir').

syn :: (cat :: det & gender :: _ & num :: pl) & turkish :: 'bir').

Burada ilk üç örnekte tekil (num :: sg) tanımı ve farklı cinsiyet (gender)

tanımları. Dördüncü örnekte ise çoğul (num :: pl) ve tüm cinsiyetler için geçerli bir

tanım gösterilmiştir.

6.2. Öbek Oluşturma Kuralları

Öbek oluşturma kurallarının nasıl oluşturulduğunu daha önce Bölüm 5.2.2’de açıklamıştık. Burada bu kuralların programımızda uygulanışına değineceğiz. Aşağıdaki kuralı örnek alacak olursak:

(93) NP Æ adj, noun

okun sol tarafında yer alan NP (Noun Phrase), anlaşıldığı üzere bir adj (sıfat) ve bir noun’dan (isim) oluşmaktadır. Bulgarca’nın özelliği doğrultusunda sıfat ve isim öbek oluşturabilmeleri için şahıs (number) ve cinsiyet (gender) özellikleri birbirine uymak durumundadır. Aşağıdaki Prolog kodunda bu kontrolü görebiliriz:

(94)

((syn::(cat::np & gender::GENDER & num::NUMBER)) & turkish::TURKISH) ==> [(syn::(cat::adj & gender::GENDER & num::NUMBER) & turkish:: TURKISH1), (syn::(cat::noun & gender::GENDER & num::NUMBER) & turkish:: TURKISH2)]

:- concat(TURKISH1, ' ', TURKISH11), concat(TURKISH11, TURKISH2, TURKISH).

GENDER, NUMBER ve TURKISH olarak tanımlanan değişkenler sözlükten alınan kelimenin kontrolünü gerçekleştirmektedir. Sıfat ve isim için alınan GENDER ve NUMBER değerleri aynı olduğunda öbek oluşturulur ve ‘concat’ komutuyla birleştirilerek çevirilmiş (Türkçe olarak) cümle ekrana yansır.

6.3. Ayrıştırıcı

Programda ayrıştırıcı (parser) olarak görev yapan kod parçası (101)’de görülebilir.

(95) parse([syn::_SYN & turkish::TUR],[], TUR). parse([X,Y|Rest], String, TUR) :-

Z ==> [Y, X],

parse([Z|Rest], String, TUR). parse(Stack, [Word|Words], TUR) :-

word(phon::Word & syn::SYN & turkish::TUR1),

parse([(syn::SYN & turkish::T1)|Stack], Words, TUR). parse([X|Rest],String,TUR) :-

Y ==> [X],

parse([Y|Rest], String,TUR).

Bu basit bir ayrıştırıcıdır. İlk dikkat çekilmesi gereken kısım Prolog programlamanın özyinelemeli yapısı sebebiyle durma şartı (base case) olarak belirleyebileceğimiz kuraldır. Eğer geçerli bir cümle elde edilebilmiş ise çeviri yapılır ve bu kural ile işleme son verilir. Ayrıştırıcımız cümlenin bileşenlerinden başlayarak yukarı doğru temel bileşenlerden öbekleri ve öbeklerden de cümleyi oluşturacak/geçerliliğini denetleyecek bir yapıdadır. Bu mekanizma tabandan yukarı (bottom-up) olarak çalışmaktadır. İkinci kural son giren ilk çıkar (LIFO - Last In First Out) algoritması ile çalışan yığında (stack) en az iki eleman varsa bunları birleştirerek bir öbek oluşturup oluşturamayacağına bakar. Bunu yaparken öbek oluşturma kurallarından faydalanır. Eğer bir öbek oluşursa bu yeni oluşturduğu yapıyı yığına ekler ve işlem devam eder. Belirtilmesi gerek ki ayrıştırıcı yığından her defasında iki eleman alarak işlem yapmaktadır. Bu durum da öbek oluşturma kurallarımızın ikililer biçiminde tanımlanmasından kaynaklanmıştır. Daha gelişmiş ayrıştırıcı modelleri mevcuttur (bkz. Gazdar ve Mellish 1989, Allen 1995). Son olarak da geçerli bir cümle elde edilememiş ise ve yığında ikiden az eleman varsa veya varolan elemanlardan bir öbek oluşturulamadıysa çalışmaktadır. Kullanıcı tarafından girilen kelimenin sözlükte olup olmadığına bakılır. Sözcüğü bulduktan sonra yazımı (programımızda phon özelliği olarak belirtilmiştir) hariç diğer bütün özelliklerini yığına atar. Sözcük varsa çevirilmiş halini döndürür, değilse olumsuz cevap döndürür

Benzer Belgeler