Thursday 26 December 2013

Çok güzel haber! Türkçe kitap okuyup ilgili soruları cevaplayan pprogramım LANGANA

Çok güzel haber!  Türkçe kitap okuyup ilgili soruları cevaplayan pprogramım LANGANA ilk cevaplarını verdi.

İlk olarak STEINBECK’in ‘Fareler ve İnsanlara Dair’ adlı romanını okuyup parse etti.  Sonuçları bir pseuodo dile convert edip bir MySQL database’ine sakladı.  Daha sonra benim şimdilik elle hazırladığım bir soruyu, ‘Lennie nereye gitti?’ cevapladı.    

Aşağıda ilk sütun SENTENCE_NO ikinci sütun WORD_NO, üçüncü sütun OPTION_NO’dur.
Dördüncü sütun ROOT_TYPE, altıncı sütun ROOT , sekizinci sütun ek-RAW_EXT vb...dir.

Görüldüğü gibi, basit bir 3 seviyeli SQL querysi dizisi ile, sorunun cevabını içeren cümleleri yaklaşık 30 bin kelime (100 sayfa) içinden çekip çıkardı, LANGANA...

LENNİE NEREYE GİTTİ?

****************************************
33333333333333333333333 1561              6             0             29356    İsim       null        kerevet               nounExt              ine         %%?in%&e
-----------------------------------------------------------------
1561      0             0             0            Özelİsim              null        Lennie  null        null        null
1561      1             0             30488    Zamir    null        kimse    pronounExt       nin         +ni+n
1561      2             0             13520    İsim       null        dikkat   nounExt              ini           %%?in%&i
1561      3             0             10344    Fiil          -i,-e       çek        nounFromVerbExt         memeye             -meme-ye
1561      4             0             9754      Fiil          nsz        çalış      gerundFromVerbExt     arak       ;;-ar;.ak
1561      5             0             53348    Zarf        null       usulcacık             null        null        null
1561      6             0             29356    İsim       null        kerevet               nounExt              ine         %%?in%&e
1561      7             0             19913    Fiil          -den,-e  git           verbExt                ti             ::-ti:
1561      8             0             54481    Bağlaç   null        ve           null        null        null
1561      9             0             39490    Fiil          -e           otur       verbExt                du          ::-du:
*****************************************
33333333333333333333333 2015              13           0             48386    İsim       null        şehr       nounExt              e             %%%&e
-------------------------------------------------------------------
2015      0             0             0            Özelİsim              null        Lennie  null        null        null
2015      1             0             37999    Zamir    null        ne          null        null        null
2015      2             0             55685    Fiil          -i           yap        nounFromVerbExt         acağını  -acağ-ın-ı
2015      3             0             48299    Fiil          -i           şaşır       gerundFromVerbExt     arak       ;;-ar;.ak
2015      4             0             30799    Sıfat       null       kocaman             null        null        null
2015      5             0             15879    İsim       null        el            nounExt              lerini      #ler%%?in%&i
2015      6             0             10392    Sıfat       null       çelimsiz                null        null        null
2015      7             0             6880      İsim       null        bir          null        null        null
2015      9             0             6906      Zamir    null        birbir     pronounExt       lerine    +lerine
2015      10           0             10027    Fiil          -i,-e       çarp       verbExt                tı             ::-tı:
2015      11           0             54481    Bağlaç   null       ve           null        null        null
2015      12           0             22578    İsim       null        Herkes null        null        null
2015      13           0             48386    İsim       null        şehr       nounExt              e             %%%&e
2015      14           0             19913    Fiil          -den,-e git           verbExt                ti             ::-ti:
2015      15           0             12648    Fiil         de          verbExt                di            ::-di:



****************************************
1.       QUERY:
query = "SELECT * FROM text_read_tst WHERE ROOT = '"+convertToCharSet("git","Windows-1254", "Cp1252")
            +"' AND RAW_EXT = '"+convertToCharSet("ti","Windows-1254", "Cp1252")+"'" ;
2.       QUERY:
query = "SELECT * FROM text_read_tst WHERE SENTENCE_NO = '"+convertToCharSet(ref_sentence_no,"Windows-1254", "Cp1252")
            +"' AND ROOT = '"+convertToCharSet("Lennie","Windows-1254", "Cp1252") +"' ";
3.       QUERY:
query = "SELECT * FROM text_read_tst WHERE SENTENCE_NO = '"+convertToCharSet(ref_sentence_no,"Windows-1254", "Cp1252")
            +"' AND (RAW_EXT = '"+convertToCharSet("ye","Windows-1254", "Cp1252")
             +"' OR RAW_EXT = '"+convertToCharSet("e","Windows-1254", "Cp1252")
            +"') ";

Projemin bundan sonraki aşaması:
1     1.     Bir kaç gün dinlenme...
2     2.      Bankalar, özel şirketler ve TUBITAK’tan destek arayışı...
3     3.      Referans olarak herkesin kullanımına açmak için Fareler ve İnsanlara Dair’in LANGANA-PARSER çıktısını 0 ambiguity ve %100 doğruluğa getirmek.  (En son değişikliklerle bugün %5 ambiguity’ye indirdim).
4     4.      Öncelikle soru algoritmaları geliştirmek gerek.
5     5.      Yaptığım DB’yi kullanarak ÖZNE, NESNE, İSİM-SIFAT TAMLAMALARI ayrışımını yapmak gerek.
6     6.      Geliştirdiğim soru algoritmalarını kullanıcı sorularına göre tetikleyen userinterface’i geliştirmek.

Ham olsa da elimdeki ürünü görmek denemek isteyenlere her zaman kapım açık...  Bilgisayar ortamındaki yazıların giderek arttığı günümüz ortamında yaptığım programın çarpıcı avantajlar oluşturacağından kuşkum yok.  Tıp, hukuk, basın, bankacılık vb bir çok alanda çok faydalı uygulamalar geliştirilebilir.

Saygılarımla.


Ali R+ SARAL

Wednesday 25 December 2013

Langana - Turkish Language Parser - First Output

LANGANA - A COMPUTER PROGRAM THAT UNDERSTANDS A GIVEN TEXT AND ANSWERS QUESTIONS ABOUT IT

This work is protected by the Copyright:
Creative Commons -CC Attribution-NonCommercial-NoDerivatives 4.0 International


I have been working on LANGANA for the last 5 months.  LANGANA is a computer program
that reads and understands a given text or book and then answers questions related to it.

I have finished the LANGANA-parser program which parses Turkish Language texts and
converts the output to a pseudo language and outputs this parsed text to a file
and a MySQL database.

Currently, I am working on designing queries on this parsed pseudo language database tables.
The parsed DB table data enables me to make complex queries to extract sentences and
reach out to data to answer questions such as "Ali nereye gitti?".  The query has to
check for PrivateName('Ali') + nounExt('e OR a OR ye OR ya') + Verb('git'+(verbExt('ti'))
within  a sentence.  The program will be able to switch to deeper understanding modes by
checking the context, going through more than 1 sentence, for example 2 sentences before
and 3 sentences after it finds 'Ali'.

I will be working on a userinterface which takes questions and parses/converts them.
There will be need to find an algorithm to convert the question forms such as what, which,
where to search algorithms.

Please find attached the output of LANGANA's parse of STEINBECK's book 'Of Mice and Men'
in Turkish languge.

OF MICE AND MEN statistical data:
---------------------------------
total #of words: 27740
total #of roots: 29577
total #of exts:  29366
nonprocessed  :      3
% ambiguity :  (29577 - 27740)/ 29577 = 0.07 = %7

Ambiguity may be reduces by program retouches, procedural changes and manual changes
to produce a reference book for further parses of other Turkish books.  But reducing
ambiguity may in some cases reduce the possibilities to search in case of answering
questions, for ex. adjFromVerb and nounFromVerb ambiguity.

I wish my work serves my other collegues who also take the challenges of  the Turkish language.
Last but not the least, my work is available for only academical and non-commercial endeavours,
unless you get a written consent from me.

Ali Riza SARAL

Copyright condition:
Creative Commons -CC Attribution-NonCommercial-NoDerivatives 4.0 International
Attribution-NonCommercial-NoDerivs
 CC BY-NC-ND

You are free to:
Share — copy and redistribute the material in any medium or format

The licensor cannot revoke these freedoms as long as you follow the license terms.

Under the following terms:

Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made.
You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.

Information

NonCommercial — You may not use the material for commercial purposes.
NoDerivatives — If you remix, transform, or build upon the material, you may not distribute the modified material.


http://master.dl.sourceforge.net/project/turkishlanguageparser/LANGANA%20report3.txt


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

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

Sunday 22 September 2013

Türkçe metinleri okuyup anlayabilen bir bilgisayar programı: son gelişmeler


Türkçe Kelime Ayrıştırıcısı (Turkish Word Parser) V00.00 bitti. En son gelişmeler:

Verilen bir metni anlayıp buna ilişkin soruları cevaplayan programımın ilk aşaması kabaca bitmişti.
Arada geçen zaman içinde dökümantasyon ve çok ince yan etkileri temizledim.
Bu aşamada hız sorununu halletmek artık kaçınılmaz hale geldi.  Bu yüzden sözlük dosyalarını
bir MySQL veritabanına taşıdım.  Steinbeck'in yaklaşık 100 sahifelik 'Farelere ve İnsanlara Dair'
kitabinı kelime ayrıştırıcısı programımın işlemesi  yaklaşık 4-5 saat alıyor.  Bir insanla
karşılaştırılabilir mertebede.

Dikkat edilirse aynı harflerden oluşan fakat anlamı farklı kelimeler vardır. 
Programım bu kelime alternatiflerini aynı kelime yapısı içinde listelemektedir.
"Sıcak bir günün akşamıydı." cümlesi Kelime Parçalayıcı sonrası şuna dönüşüyor::

SENTENCE(

0. WORD(
  Root(Fiil(Sıc,45474,0))
  Ext(gerundFromVerbExt(;;;.ak))

(0,0). root+extInfo=Root(Fiil(Sıc,45474,0)) Ext(gerundFromVerbExt(;;;ak)))
  Root(not-identified(Sıcak,45444,0))

(0,1). rootInfo=Root(not-identified(Sıcak,45444,0))
  Root(Sıfat(Sıcak,45444,0))

(0,2). rootInfo=Root(Sıfat(Sıcak,45444,0))

)=Sıcak

1. WORD(
  Root(İsim(bir,6880,0))
(1,0). rootInfo=Root(İsim(bir,6880,0))
)=bir

2. WORD(
  Root(İsim(gün,20937,0))
  Ext(nounExt(%%=ün%))
(2,0). root+extInfo=Root(İsim(gün,20937,0)) Ext(nounExt(%%ün%))
  Root(İsim(günü,21051,0))
  Ext(nounExt(%%=n%))
(2,1). root+extInfo=Root(İsim(günü,21051,0)) Ext(nounExt(%%n%))
)=günün

3. WORD(
  Root(İsim(akşam,1403,0))
  Ext(verbFromNounExt(<ı(3,0). root+extInfo=Root(İsim(akşam,1403,0)) Ext(verbFromNounExt(<ı)=akşamıydı
.

Daha sonra bunlar bir matrix içine alınıyor:
#words=4
(0,0)=Root(Fiil(Sıc,45474,0)) Ext(gerundFromVerbExt(;;;ak)))
(0,1)=Root(not-identified(Sıcak,45444,0))
(0,2)=Root(Sıfat(Sıcak,45444,0))
(1,0)=Root(İsim(bir,6880,0))
(2,0)=Root(İsim(gün,20937,0)) Ext(nounExt(%%ün%))
(2,1)=Root(İsim(günü,21051,0)) Ext(nounExt(%%n%))
(3,0)=Root(İsim(akşam,1403,0)) Ext(verbFromNounExt(<ı
Bu matrixte deneme olarak kelime alternatifleri için kelime başına 20 değişik imkan tanıdım.
Yukarıda görüldüğü gibi 1. 'sıcak' kelimesinin 3 alternatifi var.
Daha sonra bu matrixin boyutunu 2'den 1'e indirdim:
(0)=Root(Fiil(Sıc,45474,0)) Ext(gerundFromVerbExt(;;;ak)))
(1)=Root(not-identified(Sıcak,45444,0))
(2)=Root(Sıfat(Sıcak,45444,0))
(20)=Root(İsim(bir,6880,0))
(40)=Root(İsim(gün,20937,0)) Ext(nounExt(%%ün%))
(41)=Root(İsim(günü,21051,0)) Ext(nounExt(%%n%))
(60)=Root(İsim(akşam,1403,0)) Ext(verbFromNounExt(<ı
Daha sonra bir matris kombinasyonu algoritmasını kullanarak
mümkün bütün alternatifleri çıkarttım.  Bu alternatiflerden boş
hane taşıyan satırları çıkartınca:

run:
(0,0)=Root(Fiil(Sıc,45474,0)) Ext(gerundFromVerbExt(;;;ak))) Root(İsim(bir,6880,0)) Root(İsim(gün,20937,0)) Ext(nounExt(%%ün%)) Root(İsim(akşam,1403,0)) Ext(verbFromNounExt(<ı
(4,0)=Root(Fiil(Sıc,45474,0)) Ext(gerundFromVerbExt(;;;ak))) Root(İsim(bir,6880,0)) Root(İsim(günü,21051,0)) Ext(nounExt(%%n%)) Root(İsim(akşam,1403,0)) Ext(verbFromNounExt(<ı
(1600,0)=Root(not-identified(Sıcak,45444,0)) Root(İsim(bir,6880,0)) Root(İsim(gün,20937,0)) Ext(nounExt(%%ün%)) Root(İsim(akşam,1403,0)) Ext(verbFromNounExt(<ı
(1604,0)=Root(not-identified(Sıcak,45444,0)) Root(İsim(bir,6880,0)) Root(İsim(günü,21051,0)) Ext(nounExt(%%n%)) Root(İsim(akşam,1403,0)) Ext(verbFromNounExt(<ı
(3200,0)=Root(Sıfat(Sıcak,45444,0)) Root(İsim(bir,6880,0)) Root(İsim(gün,20937,0)) Ext(nounExt(%%ün%)) Root(İsim(akşam,1403,0)) Ext(verbFromNounExt(<ı
(3204,0)=Root(Sıfat(Sıcak,45444,0)) Root(İsim(bir,6880,0)) Root(İsim(günü,21051,0)) Ext(nounExt(%%n%)) Root(İsim(akşam,1403,0)) Ext(verbFromNounExt(<ı
BUILD SUCCESSFUL (total time: 15 seconds)

Burada en alttaki 'günü' kelimesi seyrek kullanılan bir isim. 'not-identified' kelime tipi kullandığım sözlüğün bu iş için oluşturulmamış olması nedeni ile birşeyler kaçırırım kaygımdan dolayı aldığım bir tip...  Temizlenebilir.

Görüldüğü gibi ilk kelimede bir 'fiil - sıfat' ikilemi var.  'gün - günü' ikilemi ile çarpılınca aşağıdaki
4 alternatif kalıyor:

(0,0)=Root(Fiil(Sıc,45474,0)) Ext(gerundFromVerbExt(;;;ak))) Root(İsim(bir,6880,0)) Root(İsim(gün,20937,0)) Ext(nounExt(%%ün%)) Root(İsim(akşam,1403,0)) Ext(verbFromNounExt(<ı
(4,0)=Root(Fiil(Sıc,45474,0)) Ext(gerundFromVerbExt(;;;ak))) Root(İsim(bir,6880,0)) Root(İsim(günü,21051,0)) Ext(nounExt(%%n%)) Root(İsim(akşam,1403,0)) Ext(verbFromNounExt(<ı
(3200,0)=Root(Sıfat(Sıcak,45444,0)) Root(İsim(bir,6880,0)) Root(İsim(gün,20937,0)) Ext(nounExt(%%ün%)) Root(İsim(akşam,1403,0)) Ext(verbFromNounExt(<ı
(3204,0)=Root(Sıfat(Sıcak,45444,0)) Root(İsim(bir,6880,0)) Root(İsim(günü,21051,0)) Ext(nounExt(%%n%)) Root(İsim(akşam,1403,0)) Ext(verbFromNounExt(<ı
Buraya kadar sorun yok.  Ama matrix kombinasyonu alıp sonucu elde etmek için kullanacağımız tek boyutlu matrix'in eleman sayısı
  int maxRows = 6;
        int maxCols = 7;
        String[] matrix1 = new String[maxRows * maxCols];
        double nmax = Math.pow(maxCols, maxRows) * maxRows;
  resultMatrix = new String[(int) nmax];
  nmax=705894;

Eğer 
  int maxRows = 12;
        int maxCols = 3;
        String[] matrix1 = new String[maxRows * maxCols];
        double nmax = Math.pow(maxCols, maxRows) * maxRows
  resultMatrix = new String[(int) nmax];
  nmax=6377292; (kelime sayısı) 
 
Bundan sonra yapılması gerekenler şu şekildeydi: 

1 Bir filtre parserı kullanarak 'not-identified' vb gereksiz alternatifleri çıkarmak.

2- Bir dilbilgisi parserı ile alternatiflerini oluşturduğum cümlenin kelime sayısı bir gerund isim isim-ün eki isim fiil yapısını elemek, ya da böyle bir yapı varsa cümle alternatifi olarak saklamak. 

3- Cevap makinası parserı ile oluşturmuş olduğum bu filedan cevapları çekmek.

Fakat:

1- Elimdeki makina güçlü bir makina olduğu halde matrix kombinasyonu alabildiğim maksimum kelime sayısı/kelime alternatifi 12/3.  Yani en çok 12 kelime uzunluklu bir cümlenin en çok 3'er alternatifli kelimelerinin kombinasyonunu alarak alternatif cümleleri oluşturabiliyorum.  Oysa 'Fareler ve İnsanlar'da ilk sahifede bile 24 kelime uzunluklu cümleler var.

"Dökülen yapraklar, ağaçların altındaki kumluk kıyıda kalınca bir tabaka meydana getirmiş ve o kadar kurumuşlardır ki, bunların arasından bir kertenkele koşsa büyük bir hışırtı çıkarır." 25 kelime

"Dökülen yapraklar, 2 kelime sim.
ağaçların altındaki kumluk kıyıda kalınca bir tabaka meydana getirmiş 9
ve o kadar kurumuşlardır ki, 5
bunların arasından bir kertenkele koşsa büyük bir hışırtı çıkarır." 9
=25

Aslında bu sorun benzer şekilde insan okumasında da var.  Bunun için, virgül vb. ile bağlaçlar vb kullanılarak cümle subsentence'lara bölünüyor.  Bundan sonra yapmam gereken iş bu subsentence yapısını implemente etmek.

Tabii insan muhakemesi söz konusu olunca tamlamalar da (örn isim tamlamaları) bellek ve hız sınırlamasını alt etmeye hizmet ediyor.

Not:
1- Yukarıda bahsettiğim filtre amaçlı parserı yaptım.  Şimdi onu customize etmem gerek.

2- 'not-identified' benzeri materyali ya baştan hiç üretmeyeceğim, ya da bunları bir senginlik olarak saklayıp bir üst katmanda filtre edeceğim.  Düşünmek lazım.

3- En önemli sorun virgül vb ile bağlaç kullanarak tutarlı subsentence yapılarını oluşturmak.

4- Subsentence yapıları  oluşturulmalı:
SENTENCE(
 SUB1-alternate1(
  WORD1((word-alternate1)(word-alternate2)(word-alternate3))
  )
 SUB1-alternate2(
  WORD1((word-alternate1)(word-alternate2)(word-alternate3))
  )
)

5-Yukarıdaki yapıyı parse edip verilen soru ile ilgili yapıyı çıkartacak bir cevap motoru parserı yazmak gerek.
 
 Ali Rıza SARAL




 

Wednesday 4 September 2013

Türkçe Kelime Ayrıştırıcısı (Turkish Word Parser) Beta 0.00


Türkçe Kelime Ayrıştırıcısı (Turkish Word Parser) Beta 0.00

Verilen bir metni anlayıp buna ilişkin soruları cevaplayan programımın ilk aşaması kabaca bitti.

Bundan sonra dokümantasyon ve çok ince yan etkileri temizlemekten oluşuyor.  Çıktılar bundan sonraki aşamalara girdi olabilecek formattadır.

Dikkat edilirse aynı harflerden oluşan fakat anlamı farklı kelimeler vardır.  Programım bu kelime alternatiflerini

Aynı kelime yapısı içinde listelemektedir.  Bundan sonraki aşamada basit birparser yazarak mümkün bütün kelime alternatiflerinden mümkün bütün cümle alternatiflerini oluşturacağım.

 Daha sonraki aşamada ise müşterinin sorusuna ilişkin cevabı içeren cümleyi bir parser arasılığı ile otomatik olarak seçeceğim.  Bunu yapabilmek için müşterinin sorusunuda parçalarına ayıracak bir soru parserı yazmak gerekecek.  Ayrıca parse edilmiş bu soruyu cevap makinasının içine dinamik olarak gömmek gerekir.

 Ali Rıza SARAL


 İlk olarak bir kaç kelime örneği:

 elmalar
tanıdık
tanıdıklara
yaptırtabilememiştim

 test00.txt

 WORD(

 Root("İsim"(elma,"16107","0"))
rootWithExt(nounExt(#lar %%  % ))

 Root(not-identified(elma,"16107","0"))
rootWithExt(nounExt(#lar %%  % ))
)=elmalar

 WORD(

 Root("İsim"(tanı,"49556","0"))
rootWithExt(verbFromNounExt(<dı<k))

 Root(Fiil(tanı,"49568","0"))
rootWithExt(verbExt( :: -dı : *k))

rootWithExt(adjectiveFromVerbExt(.dık))
rootWithExt(nounFromVerbExt(<dık))
)=tanıdık

 WORD(

 Root(Fiil(tanı,"49568","0"))
rootWithExt(nounFromVerbExt(<dık<lar - a))
)=tanıdıklara

 WORD(

 Root(Fiil(yap,"55685","0"))
rootWithExt(verbExt(+tır+t+abil :: -ememiş-ti : *m))

 Root(Fiil(yaptır,"55718","0"))
rootWithExt(verbExt(+t+abil :: -ememiş-ti : *m))

 Root(Fiil(yaptırt,"55720","0"))
rootWithExt(verbExt(+abil :: -ememiş-ti : *m))
)=yaptırtabilememiştim

 İkinci olarak bunları gerçekten bir programla yaptığımı göstermesi açısından Hemingway’in ünlü romanından küçük bir pasaj:

 farelere
ve
insanlara dair

 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 buradan itibaren derinleşir ve suları yeşil bir renk alır. Suyu da ılıktır, çünkü bu dar gölcüğe gelinceye kadar, sıcak güneşin altında, sapsarı kumların
üstünden parıldaya, parıldaya kayıp akar.

 farelerInsanlar0000.txt

 WORD(

 Root("İsim"(fare,"17561","0"))
rootWithExt(nounExt(#ler %%  % &e))

 Root(not-identified(fare,"17561","0"))
rootWithExt(nounExt(#ler %%  % &e))
)=farelere

 WORD(

 Root("Bağlaç"(ve,"54481","0"))
)=ve

 WORD(

 Root("İsim"(insan,"25138","0"))
rootWithExt(nounExt(#lar %%  % &a))

 Root(not-identified(insan,"25138","0"))
rootWithExt(nounExt(#lar %%  % &a))
)=insanlara

 WORD(

 Root("Sıfat"(dair,"11873","0"))
)=dair

 WORD(
)=Salinas

 WORD(

 Root(Fiil(I,"24817","0"))
rootWithExt(nounFromVerbExt(<r<mağ - ı))

 Root(not-identified(Irmağ,"23645","0"))
rootWithExt(nounExt( %% ?ı % ))
)=Irmağı

 WORD(
)=Soledad

 WORD(

 Root("İsim"(kasaba,"28224","0"))
rootWithExt(nounExt( %% =sı % &nın))
)=kasabasının

 WORD(

 Root("Sıfat"(birkaç,"6986","0"))
)=birkaç

 WORD(

 Root("İsim"(mil,"36085","0"))

Root(not-identified(mil,"36086","0"))
)=mil

 WORD(

 Root("İsim"(güney,"21026","0"))
rootWithExt(nounExt( %% ?in % &de))
)=güneyinde

 WORD(

 Root("İsim"(dağ,"11748","0"))
rootWithExt(nounExt(#lık %%  % ))

 Root("Sıfat"(dağlık,"11827","0"))
)=dağlık

 WORD(

Root("İsim"(taraf,"49718","0"))
rootWithExt(nounExt( %%  % &ta&ki))

 Root(not-identified(taraf,"49718","0"))
rootWithExt(nounExt( %%  % &ta&ki))
)=taraftaki

 WORD(

Root(Fiil(kıy,"30272","0"))
rootWithExt(gerundFromVerbExt( ;; ;.ı.y.a))

 Root("İsim"(kıyı,"30246","0"))
rootWithExt(nounExt( %%  % &y&a))

rootWithExt(verbFromNounExt(<ya))

 Root(not-identified(kıyı,"30246","0"))

rootWithExt(nounExt( %%  % &y&a))
rootWithExt(verbFromNounExt(<ya))
)=kıyıya

 WORD(

 Root("İsim"(yak,"55147","0"))
rootWithExt(nounExt( %% ?ın % ))

 Root(Fiil(yak,"55244","0"))
rootWithExt(verbExt(+ın ::  : ))

 Root("İsim"(yakı,"55172","0"))
rootWithExt(nounExt( %% =n % ))

 Root("İsim"(yakın,"55180","0"))
Root(not-identified(yakın,"55180","0")) 

Root("Sıfat"(yakın,"55180","0"))

 Root("Zarf"(yakın,"55180","0"))

 Root(Fiil(yakın,"55202","0"))
)=yakın

 

WORD(

 

Root("İsim"(yüksek,"57690","0"))

rootWithExt(nounExt( %%  % &çe))

 

Root(not-identified(yüksek,"57690","0"))

rootWithExt(nounExt( %%  % &çe))

)=yüksekçe

 

WORD(

 

Root("İsim"(bir,"6880","0"))

 

Root(not-identified(bir,"6880","0"))

 

Root("Sıfat"(bir,"6880","0"))

 

Root("Zarf"(bir,"6880","0"))

)=bir

 

WORD(

 

Root("İsim"(yer,"56679","0"))

rootWithExt(nounExt( %%  % &den))

 

Root(not-identified(yer,"56679","0"))

rootWithExt(nounExt( %%  % &den))

)=yerden

 

WORD(

 

Root(Fiil(dök,"14537","0"))

rootWithExt(verbExt(+ül :: -ür : ))

 

Root(Fiil(dökül,"14544","0"))

rootWithExt(verbExt( :: -ür : ))

)=dökülür

 

WORD(

 

Root("Bağlaç"(ve,"54481","0"))

)=ve

 

WORD(

 

Root("İsim"(bura,"8113","0"))

rootWithExt(nounExt( %%  % &dan))

 

Root(not-identified(bura,"8113","0"))

rootWithExt(nounExt( %%  % &dan))

 

Root("Zarf"(buradan,"8116","0"))

)=buradan

 

WORD(

 

Root("Zarf"(itibaren,"25937","0"))

)=itibaren

 

WORD(

 

Root(Fiil(derinleş,"12989","0"))

rootWithExt(verbExt( :: -ir : ))

rootWithExt(adjectiveFromVerbExt(.ir))

rootWithExt(nounFromVerbExt(<ir))

)=derinleşir

 

WORD(

 

Root("Bağlaç"(ve,"54481","0"))

)=ve

 

WORD(

 

Root("İsim"(su,"47231","0"))

rootWithExt(nounExt(#lar %% ?ı % ))

 

Root(not-identified(su,"47231","0"))

rootWithExt(nounExt(#lar %% ?ı % ))

 

Root(Fiil(sula,"47343","0"))

rootWithExt(gerundFromVerbExt( ;;r ;.ı))

)=suları

 

WORD(

 

Root("İsim"(yeşil,"56813","0"))

 

Root("Sıfat"(yeşil,"56813","0"))

)=yeşil

 

WORD(

 

Root("İsim"(bir,"6880","0"))

 

Root(not-identified(bir,"6880","0"))

 

Root("Sıfat"(bir,"6880","0"))

 

Root("Zarf"(bir,"6880","0"))

)=bir

 

WORD(

 

Root("İsim"(renk,"42883","0"))

 

Root(not-identified(renk,"42883","0"))

)=renk

 

WORD(

 

Root(Fiil(al,"1898","0"))

rootWithExt(verbExt( :: -ır : ))

rootWithExt(adjectiveFromVerbExt(.ır))

rootWithExt(nounFromVerbExt(<ır))

)=alır

 

WORD(

 

Root("İsim"(Su,"47231","0"))

rootWithExt(nounExt( %%  % &y&u))

 

Root(not-identified(Su,"47231","0"))

rootWithExt(nounExt( %%  % &y&u))

)=Suyu

 

WORD(

)=da

 

WORD(

)=ılıktır

 

WORD(

 

Root("Bağlaç"(çünkü,"11711","0"))

)=çünkü

 

WORD(

 

Root("Sıfat"(bu,"7856","0"))

 

Root("Zamir"(bu,"7856","0"))

)=bu

 

WORD(

 

Root("İsim"(dar,"12167","0"))

 

Root(not-identified(dar,"12166","0"))

 

Root("Sıfat"(dar,"12166","0"))

 

Root("Zarf"(dar,"12166","0"))

)=dar

 

WORD(

 

Root("İsim"(göl,"20154","0"))

rootWithExt(nounExt(#cüğ %%  % &e))

 

Root(not-identified(göl,"20154","0"))

rootWithExt(nounExt(#cüğ %%  % &e))

 

Root(not-identified(gölcüğ,"20158","0"))

rootWithExt(nounExt( %%  % &e))

)=gölcüğe

 

WORD(

 

Root(Fiil(gel,"19369","0"))

rootWithExt(gerundFromVerbExt(in ;; ;.ceye))

 

Root("İsim"(gelin,"19328","0"))

rootWithExt(nounExt( %%  % &ce&y&e))

rootWithExt(verbFromNounExt(ce - <ye))

 

Root(not-identified(gelin,"19328","0"))

rootWithExt(nounExt( %%  % &ce&y&e))

rootWithExt(verbFromNounExt(ce - <ye))

 

Root(Fiil(gelin,"19346","0"))

rootWithExt(gerundFromVerbExt( ;; ;.ceye))

)=gelinceye

 

WORD(

 

Root("İsim"(kadar,"26475","0"))

 

Root(not-identified(kadar,"26475","0"))

 

Root("Edat"(kadar,"26475","0"))

)=kadar

 

WORD(

 

Root(Fiil(sıc,"45474","0"))

rootWithExt(gerundFromVerbExt( ;; ;.ak))

 

Root("İsim"(sıcak,"45444","0"))

 

Root(not-identified(sıcak,"45444","0"))

)=sıcak

 

WORD(

 

Root("İsim"(güneş,"20996","0"))

rootWithExt(nounExt( %% ?in % ))

 

Root(not-identified(güneş,"20996","0"))

rootWithExt(nounExt( %% ?in % ))

)=güneşin

 

WORD(

 

Root("İsim"(altı,"1949","0"))

rootWithExt(nounExt( %% =n % &da))

 

Root("İsim"(altın,"1955","0"))

rootWithExt(nounExt( %%  % &da))

 

Root(not-identified(altın,"1955","0"))

rootWithExt(nounExt( %%  % &da))

)=altında

 

WORD(

 

Root("Sıfat"(sapsarı,"44172","0"))

)=sapsarı

 

WORD(

 

Root("İsim"(kum,"32338","0"))

rootWithExt(nounExt(#lar %%  % ?ın))

 

Root(not-identified(kum,"32338","0"))

rootWithExt(nounExt(#lar %%  % ?ın))

)=kumların

 

WORD(

 

Root(not-identified(üst,"53992","0"))

rootWithExt(nounExt( %% =ün % &den))

 

Root("İsim"(üstün,"54039","0"))

rootWithExt(nounExt( %%  % &den))

 

Root(not-identified(üstün,"54038","0"))

rootWithExt(nounExt( %%  % &den))

)=üstünden

 

WORD(

 

Root(Fiil(parılda,"40848","0"))

rootWithExt(gerundFromVerbExt( ;; ;.y.a))

)=parıldaya

 

WORD(

 

Root(Fiil(parılda,"40848","0"))

rootWithExt(gerundFromVerbExt( ;; ;.y.a))

)=parıldaya

 

WORD(

 

Root(Fiil(kay,"28826","0"))

rootWithExt(gerundFromVerbExt( ;; ;.ıp))

 

Root("İsim"(kayıp,"28783","0"))

 

Root("Sıfat"(kayıp,"28783","0"))

)=kayıp

 

WORD(

 

Root(Fiil(ak,"1311","0"))

rootWithExt(verbExt( :: -ar : ))

rootWithExt(adjectiveFromVerbExt(.ar))

rootWithExt(nounFromVerbExt(<ar))

 

Root("İsim"(akar,"1132","0"))

)=akar

,=         7 ---> %1.977 + +>

.=         2 ---> %0.565 +>

I=         1 ---> %0.282 +>

S=         3 ---> %0.847 +>

a=        43 ---> %12.147 + + + + + + + + + + + + +>

b=         7 ---> %1.977 + +>

c=         3 ---> %0.847 +>

d=        16 ---> %4.520 + + + + +>

e=        24 ---> %6.780 + + + + + + +>

f=         2 ---> %0.565 +>

g=         4 ---> %1.130 + +>

i=        16 ---> %4.520 + + + + +>

k=        17 ---> %4.802 + + + + +>

l=        18 ---> %5.085 + + + + + +>

m=         3 ---> %0.847 +>

n=        21 ---> %5.932 + + + + + +>

o=         1 ---> %0.282 +>

p=         4 ---> %1.130 + +>

r=        26 ---> %7.345 + + + + + + + +>

s=        10 ---> %2.825 + + +>

t=         6 ---> %1.695 + +>

u=         6 ---> %1.695 + +>

v=         3 ---> %0.847 +>

y=        12 ---> %3.390 + + + +>

ç=         3 ---> %0.847 +>

ğ=         3 ---> %0.847 +>

ö=         2 ---> %0.565 +>

ü=        10 ---> %2.825 + + +>

ı=        19 ---> %5.367 + + + + + +>

ş=         3 ---> %0.847 +>

  ----------

TOT#=    354

 

 

TOT WORDS#=     48

*************** WORDS referred > 0  times

             al=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

          altın=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

           akar=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

         birkaç=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

        buradan=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

             bu=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

           dair=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

         dağlık=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

          dökül=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

       derinleş=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

              d=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

            dar=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

           fare=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

          güney=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

         gölcüğ=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

          gelin=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

          güneş=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

          insan=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

          Irmağ=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

       itibaren=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

         kasaba=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

           kıyı=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

          kadar=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

          kumla=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

          kayıp=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

            mil=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

           renk=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

          Salin=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

            Sol=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

           sula=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

             Su=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

          sıcak=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

        sapsarı=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

          taraf=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

          yakın=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

         yüksek=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

            yer=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

          yeşil=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

          çünkü=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

        üstünde=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

           ılık=         1 ---> %2.083 + + + + + + + + + + + + + + + + + + + + +>

            bir=         2 ---> %4.167 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>

        parılda=         2 ---> %4.167 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>

             ve=         3 ---> %6.250 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>

  ----------

TOT#=     48