Sunday 25 August 2013

İmkansıza yaklaşırken - Türkçe Anlayan Bilgisayar Programım

Verilen bir metni okuyup onun hakkında sorulan soruları otomatik olarak cevaplayan programımın ilk örneği(prototipi)...

İlk olarak aşağıdaki metni wordAnalyzer modülüne veriyorsunuz.

ARS Ankaraya gitti.
ARS Ispartaya gitti.
Anın güzelliği.

Kelime analizi yapan modül bir sözlük yardımı ile aşağıdaki çıktıyı üretiyor. 
 
Noun(ARS) Noun(Ankara,ya) Verb(git,ti)
Noun(ARS) Noun(Isparta,ya) Verb(git,miş)
Noun(an,ın) Noun(güzel,liği)

Kelime analiz programını hemen hemen bitirmiş durumdayım. Çok ince dil oyunları üzerinde bir miktar daha çalışmam gerek.  Fakat ana yapı hazır, ince düzeltmeler gerekli.  Bir örnek olarak

Anın güzelliği.  Kelimelerinin çıktısı:

test00.txt
0--------------------------------------->---------------->
root=an wordid="2178"mult-no="0"word_type="İsim"
SENSE INFO ="an","2178","0",1,"H","İsim"
--------------------------->----------------------------->
===>ExtIsNounExtension-->root=an ext---> %%  % &ın
0--------------------------------------->---------------->
root=an wordid="2488"mult-no="0"word_type="-i"
SENSE INFO ="anmak","2488","0",1,"E","-i"
"anmak","2488","0",3,"E","-i"
--------------------------->----------------------------->
===>ExtIsVerbExtension-->root=an ext--->+ın ::  :
0--------------------------------------->---------------->
root=anı wordid="2363"mult-no="0"word_type="İsim"
SENSE INFO ="an?","2363","0",1,"H","İsim"
--------------------------->----------------------------->
===>ExtIsNounExtension-->root=anı ext---> %%  % &n
0--------------------------------------->---------------->
root=güzel wordid="21164"mult-no="0"word_type="İsim"
SENSE INFO ="güzel","21164","0",10,"H","İsim"
"güzel","21164","0",11,"H","İsim"
--------------------------->----------------------------->
===>ExtIsNounExtension-->root=güzel ext--->#liğ %%  % &i
0--------------------------------------->---------------->
root=güzel wordid="21164"mult-no="0"word_type=
SENSE INFO ="güzel","21164","0",2,"H",
"güzel","21164","0",3,"H",
"güzel","21164","0",4,"H",
"güzel","21164","0",5,"H",
"güzel","21164","0",6,"H",
"güzel","21164","0",7,"H",
"güzel","21164","0",8,"H",
--------------------------->----------------------------->
===>ExtIsNounExtension-->root=güzel ext--->#liğ %%  % &i
0--------------------------------------->---------------->
root=güzelliğ wordid="21179"mult-no="0"word_type=
SENSE INFO =
--------------------------->----------------------------->
===>ExtIsNounExtension-->root=güzelliğ ext---> %%  % &i

Dikkat ederseniz sözlükten farklı anlamları da alabiliyorum gerekirse...

Daha sonra soru müşteriden alınır.  Bu sorular:

Ali nereye gitti?
Neyin güzelliği?

Bu kısmı elle yaptım.  Fakat alınan soru yine wordAnalyzer – kelime analizi modülünden geçirilmeli.

Daha sonra bu çıktı kullanılarak sorular oluşturulmalı ve answerMachine.jj içine bu kod import edilmeli.  Şimdilik bunları elle yaptım fakat programla yapmak yalnızca mekanik bir yük ve zaman meselesi.

Soruları answerMachine.jj içine alınca:

void WhereDidAliGo() :

{System.out.println("WhereDidAliGo(");Token t;}
{  
                        "Noun(" t=<WORD> {System.out.println("===> " + t.image);}                                           
                        ")" {System.out.println(")");}
                        WhiteSpace()               

                        "Noun(" t=<WORD> {System.out.println("===> " + t.image);}
                                               ","
                                               (t=<YA>  {System.out.println("===> " + t.image);}
                                               )*
                                               ")" {System.out.println(")");}
                        WhiteSpace()               

                        "Verb(" t=<WORD> {System.out.println("===> " + t.image);}
                                               (                      ","
                                                                       t=<WORD> {System.out.println("===> " + t.image);}
                                               )*
                                               ")" {System.out.println(")");}
                        WhiteSpace()
}

void NeyinGuzelligi() :

{System.out.println("Neyin güzelliği?");Token t;}
{  
                        "Noun(" t=<WORD> {System.out.println("===> " + t.image);}
                                               ","
                                               (t=<IN>  {System.out.println("===> " + t.image);}
                                               )*
                                               ")" {System.out.println(")");}
                        WhiteSpace()               

                        "Noun(" t=<GUZEL> {System.out.println("===> " + "güzelliği");}
                                               (                   
                                                  ","
                                                                       t=<LIGI> {System.out.println("===> " + t.image);}
                                               )*
                                               ")" {System.out.println(")");}
                        WhiteSpace()
}

Çıktısı:  Soruların cevabı:

********************test01.txt********************
WhereDidAliGo(
 
===> ARS
)
\s
===> Ankara
===> ya
)
\s
===> git
===> ti
)
\s
\r
\n

WhereDidAliGo(

===> ARS
)
\s
===> Isparta
===> ya
)
\s
===> git
===> miş
)
\r
\n

Neyin güzelliği?

===> an
===> ın
)
\s
===> güzel
===> liği
)
\r
\n




Yukarıda görüldüğü gibi 'Anın' kelimesinin üç farklı anlamı vardır.

an-ın aidiyet eki 'ın' ile an isimi
anın fiil kökü an ve emir eki 'ın'
anı-n isim kökü anı ve 2. tekil şahıs aidiyet eki 'ın'

Program 'Neyin' sorusunu  isim ve aidiyet ekine dönüştürerek bu güçlüğü aşıyor.

Not:Kısacası bu iş burada gözüktüğü kadar basit ve kolay değil.