23 Şubat 2007

Zemberek Web Servisi ve JAX-WS

Zemberek erişim sınıfındaki metodlar arasında yer alan
List<String[]> kelimeAyristir (String kelime) imzalı metodu Web servisi olarak açmaya çalışırken başıma gelenler:

  • Öncelikle JAX-WS arayüzlerle çalışamıyor illa sınıf bekliyor. Web servisinde List yerine ArrayList kullanmak zorunda kaldım.

  • Daha önceden erişim metodu <List<List<String>> tanımlı iken ve ben bunu ArryList<ArrayList<String>> şeklinde döndürmeye çalışırken dıştaki listeyi WSDL ve XSD lerde List e eşlemesine rağmen içteki listeyi (ArrayList<String>) elemansız bir sınıf tanımına eşliyordu.

  • Bunun üzerine Ahmet metodu ilk bahsettiğim haline getirdi ve ben de ArrayList<String[]> döndürmeye çalıştım. Sonuç yine hüsran oldu. http://jax-ws-sources.dev.java.net/issues/show_bug.cgi?id=42 adresindeki hata ile karşılaştım ve bunu hata raporu olarak bildirdim.

  • Hep hatalardan bahsettim. Şimdide çözüme gelelim. Şu an için metod String matrisi (String[][]) döndürüyor. Bu kapsamda matrislerin daha önceden hiç ihtiyacım olmadığı için farkedemediğim bir özelliğini öğrendim. Matrisin her satırı farklı sayıda eleman içerebiliyormuş. String matris[][] = new String[satirsay][]; şeklinde ilklendiğinde matrisin her satırına farklı uzunlukta diziler atanabiliyor. Eh öğrenme hiçbir zaman bitmiyor işte :P.

11 Şubat 2007

Zemberek nasıl çalışır? 1.Sözlük ve Kök ağacı

Zemberek bir kelimenin Türkçe olup olmadığına nasıl karar veriyor? Bu basit sorunun cevabı "verilen bir kelimeyi Türkçe kök ve eklerine ayırabilirseniz Türkçedir, ayıramıyorsanız değildir". Kısacası bir kelimenin Türkçe olup olmamasını anlamak için morfolojik analiz yapabilmelisiniz. Türkçe yazım denetimi yapabilmek için önceleri en sık kullanılan kelimelerin bir dosyaya konulup gelen kelimelerin o dosyadan kontrol edilmesi gibi ilk bakışta mantıklı görünen ama biraz inceleyince pratik olmadığı anlaşılan yöntemler de düşünülmüştü. Bu tür yöntemlerin yetersiz olan %98-99 doğrulukla çalışması için bile milyonlarca kelimeyi içermesi gerekir.

Zemberek çok basit bir sistemle verilen bir kelimeyi morfolojik olarak inceler. Önce verilen kelimenin kökü olabilecek adayları belirler, sonra da olabilecek ekleri uygun sırayla bu kök'e eklemeye çalışır. Eğer bu işlem sırasında girişteki kelimenin aynısını elde edebilmişse, o zaman uygun kök ve ekleri de bulmuş demektir ve kelime Türkçedir, eğer kök adaylarının hiçbirinden sonuç elde edilememişse o zaman kelime Türkçe değildir. bu işlemin ilk adımı olan kök adaylarının bulunması işlemini inceleyelim. Kök adaylarının bulunabilmesi için öncelikle elimizde Türkçe'deki tüm kök kelimelerinin bulunması gerekiyor. Zemberek Türkiye Türkçesi içi yaklaşık 30.000 kök içeren bir kılavuzu da beraberinde taşır, bu kılavuzda her kök tipine ve özel durumlarına göre etiketlenmiş şekilde bulunur. Diğer Türk dilleri için yapılan gerçeklemeler de benzeri bir kök sözlüğünü taşımalıdırlar. Burada bahsi geçen özel durumlar sondaki sert ünsüz harfin yumuşaması (sağlık -> sağlığa) veya bazı durumlarda sondan bir önceki sesli harfin düşmesi (burun -> burnu) gibi halleri içerir. Kökler için kullanılan etiketler de dile göre değişiklik gösterebilir. Aşağıda Azeri Türkçesi için yazılmış kök sözlüğünün küçük bir bölümü görülmektedir.


su AD
sağlıq AD YUM
al EY
gel EY
tuz AD
istiot AD
et AD
balıg AD
bir RA
iki RA
dörd RA
dünen ZAMAN
sabah ZAMAN


Verilen bir kelimenin kök adaylarının bulunması için zemberek bu kökleri özel bir ağaca yerleştirir. bu özel ağaç sayesinde adayların belirlenmesi son derece hızlı şekilde yapılabilmektedir. Bu ağaçta kökler içeriklerine göre yerleşirler, örneğin aşağıdaki örnekte "baz" kökü sırasıyla B- A -Z ile etiketlenmiş düğümlerin en sonuncusuna bağlanmış şekilde durur. Burada dikkati çeken bir nokta da uzun köklerin gereksiz fazladan düğüm oluşturmayacak şekilde ağaca bağlanması ve bellekten tasarruf edilmesidir. yani "Balerin" kökü B-A-L-E düğümlerinden sonra gelen R düğümüne bağlanmıştır.


Kök ağacı kök düğümleri ve bu düğümlerin bağlantılarından oluşur. Kitap gibi bir ek geldiği zaman yumuşama olasılığı olan köklerin değişimiş halleri de kök ağacına eklenir. Ancak bu değişmiş haller de orijinal kökü işaret ederler.


Kök ağacının oluşturulması işlemi oldukça ince bazı uç durumları göz önüne almayı gerektirir. ağacın daha oluşturulurken bellek tasarrufu ve performans için yukarıda anlatılan kuralara göre davranması için aşağıdaki 7-8 durum için farklı önlemler alınması gerekmiştir. Ağaç oluşum kodları ile ilgili problemli noktalara işaret eden NZemberek geliştiricisi Tankut Tekeli'ye de buradan teşekkür etmek isterim.

Bu yazıda kısaca kök sözlüğü ve kök ağacının yapısı ve oluşturulmasından bahsettim, daha sonraki yazılarda köklerin nasıl seçildiği, çözümleme işlemi gibi adımların iç yapıları hakkında biraz bilgi vermeye çalışacağım.

Daha fazla bilgi için genel olarak Zemberek ve işleyişi ile ilgili 8 sayfalık bir makaleyi okuyabilirsiniz.