Wednesday 9 October 2013

İyi haberler! Türkçe yazıları okuyup anlayabilen bilgisayar programı

İyi haberler!  Türkçe yazıları okuyup anlayabilen bilgisayar programı projesi ilerliyor!

Şu andaki durum:

1- Yazıyı okuyup kelimeleri tiplerine ve eklerine göre ayrıştıran wordAnalyzer.jj modulü yeni düzeltmelerle bitmiş durumda.  Gerektiğinde kolaylıkla yeni düzeltme ve eklemeler yapabiliyorum.  Bu programın çıktısı aşağıdaki şekildedir:

girdisi:
-------
alacak
sıcak

çıktısı:
--------
SENTENCE(

WORD(
Root(Fiil(al,1898,0))
Ext(verbExt( :: -acak : ))
Ext(adjectiveFromVerbExt(.acak))
Ext(nounFromVerbExt(<acak))
Root(İsim(alacak,1519,0))
)=alacak

WORD(
Root(Sıfat(sıcak,45444,0))
)=sıcak

2-Bu katman wordFilter.jj modulü ile gerek kullandığım sözlükten kaynaklanan gerekse dilin yapısından kaynaklanan gereksiz kelime bilgilerini filtre eder.  Örneğin:

girdisi:
--------
WORD(
Root(Fiil(gör,20347,0))
Ext(verbExt(+ül :: -ür : ))
Root(Fiil(görül,20365,0))
Ext(verbExt( :: -ür : ))
)=görülür

çıktısı:
--------
WORD(
Root(Fiil(gör,20347))
Ext(verbExt(ülür,+ül::-ür:))
)=görülür

girdisi:
--------
,
WORD(
Root(İsim(sır,45693,0))
Ext(nounExt(#tı %% =n % &dan))
Root(İsim(sır,45694,0))  <=(sır kelimesi için
                            sözlükte iki ayrı id ile bilgi verilmiş)
Ext(nounExt(#tı %% =n % &dan))
Root(İsim(sırt,45784,0))
Ext(nounExt( %% ?ın % &dan))
)=sırtından

çıktısı:
--------
,
SUB(
WORD(
Root(İsim(sır,45693))
Ext(nounExt(tından,#tı%%=n%&dan))
Root(İsim(sırt,45784))
Ext(nounExt(ından,%%?ın%&dan))

Ayrıca, cümleleri SUB adlı alt cümlelere böler.  Bunu virgül vb yazı işaretlerine ve bağlaçlara göre yapar.  wordFilter modülünün önemi tek kelimenin farklı bağlamlarda alabileceği çeşitli işlevsel ya da anlamsal şekillerinin oluşturduğu seçenek sayılarını azaltmaktır.

8GB I7 bir bilgisayar ile 3er seçenekli en çok 14 kelimenin bütün olası alternatif düzenlemelerini yapmak mümkün.  Bunu özel amaçlı bir program ile gerçek veri kullanarak denedim.

Sonuç:  Kelimelerin olası anlam ve işlev(fiil, isim vb) seçeneklerini mümkün olan en aza indirmek projenin başarısı açısından hayati.  wordFilter modulü ile 6-7 sayfalık Fareler ve İnsanlara Dair
örneğim üzerinde yaptığım testte, en çok 4 seçenekli iki kelime hariç diğer tümü 3 seçeneğin altına indi.  Ayrıca, cümleleri yazı işaretleri ile ve bağlaçlarla alt cümleler bölünce 50 kelimenin üzerindeki cümleler bile 'anlaşılabilirlik sınırı' altına indi.

Bu başarının tecrübesi ile önemli bir noktayı fark ettim.  Alt cümleler bazan kelime gruplarına denk düşüyordu.  Bunun üzerine kelime gruplarını ve kelimelerin cümle içindeki işlevlerini inceledim.

3- Sonuçta wordPatternFilter.jj modulü ortaya çoktı.  Bu modulün öncekilerden bir farkı tekrarlanabilir ve ölçeklenebilir olması.  Kolaylıkla filtre mantığı değiştirilip kendi çıkışını aynen
giriş olarak alıp tekrar filtrelemek mümkün...

Örneğin: Fiilden yapılma zarf için şu kurallar geçerli:

a.Cümle sonu zarf olmaz.
b. zarf+ceye  kadar ard arda gelmek zorunda.
c.sonu -ı ile gelen yarıver, açıver fiil takip etmeli.
d.kay-ıp akar fiilden önce gelir.
e.parılda-ya parılda-ya kelime tekrarlanır.
Not:  Bu örnekler çok basite indirgenmiş.  Programlarken ince detayları halletmek gerekiyor.

SON DURUM:
1- İsim ve sıfat tamlamaları ve mümkün olan diğer kelime gruplarına ilişkin filtre mantıklarını işleyip çalıştıracağım.  Bu aşamada bir yan ürün cümle analizi yapan bir program.  Bu program Türkçe'den başka dillere tercüme makinası yapmakta kullanılabilir.

2- Kalan az sayıda seçenek ile oluşan çıktıyı olduğu gibi kullanarak bir cevaplayıcı mekanizma kurmayı deneyeceğim.  Bu mekanizmayı daha sonra bir model olarak kullanarak soru hazırlayıcı modulü yazmak gerek.

3- Eğer 2. aşamada sorun çıkarsa, o zaman seçenekleri 1'e indirmek için hazırladığım matris kombinasyonu programını devreye sokacağım.  Bu durumda, kelime seçenekleri kalkacak fakat alt cümle seçenekleri ortaya çıkacak.  Cevaplayıcı mekanizma bütün alt cümle seçeneklerine ayrım yapmadan bakıp  uygun cevabı seçecek.

Saygılar.
Ali R+ SARAL