Monday 17 March 2014

LANGANA 2014 Mart Progress Report



LANGANA: Okuduğu metinleri anlayıp ilgili soruları cevaplayan programımda son gelişmeler:
1-      ÖZNE bulma algoritmasının doğru çalışması için gerekli bir altyapı çalışması-deyim işleme (phrase processing) tamamlandı.  Sorunu şu şekilde gösterebilirim:

SENTENCE NO = 29 ********************************************************

buf_sub_struct_list()------------------------------------------------------------

29                 0                     SENTENCE(==>CONJUNCTSUB(
29                 0                     0                     17474         Bağlaç         null               Fakat            null               null               null
ÖZNE =====>  Lennie
29                 1                     0                     0                     Özelİsim    null               Lennie        null               null               null
29                 2                     0                     47231         İsim              null               su                   nounExt     yun               %%=yun%
29                 3                     0                     23943         İsim              null                                   nounExt     ine                %%?in%&e
29                 4                     0                     46609         Fiil                 nsz                 solu              verbExt      maya            ::-maya:
ÖZNE =====>  devam
29                 5                     0                     13169         İsim              null               devam        null               null               null
29                 6                     0                     17153         Fiil                                        ed                  verbExt      iyordu         ::-iyor-du:
29                 7                     .END-SENTENCE)

buf_verbose_list()------------------------------------------------------------
 Fakat Lennie suyun içine solumaya devam ediyordu

LANGANA metini kelime kelime algıladığı için ‘devam etmek’ deyiminin belirttiği eylem-fiil yerine ‘devam’ kelimesini ‘isim’ olarak anlıyordu.

Bu hata düzeldiğinde:
SENTENCE NO = 29 ********************************************************

buf_sub_struct_list()------------------------------------------------------------

29                 0                     SENTENCE(==>CONJUNCTSUB(
29                 0                     0                     17474         Bağlaç         null               Fakat            null               null               null               null               null               null
ÖZNE =====>  Lennie
29                 1                     0                     0                     Özelİsim    null               Lennie        null               null               null               null               null               null
29                 2                     0                     47231         İsim              null               su                   nounExt     yun               %%=yun%                        null               null               null
29                 3                     0                     23943         İsim              null                                   nounExt     ine                %%?in%&e                     null               null               null
29                 4                     0                     46609         Fiil                 nsz                 solu              verbExt      maya            ::-maya:      null               null               null
29                 5                     0                     13169         İsim              null               devam        null               null               null               begFiil        13169         1
29                 6                     0                     17153         Fiil                                        ed                  verbExt      iyordu         ::-iyor-du: endFiil        13169         1
29                 7                     .END-SENTENCE)

buf_verbose_list()------------------------------------------------------------
 Fakat Lennie suyun içine solumaya devam ediyordu

Farkedilebileceği gibi, çözüm kitaptan okunmuş metinler veritabanına 3 yeni sütun eklenerek sağlanmıştır.  Daha önce parse edilen metinleri veritabanına yazığımı belirtmiştim.  Şimdi GetPhrasesFromDict2.java adlı bir programla, ana metinin her kelimesini 2’li, 3’lü ve 4’lü gruplar halinde sözlük veri tabanında arıyorum.  Eğer varsa ana metine ilişkin veri tabanı kayıtlarına eklediğim 3 yeni sütunu güncelliyerek, örn. ‘bomba gibi patlamak’ deyimi için
‘Phrase’ alanına:
begFiil 
Fiil
endFiil
ve ilgili satırlar için bu deyime ilişkin word_id ve mult_no değerlerini yazıyorum.

Daha sonra, FindSubjectOfSentence9.java adlı programımda yaptığım bazı değişkliklerle bu ‘Phrase’ sütununu kontrol edip kelime isimse bile eğer bir deyimin parçası ise onun bir özne parçası olamayacağına karar veriyorum.

2-      Deyim  çalışmasının yararı pek o kadar fazla değil ya da henüz yalnızca fiil deyimlerini dikkate aldığımdan etkisi pek görünmüyor.
Yeni sonuçlar:
0 - 100. cümleler arasında %72 başarı  (eskisi %68)
100 - 200 arasında %71 başarı (eskisi %68)
200 - 300 arasında %63 başarı (eskisi %55)

Hata kaynakları ise şöyleydi:
0 - 100 arasında (22 nesne, 0 deyim, 4 diğer)
100 - 200 arasında (2 zamir, 25 nesne, 0 deyim, 2 uzama)
200 - 300 arasında (31 nesne, 0 deyim, 6 complexity)

3-      Yukarıda görüldüğü gibi LANGANA’nın başarısı açısından bir dönüm noktasına gelmiş bulunuyorum.  NESNE tespitine başlamam ve bunu ÖZNE tespiti ile birlikte götürmem gerekiyor.  300 – 400. Cümleler arasında da yaptığım inceleme:
300 - 400 arasında (31 nesne, 4 diğer) ile %59 başarı gösterdi.
SONUÇ: NESNE tespitini başarırsam %90’ın üzerinde bir başarı elde ederim.

4-      Ayrıca ÖZNE ve NESNE tespitinde kazandığım tecrübelerin alt cümleler-tümleçlerin tespitine de yardımcı olacağına inanıyorum.  Tümleçlerin doğru tespiti özellikle Türkçe’de İngilizceye otomatik tercüme makinası yapımında önemli olacak.


En son fakat en önemsiz olmayan bir nokta:
LANGANAe yani LANGANA’nın İngilizce versiyonunu yapma çalışmam henüz İngilizce sözlüğü veri tabanına yükleme aşamasında.  973 bin 872 satırlık eski bir Webster sözlüğünü parse etmeye başladım.  Z harfi 2500 satır bitti.  İşin en zor aşamasını geçmek üzereyim, Y harfi yaklaşık 2800 satır ve ben 300 satır civarındayım.  Artık parserıma yeni eklemeler yapmaktan çok reduction-azaltma ve rasyonelleştirmeler yaparak ilerliyorum.  Önemi bir sorun, temel özellikler aynı kalmakla birlikte bir çok küçük farklı kullanımlar olması.  Parser’ın bütün bu farkları yakalaması gerekiyor-en azından veri tabanında erişilmesi gereken detaylar için...

Wednesday 5 March 2014

LANGANA- :2014 Mart Son Gelişmeler

LANGANA: Okuduğu metinleri anlayıp ilgili soruları cevaplayan programımda son gelişmeler:

1- Özne bulma algoritmasının testini 'Fareler ve İnsanlara Dair' adlı kitabın ilk 100 cümlesinden, ilk üç yüz cümlesine genişlettim.  Kitabın tümü yaklaşık 3000 cümle.

Sonuçlar:
0 - 100. cümleler arasında %68 başarı
100 - 200 arasında %68 başarı
200 - 300 arasında %55 başarı ile LANGANA özneyi hatasız buldu.

Hata kaynakları ise şöyleydi:
0 - 100 arasında (22 nesne, 6 deyim, 4 diğer)
100 - 200 arasında (2 zamir, 25 nesne, 3 deyim, 2 uzama)
200 - 300 arasında (31 nesne, 8 deyim, 6 complexity)

Görüldüğü gibi hata kaynaklarını belirli ve sınırlı hale getirmiş bulunmaktayım.  Özel isim ve zamirlerden kaynaklanan istisnai durumları düzelttim.  Bunlara ilişkin yaklaşık 30 hatayı düzeltmiş oldum.

Şimdi, önce deyim daha sonra nesne problemlerini ele alacağım.

Her iki problemi de içeren bir örnek ele alalım:
" Batan güneşin kızıl ışıkları şimdi dağların başlarından aşmış,
 vadiyi alaca bir karanlık istilâ etmiş,
 çınar
 ve söğüt ağaçlarının arasına yarı bir karanlık çökmeye başlamıştı"

 LANGANA'nın anladığı:
 SENTENCE NO = 258 ********************************************************

buf_sub_struct_list()------------------------------------------------------------

258 0 SENTENCE( SUB(
258 0 0 5517 Fiil nsz Bat adjectiveFromVerbExt an .an
258 1 0 20996 İsim null güneş nounExt in %%?in%
ÖZNE =====>  kızıl ışıkları
258 2 0 30331 İsim null kızıl null null null
258 3 0 23784 İsim null ışık nounExt ları #lar%%?ı%
258 4 0 48754 Zarf null şimdi null null null
258 5 0 11748 İsim null dağ nounExt ların #lar%%?ın%
258 6 0 5208 İsim null baş nounExt larından #lar%%?ın%&dan
258 7 0 3513 Fiil -i verbExt mış ::-mış:
258 8 ,SUB(
ÖZNE =====>  vadiyi alaca bir karanlık istilâ
258 8 0 54200 İsim null vadi nounExt yi %%%&y&i
258 9 0 1515 İsim null alaca null null null
258 10 0 6880 İsim null bir null null null
258 11 0 27788 Sıfat null karanlık null null null
258 12 0 25656 İsim null istilâ null null null
258 13 0 17153 Fiil et verbExt miş ::-miş:
258 14 ,SUB(
258 14 0 10827 İsim null çınar null null null
258 15 ==>CONJUNCTSUB(
258 15 0 54481 Bağlaç null ve null null null
258 16 0 46918 İsim null söğüt null null null
258 17 0 729 İsim null ağaç nounExt larının #lar%%?ın%?ın
258 18 0 2701 İsim null ara nounExt sına %%=sı%&n&a
ÖZNE =====>  yarı bir
258 19 0 55836 İsim null yarı null null null
258 20 0 6880 İsim null bir null null null
258 21 0 27788 Sıfat null karanlık null null null
258 22 0 11531 İsim null çökme nounExt ye %%%&y&e
258 23 0 5335 Fiil -e başla verbExt mıştı ::-mış-tı:
258 24 .END-SENTENCE)

buf_verbose_list()------------------------------------------------------------

 Batan güneşin kızıl ışıkları şimdi dağların başlarından aşmış,
 vadiyi alaca bir karanlık istilâ etmiş,
 çınar
 ve söğüt ağaçlarının arasına yarı bir karanlık çökmeye başlamıştı

Görüldüğü gibi
1-"kızıl ışıkları" özne olarak bu aşama için doğru sayılır.
"Güneşin kızıl ışıkları" yapmak ileriye bıraktım.

2-"yarı bir karanlık çökmeye başlamıştı" cümlesinde
"yarı bir" doğru fakat "karanlık" eksik burada bundan önceki aşamada
"karanlık" sıfat olarak belirlenmiş olduğu için bir hata var.  Bir sıfat isim tamlamasının sonuna gelemez bu yüzden "karanlık" eksik.  Bundan önceki aşamada sonu 'lık' ile biten isimler için bir iyilik düşüneceğim anlaşılan.

3- Gelelim 'deyim' hatasına:  Dikkat ederseniz "istila etmek" deyimi şu anda:
258 12 0 25656 İsim null istilâ null null null
258 13 0 17153 Fiil et verbExt miş ::-miş:
olarak algılanıp 'istila' kelimesine isim muamelesi yapılıyor.
Oysa 'istila' fiil işlevinde...  Bu yüzden
ÖZNE =====>  vadiyi alaca bir karanlık istilâ
özne içine girmemeli.

4- Nesne problemi:  Türkçe bir cümlede şu yapısal olasılıklar var:
4.1- Özne + Nesne + fiil
4.2- Özne + fiil
4.3- Nesne + fiil

x.x- Özne  ???
x.x- Nesne ???
Gözlemler:
1-Eğer hem özne hem nesne varsa ve her ikisi de takısız ise birinci gelen öznedir, fiilin nerdee olduğu önemli değil.
2-Eğer hem özne hem nesne var ve belirsizlik varsa fiilin tipi (-i, -a vb) bu takıyı alan kelimeyi nesne olarak belirler.

ÖZNE =====>  vadiyi alaca bir karanlık istilâ

"17153","0",,"etmek","der","","",,
"17153","0",5,"E","-i",,,,,,,"Bulmak, erişmek","      

'vadiyi' nesne olur, geri kalan 'alaca bir karanlık' özne olur.

Yalnız nesne örneği:
SENTENCE NO = 210 ********************************************************

buf_sub_struct_list()------------------------------------------------------------

210 0 SENTENCE( SUB(
ÖZNE =====>  George
210 0 0 0 Özelİsim null George null null null
210 1 0 27002 Fiil nsz kalk gerundFromVerbExt ıp ;;;.ıp
210 2 0 39490 Fiil -e otur nounFromVerbExt duktan -du-k-tan
210 3 0 46688 Zarf null sonra null null null
210 4 ,SUB(
210 4 0 45180 Sıfat null sert null null null
210 5 0 6880 İsim null bir null null null
210 6 0 45233 İsim null ses nounExt le %%%&le
210 7 :SUB(?
210 7 0 22271 Ünlem null Haydi null null null
210 8 ,SUB(
210 8 0 54631 Fiil -i,-e ver null null null
210 9 0 77112 Sıfat null şu null null null
ÖZNE =====>  fareyi
210 10 0 17561 İsim null fare nounExt yi %%%&y&i
210 11 0 4688 Fiil -e bak verbExt alım ::-alım:
210 12 ,SUB(
210 12 0 12648 Fiil de verbExt di ::-di:
210 13 .END-SENTENCE)

buf_verbose_list()------------------------------------------------------------

 George kalkıp oturduktan sonra,
 sert bir sesle:
 Haydi,
 ver şu fareyi bakalım,
 dedi

 Görüldüğü gibi cümlenin ikinci kısmında nesne olan kelimeyi  özne zannediyor LANGANA.  Oysa algoritma, tek seçenek olduğunu  tespit edip daha sonra fiile bakıp:
 "54631","0",,"vermek","ir","","",,
 "54631","0",1,"E","-i","-e",,,,
 -i veya -e'den 'fareyi' kelimesinin nesne olduğunu anlayabilir.

 Yukarıda,  ver şu fareyi bakalım,  'de bakalım kelimesi konuşma ve edebi metinlere özgü bir durum.

 Aynı cümlede birden çok fiil olması durumu.  Aslında bunun,  "ver şu fareyi" bakalım şeklinde olmasını tercih ederdim.
 Yine de
 "4688","0",,"bakmak","ar","","",,
 "4688","0",1,"E","-e",,,,,,,
 bakalım fiili de nesne gerektiriyor.
 Nesne belirleyici algoritmada birden çok fiil olabilen
 bakalım vb 'nin handle edilmesi gerekecek anlaşılan...

 SONSÖZ:  LANGANA yaşıyor, büyüyor.

 Bir de iyi haber, bu arada ticari bir proje teklifi aldım.
 Yine bir parser işi...  Bison-FLEX ve C++'la...
 LANGANA'yı taze tutmaya itina ediyorum fakat belirgin bir  yavaşlama var doğal olarak.

Daha önce bahsettiğim uçak bakım manuellerinde soruna ilişkin yeri bulma işi için Webster sözlüğünü  JAVACC ile parse etmeğe başladım.  Yalnız Z harfi 2400 satır.  Ben şu anda 500 satır civarındayım.  Parse etmekteki amacım, onu database'e koyacağım.  LANGANA'da da aynı şeyi yapmıştım.  Bunun faydası, tıp metinlerinin çoğu İngilizce...  Böylece İngilizce LANGANA, yani LANGANAE'de yavaş yavaş büyüyor.  Tabii daha çok başlangıçta...