Tuesday, 29 April 2014

Türkçe cümlelerde ÖZNE-NESNE ayrımı alt yapısı

Mucize gibi bir şey!  Bilgisayarım konuşmayı sökmeye başladı...

İnsan konuşmasında önemli bir aşama cümlelerin özne ve nesne
ayrımını yapmaktır.  Eylemi kimin neye yaptığını ayırt etmek.

Özne nesne ayıran LANGANA programımın ilk çıktıları aşağıda...
Özne ile nesneyi ayırt etmek için gerekli bütün unsurları
anlıyor LANGANA.

En basitten zora doğru özne ayrımını şöyle özetleyebiliriz.

Fiil.

Özne.

Özne - Fiil.

Nesne - Fiil.

Özne - Nesne - Fiil.

Özne - Nesne - Fiilimsi - Fiil.

Virgül ve diğer birleştiriciler:

Özne , Özne - Fiil.

Nesne, Nesne - Fiil.
vb.

Kullanacağım bazı algoritmalar:
-Eğer bir so(SUBJ/OBJECT) takısız ise:
       Fiilin -i transitive ise : NESNE
                           değil is : ÖZNE
-Eğer bir so takılı ise:
       takı isim tamlaması sonlandırıcısı ve fiil transitive ise ÖZNE.
       takı i hali takısı ise -nı,  -mı vb NESNE

-Eğer so bir fiilimsiden önce gelen son so ise NESNE.
-Eğer iki tane takısız so varsa önce gelen ÖZNE.     

İşte bir kaç örnek aşağıda:  Steibeck'in Fareler ve İnsanlara Dair kitabının
ilk 1000 cümlesini aşağıdaki linkten bulabilirsiniz.

Sanırım bir süre sonra ilk 1000 cümleyi:
 Çünkü [ben] {seni} bilirim,
 bir susadın mı,
 {çirkef}
 de olsa içersin

 aşağıdaki cümlenin yukarıdaki işlenmiş şeklinde source forge'da yayınlayacağım.

 NOT: LANGANAe ingilizce için yaptığım kelime tipi çalışmasında 1 milyon satırlık
 Webter sözlüğünü parse etmem gerekiyor.  Şu anda VWXYZ harflerini bitirdim. U ile
 uğraşıyorum.  PArse ettiğim toplam satır sayısı 50 bini aştı.  Yani 1/20 = %5'teyim.
 Webster'in güzelliği kullandığım Türkçe sözlüğe göre eski ama çok detaylı, tekil
 çoğul ne isterseniz bilgi olarak var.

SENTENCE NO = 41 ********************************************************

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


 Çünkü ben seni bilirim,
 bir susadın mı,
 çirkef
 de olsa içersin

buf_struct_only_list()------------------------------------------------------------

SENTENCE(==>CONJUNCTSUB(
41     0      çünkü       
41     1      ben    begso  ending-ext=null
41     2      sen i  begso  ending-ext=i
41     3      bil irim            --------------------verbExt
,SUB(
41     4      bir         
41     5      susa dın            --------------------verbExt
41     6      mı          
,SUB(
41     7      çirkef       begso  ending-ext=null
==>CONJUNCTSUB(
41     8      de          
41     9      ol sa        --------------------verbExt
41     10     iç ersin            --------------------verbExt
.END-SENTENCE)
41     11    
buf_sub_struct_list()------------------------------------------------------------

41     0      SENTENCE(==>CONJUNCTSUB(
41     0      0      11711  Bağlaç null   Çünkü  null   null   null   null   null   null
ÖZNE-NESNE =====>  ben
ARS i=1 k=1
41     1      0      5991   Zamir  null   ben    null   null   null   null   null   null
ÖZNE-NESNE =====>  seni
ARS i=2 k=1
41     2      0      77114  Zamir  null   sen    pronounExt   i      +i     null   null   null
41     3      0      6814   Fiil   -i     bil    verbExt      irim   ::-ir:*im    null   null   null
41     4      ,SUB(
41     4      0      6880   İsim   null   bir    null   null   null   null   null   null
41     5      0      47467  Fiil   nsz    susa   verbExt      dın    ::-dı:*n     null   null   null
41     6      0      77138  Soru   null   mı     null   null   null   null   null   null
41     7      ,SUB(
ÖZNE-NESNE =====>  çirkef
ARS i=7 k=1
41     7      0      11213  İsim   null   çirkef null   null   null   null   null   null
41     8      ==>CONJUNCTSUB(
41     8      0      11734  Bağlaç null   de     null   null   null   null   null   null
41     9      0      38929  Fiil   nsz    ol     verbExt      sa     ::-sa: null   null   null
41     10     0      24056  Fiil   -i     iç     verbExt      ersin  ::-er:*sin   null   null   null
41     11     .END-SENTENCE)

SENTENCE NO = 40 ********************************************************

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

 Akmayan bir su oldu mu hiç içmemelisin Lennie

buf_struct_only_list()------------------------------------------------------------

SENTENCE( SUB(
40     0      ak mayan            ------------nounFromVerb
40     1      bir    begso 
40     2      su     endso  ending-ext=null
40     3      oldu        
40     4      mu          
40     5      hiç         
40     6      iç memelisin        --------------------verbExt
40     7      lennie       begso  ending-ext=null
.END-SENTENCE)
40     8     
buf_sub_struct_list()------------------------------------------------------------

40     0      SENTENCE( SUB(
40     0      0      1311   Fiil   nsz,-e Ak     nounFromVerbExt     mayan  -maya-n      null   null   null
ÖZNE-NESNE =====>  bir su
ARS i=1 k=2
40     1      0      6880   İsim   null   bir    null   null   null   null   null   null
40     2      0      47231  İsim   null   su     null   null   null   null   null   null
40     3      0      38892  Zarf   null   oldu   null   null   null   null   null   null
40     4      0      77140  Soru   null   mu     null   null   null   null   null   null
40     5      0      22845  Zarf   null   hiç    null   null   null   null   null   null
40     6      0      24056  Fiil   -i     iç     verbExt      memelisin    ::-memeli:*sin      null   null       null
ÖZNE-NESNE =====>  Lennie
ARS i=7 k=1
40     7      0      0      Özelİsim     null   Lennie null   null   null   null   null   null
40     8      .END-SENTENCE)

SENTENCE NO = 250 ********************************************************

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

250    0      SENTENCE( SUB(
250    0      0      37999  Zamir  null   Ne     null   null   null   null   null   null
250    1      0      57957  İsim   null   zaman  null   null   null   null   null   null
...
buf_verbose_list()------------------------------------------------------------

 Ne zaman elime alıp okşasam,
 hemen parmaklarımı ısırırlardı,
 ben
 de birazcık kafalarını çimdiklerdim,
 sonra bir
 de bakardım
 ki,
 ölmüşler

buf_struct_only_list()------------------------------------------------------------

SENTENCE( SUB(
250    0      ne          
250    1      zaman       
250    2      el ime      
250    3      al ıp        ------------gerundFromVerb
250    4      okşa sam            --------------------verbExt
,SUB(
250    5      hemen       
250    6      parmak larımı begso  ending-ext=larımı
250    7      ısır ırlardı        --------------------verbExt
,SUB(
250    8      ben    begso  ending-ext=null
==>CONJUNCTSUB(
250    9      de          
250    10     birazcık           
250    11     kafa larını  begso  ending-ext=larını
250    12     çimdikle rdim       --------------------verbExt
,SUB(
250    13     sonra       
250    14     bir         
==>CONJUNCTSUB(
250    15     de          
250    16     bak ardım           --------------------verbExt
==>CONJUNCTSUB(
250    17     ki          
,SUB(
250    18     öl müşler           --------------------verbExt
.END-SENTENCE)
250    19    

SENTENCE NO = 668 ********************************************************

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

 Böyle çiftliklerde insan,
 hiçbir zaman ne kimsenin konuştuğunu dinler ne
 de kimseye bir şey sorar

buf_struct_only_list()------------------------------------------------------------

SENTENCE( SUB(
668    0      böyle       
668    1      çiftlik lerde      
668    2      insan begso  ending-ext=null
,SUB(
668    3      hiçbir             
668    4      zaman       
668    5      ne          
668    6      kimse nin          
668    7      konuş tuğunu begso  ending-ext=tuğunu------------nounFromVerb
668    8      dinle r             --------------------verbExt
668    9      ne          
==>CONJUNCTSUB(
668    10     de          
668    11     kimse ye           
668    12     bir    begso 
668    13     şey    endso  ending-ext=null
668    14     sor ar       --------------------verbExt
.END-SENTENCE)
668    15    

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

668    0      SENTENCE( SUB(
668    0      0      7801   Sıfat  null   Böyle  null   null   null   null   null   null
668    1      0      11050  İsim   null   çiftlik      nounExt      lerde  #ler%%%&de   null   null   null
ÖZNE-NESNE =====>  insan
ARS i=2 k=1
668    2      0      25138  İsim   null   insan  null   null   null   null   null   null
668    3      ,SUB(
668    3      0      22846  Sıfat  null   hiçbir null   null   null   null   null   null
668    4      0      57957  İsim   null   zaman  null   null   null   null   null   null
668    5      0      37999  Zamir  null   ne     null   null   null   null   null   null
668    6      0      30488  Zamir  null   kimse  pronounExt   nin    +ni+n  null   null   null
ÖZNE-NESNE =====>  konuştuğunu
ARS i=7 k=1
668    7      0      31317  Fiil   nsz    konuş  nounFromVerbExt     tuğunu -tu-ğ-un-u   null   null   null
668    8      0      13722  Fiil   -i     dinle  verbExt      r      ::-r:  null   null   null
668    9      0      37999  Zamir  null   ne     null   null   null   null   null   null
668    10     ==>CONJUNCTSUB(
668    10     0      11734  Bağlaç null   de     null   null   null   null   null   null
668    11     0      30488  Zamir  null   kimse  pronounExt   ye     +ye    null   null   null
ÖZNE-NESNE =====>  bir şey
ARS i=12 k=2
668    12     0      6880   İsim   null   bir    null   null   null   null   null   null
668    13     0      48595  İsim   null   şey    null   null   null   null   null   null
668    14     0      46760  Fiil   -i,-e,-den   sor    verbExt      ar     ::-ar: null   null   null
668    15     .END-SENTENCE)
      
      
SENTENCE NO = 946 ********************************************************

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

 Lennie büyük bir istekle Georgea doğru eğilerek:
 Gidelim George,
 dedi

buf_struct_only_list()------------------------------------------------------------

SENTENCE( SUB(
946    0      lennie       begso  ending-ext=null
946    1      büyük       
946    2      bir         
946    3      istek le           
946    4      george a           
946    5      doğru       
946    6      eğil erek           ------------gerundFromVerb
:SUB(?
946    7      gid elim            --------------------verbExt
946    8      george       begso  ending-ext=null
,SUB(
946    9      de di        --------------------verbExt
.END-SENTENCE)
946    10          

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

946    0      SENTENCE( SUB(
ÖZNE-NESNE =====>  Lennie
ARS i=0 k=1
946    0      0      0      Özelİsim     null   Lennie null   null   null   null   null   null
946    1      0      8384   Sıfat  null   büyük  null   null   null   null   null   null
946    2      0      6880   İsim   null   bir    null   null   null   null   null   null
946    3      0      25543  İsim   null   istek  nounExt      le     %%%&le null   null   null
946    4      0      0      Özelİsim     null   George nounExt      a      %%%&a  null   null   null
946    5      0      14144  Sıfat  null   doğru  null   null   null   null   null   null
946    6      0      15571  Fiil   nsz    eğil   gerundFromVerbExt   erek   ;;-er;.ek    null   null   null
946    7      :SUB(?
946    7      0      19913  Fiil   -den,-e      Gid    verbExt      elim   ::-elim:     null   null   null
ÖZNE-NESNE =====>  George
ARS i=8 k=1
946    8      0      0      Özelİsim     null   George null   null   null   null   null   null
946    9      ,SUB(
946    9      0      12648  Fiil         de     verbExt      di     ::-di: null   null   null
946    10     .END-SENTENCE)

       

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               iç                    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               iç                    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 aş 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...


Monday, 10 February 2014

How to determine the subject of a Turkish sentence


Subject is a noun/proper noun/noun phrase/adjective phrase/pronoun.

Subject is the first occurrence of the above options in a sentence/sub-sentence.

A sentence is formed of one/or more sub-sentences and may/may not have at least a verb.

Example output of 100 sentences:


USER REQUIREMENTS:
1- Detect sub-sentences.
2- Detect beginning of subject and accumulate the words that form it.
3- Detect the end of the phrase and print SUBJECT information.
4- Print the words of the sentence in the order of input.
5- DB access management

1- Detect sub-sentences.
1.1- A sub-sentence begins after a conjunct or ',;:'.
1.2- 'and', ',' may be used between nouns, adjectives without indicating sub-sentence.
1.3- A sub-sentence begins with a comma if the previous word is a standard verb.
1.4- A sub-sentence begins with/without a comma if the previous word is a verb derived from a noun/proper noun/adjective/adverb.

2- Detect beginning of subject and accumulate the words that form it.
2.1- A subject begins with a simple-extensionless name or with '-i'(family) name or
pronoun/nounFromVerb and exceptions from other types or dictionary related.
2.2- A subject continues with noun/proper noun/adjective/pronoun/nounFromVerb/adjectiveFromVerb words with some exceptions.
2.3- Conjunctions and ',;:' have to be handled when met during the Subject element scan.
2.4- If 'AND' and ',' is met in the subject between valid subject elemnts they have to be added to the subject.
2.5- A plural noun ends the phrase.

3- Detect the end of the phrase and print SUBJECT information.
3.1- The end of a phrase is detected when a word with extension is met.
3.2- The reaction is determined accroding to the type of the word and its extension.
3.3- If the word is not noun/proper noun/valid pronoun/valid nounFromVerb/valid phraseEndingAdverb
or there is no word extension with exceptions
it is the first word after the end of subject.
//ÖZNE =====>  tavşanlar
Kumluk kıyılarda sessiz,
SESSİZ(adverb) OTURAN(adjFromVerb) tavşanlar(noun),
taştan(noun) yontulmuş küçük,
boz heykellere benziyorlardı.
3.4- If the word is noun/proper noun/pronoun/nounFromVerb/validPhraseEndingAdverb
and if the previous word is name/proper name/valid pronoun
and the previous word has valid phrase ending extension with acceptions or valid nounFromVerb
and if the current word is a valid phrase ending word or with multiple extensions in exceptions
then this word ends the previous phrase hence the subject is not valid ()
//büyük asfalt vilâyet şosesİ tarafLARInda  //alçak bir dalI önÜnde
else this is not a valid word, so it does not belong to the prev phrase hence subject is valid
            //bazı kızlar önümüzDEN
3.5 The word 'a' (bir) has to be handled as exception in all of these requirements.  Bir is both a noun and
an adjective in Turkish. 'like' (gibi) preposition requires special handling also.
 // bir yandan  da bir at gibi
3.6 The nouns and adjectives can be interleaved in Turkish.  There is a need for a function to exclude
 adjectives at the end of Subject.

4- Print the words of the sentence in the order of input.
4.1- At the end of all the tests if subject is not printed for this sub-sentence yet, then
print the Subject.
4.2- Print the current word's info.

5- DB acces management
5.1- Get sentence and sentence struct info.
5.2- manage the input sentence in a buffer of arrays.
5.3- Buffer listing utilities.
5.4- Main program driver to read each sentence and process them.