Tuesday 26 November 2013

Mutlu son! Türkçe yazıları okuyup anlayabilen bilgisayar programı

Mutlu son! Türkçe yazıları okuyup anlayabilen bilgisayar programı ilk meyvelerini vermeye başladı.

Hemingway'in Fareler ve İnsanlara Dair romanının TÜMÜNÜ parse ettim.  Ekteki resimlere bakınız.



Program
işlenen kelime sayısı   = 27873
işlenmeyen kelime sayısı  =  1678

işlenmiş kelime sayısı  = 26195

işlenmiş kelime anlamları  = 27661
ikircikli anlam sayısı  =  1466

ikirciklilik %si   =  0.05

Daha önce yine Fareler ve İnsanların ilk 10 sahifesinde yaptığım çalışmada %2.5'a ulaşmıştım.  Burada sorun ilk defa kitabın bütününü parse etmemden kaynaklanıyor.

Geçtiğimiz süre içerisinde parserda önemli iyileştirmeler yaptım. 

Sözlükten deyim aramak için kelimeleri ikişer ikişer kontrol etmek gibi.  Ayrıca, sorulara cevap vermek mekanizması için, parser çıktılarını bir MySQL database table'ına atan bir modül ekledim.
Daha önce yaptığım, cümle içi kelime seçeneklerini matrix kombinezonu alarak değerlendirme mekanizmasını kullanmaktan vazgeçtim.

Ayrıca, soru cevaplama mekanizmasını bir JavaCC parserı yerine kendi yapacağım parser benzeri program ile gerçekleştirmeğe karar verdim.  Bir DB table ile birlikte çalışacak bu program çok daha etkin ANLAM ARAMALARIna imkan verecek.

Daha önce bütün kitap için 4.5 saat olan ilk işlem süresini 8 dakikaya indirdim.  Diğer işlem aşamaları da en çok 1-2 dakika seviyesinde artık.

Bundan sonra yapılacaklar:
1- Parser'ın bütünü üzerinde Fareler ve İnsanlar kitabının tümünü kullanarak tailoring/iyileştirme çalışması.
2- Parser çıktısı olan DB table'ı kullanarak basit sorulara nasıl cevap verilebilir araştırması.

Saygılar.

Ali R+

Sunday 3 November 2013

Türkçe Anlayan Bilgisayar Programı: SON GELİŞMELER


Programım okuduğu yaklaşık 700 kelimelik metinden 638 kelimeyi doğru ve tek olarak algılıyor.  Yaklaşık 30-40 kelimenin birden çok anlamını çıkarıyor.  Bunların bir kısmı gerçekten birden çok anlamlı kelimeler örneğin:

" yakılan birçok  ateşlerden kalma bir kül yığınına rastlanır; dal, gelip geçenler üstüne otura otura aşınmış ve artık dümdüz olmuştur".

cümlesinde "dal" kelimesi kendi başına emir halinde fiil ya da ağaç dalı olabilir.  İnsan okuyucu bunu kelime gruplarından ve bağlamdan çıkarıyor.

Programım şu anda 2'li kelime gruplarından öte zincirleme isim tamlamalarını da anlıyor:

FARELERE VE İNSANLARA DAİR
"Salinas Irmağı, Soledad kasabasının birkaç mil güneyinde, dağlık taraftaki kıyıya yakın,
yüksekçe bir yerden dökülür ve "

test00.txt
----------------------------------------------nounSeqCount= 0 Noun-Seq begins...
Özelİsim [0][0]=Salinas
nounSeqCount=1
Finishing nounExt(ı) [1][0]=Irmağ ı
----------------------------------------------nounSeqCount= 0 Noun-Seq begins...
Özelİsim [2][0]=Soledad
nounSeqCount=1
Finishing nounExt(sı) [3][0]=kasaba sının
----------------------------------------------nounSeqCount= 0 Noun-Seq begins...
Sıfat [4][0]=birkaç
nounSequence İsim [5][0]=mil null
nounSeqCount=1
Finishing nounExt(ı) [6][0]=güney inde
----------------------------------------------nounSeqCount= 0 Noun-Seq begins...

ya da:
"Irmağın bir tarafında, altın yamaçların kıvrıla, kıvrıla sert ve kayalık Gabilan dağlarına kadar yükseldiği görülür,  fakat suyun vadi tarafındaki kıyıları boydan boya ağaçlıktır."

----------------------------------------------nounSeqCount= 0 Noun-Seq begins...
nounExt(in) [0][0]=Irmağ ın
nounSeqCount=1
nounSequence İsim [1][0]=bir null
nounSeqCount=2
Finishing nounExt(ı) [2][0]=taraf ında
----------------------------------------------nounSeqCount= 0 Noun-Seq begins...
nounExt [3][0]=al tın
----------------------------------------------nounSeqCount= 0 Noun-Seq begins...
nounExt(in) [3][1]=alt ın
----------------------------------------------nounSeqCount= 0 Noun-Seq begins...
İsim [3][3]=altın
nounSeqCount=1
continuing nounExt(ların) [4][0]=yamaç ların
nounSeqCount=2
----------------------------------------------nounSeqCount= 0 Noun-Seq begins...
----------------------------------------------nounSeqCount= 0 Noun-Seq begins...
Sıfat [7][1]=sert
Process Conjunction=ve
nounSequence İsim [9][0]=kayalık null
nounSeqCount=1
nounSequence Özelİsim [10][0]=Gabilan null
nounSeqCount=2
continuing nounExt(ların) [11][0]=dağ larına
nounSeqCount=3
nounSeqCount=3
Finishing nounSequence nounFromVerb [13][0]=yüksel diği
----------------------------------------------nounSeqCount= 0 Noun-Seq begins...
----------------------------------------------nounSeqCount= 0 Noun-Seq begins...
----------------------------------------------nounSeqCount= 0 Noun-Seq begins...
nounExt(yin)) [16][0]=su yun
nounSeqCount=1
nounSequence İsim [17][0]=vadi null
nounSeqCount=2
nounSequence nounExt(ki)[18][0]=taraf ındaki
nounSeqCount=3
Finishing nounExt(ları) [19][0]=kıyı ları
----------------------------------------------nounSeqCount= 0 Noun-Seq begins...
nounExt [20][0]=boy dan
nounSeqCount=1
nounSequence İsim [21][1]=boya null
nounSeqCount=2
nounSeqCount=2
Finishing nounSequence Noun [22][0]=ağaçlık tır

İsim tamlaması içinde geçen çok seçenekli kelimeler örneğin:

SUB(
WORD(
Root(Fiil(ağ,931))
Ext(verbExt(ır,::-ır:))
Root(Fiil(ağ,931))
Ext(adjectiveFromVerbExt(ır,.ır))
Root(Fiil(ağ,931))
Ext(nounFromVerbExt(ır,-ır))
)=ağır

durumunda adjectiveFromVerbExt şeklinde sonuçlanacak(bir kaç gün içinde).

Eğer kelime grupları yetersiz olursa, bağlama bakmak gerekecek:
Elimdeki yapı içinde cümle içindeki kelimeler ve ilgili bilgiler bir dizi içinde duruyor.  Bir fonksiyon yardımı ile kolaylıkla tipi belirsiz kelimenin örneğin 5 geri ve 5 ileri cümlelere kadar hangi tipte kullanıldıklarına bakıp en çok kullanılanı seçeceğim, örneğin dal için:

...alçak dalları arasında...
...teşkil eden dalları ile...
...alçak bir dalı önünde...

görüldüğü gibi 'dal' kelimesi hep bir isim olarak geçmiş bağlam içinde.

Öyle ise :

" yakılan birçok  ateşlerden kalma bir kül yığınına rastlanır; dal, gelip geçenler üstüne otura otura aşınmış ve artık dümdüz olmuştur".

cümlesinde 'dal' emir fiili değil isimdir.

Saygılarımla.

Ali R+ SARAL