Sayfalar

Pazartesi, Nisan 02, 2018

Kelime Kök Ayırıcı



Artık Yapay Sinir Ağları Doğal Dil İşleme  ( NLP )  alanında da kendini gösteriyor. Yoğun olarak derin öğrenme algoritmalarının kullanıldığı yeni çözümler boy gösteriyor.
Yabancı kaynaklarda  Doğal Dil İşleme ile ilgilendiğinizde elinizdeki metin verisinin  temel temizleme yaklaşımı şu şekildedir.
  1. Kelimleri  ayır
  2. Kelimelrin kökünü bul  - stem -
  3. Anlama etki etmeyen genel kelimeleri at  - stop words -
Bu şekilde bir temizleme ile yapılmak istenen şey  Anlamı bozmadan Kelime sayısını azaltmaktır.  Böyle temizleme faliyetine girişmeksizin yapılan bir modellemede kelime sayısının astronomik boyutlara fırlamasına ve modelin çok kompleksleşip, öğrenememesine sebep olabiliyor.

İngilizce gibi bir dilde kök bulmanın genellikle pek bir ters etkisi olmuyor  Fakat,  Türkçede yapısı gereği sondan eklerle bazen fazlasıyla anlam değişikliği oluyor. Bu yüzden yapılacak çalışmada buna dikkat etmek gerekiyor.

bir örnek verelim

gözüm ağrıyordu. göz doktoruna gitttim.  gözlük numaram değişmiş. 
gözlüğümün çerçeveside eskimişti.  gözlükçüye gidince,  yeni bir gözlük çerçevesi de aldım.

göz, gözüm ,gözlük,, gözlüğümün gözlükçüye, gözlük ... diye geçen kelimelrin hepsinin köküne göz demek anlamı bozar.
gözüm => göz
gözlüğümün => gözlük
gözlükçüye => gözlükçü
daha doğru bir yaklaşım gibi. Elbette bir anlam kaybı var ama nispeten daha doğru gibi geliyor bana. Elbette farklı anlamlı , yazılışlı aynı kelimeler için  bir çözüm değil bu.
 
Ortada çözümü olmayan genel bir optimizasyon problemi var. Eğer sadece kökü kullansanız, bazı anlamları kaybetme ,htimaliniz var. Tamamını kullandığınızda kelime sayınız astronomik sayılar çıkıyor.

Kelime vektörleri bu işi çözmezmi  ? ,  Kelime vectörleri dediğimiz sistemde Kelimeler sabit uzunlukta vektörler olarak ifade ediliyor.  Temelindeki  fikir şudur. Aynı anlamı ifade eden kelimeler aynı bağlamda - context - de kullanılır. Büyük derlemde - corpus  - kelimeler birlikte kullanıldıkları kelimelere göre optimize edilerek her birisi için sabit bir vektöre ulaşılıyor. Yakın anlamlı kelimeler kelime vektör uzayında bir birine yakın konumlarda oluyorlar.  Burda şöyle bir problem var her kelimenin her türlü ekiyle birlikte yeterli miktarda kullanım metnin olması pek mümkün değil.

Çok sıkıcı bir girizgah oldu kusuruma bakmayınız.  Ama sebebi var.
Bizim bir çalışmamız oldu. Kök bulma işlemini seq2seq bir modele öğretmeye çalıştık. Sağolsun Ahmet Aksoy beyin yayınladığı bir veriyi kullanarak eğittik. Bu haliyle bırakmadık Yavuz Kömeçoğlu kardeş bu model için etkileşimli bir web sayfası hazırladı.

nlp-kokbulma.herokuapp.com/

Şimdiki haliyle kullanıcının vereceği kelime için model çalıştırıp bir cevap dönüyor. Kullanıcı Cevabın doğru yada yanlış olup olmadığını ve  doğrusunu bildirebiliyor.

* Bu projenin özelliği ne peki. Yukardaki girizgahdan anlayabileceğiniz gibi çok zor bir  problemi çözdük  gibi bir iddiamız yok. Bu projenin ana özelliği klasik yaklaşımın dışında bir çözüm getirmesi
Klasik yaklaşımda şöyle olursa nasıl yaparım böyle olursa nasıl yaparım diye kurlallar silsilesi kurgulamanız lazım.  Hatta karşımıza kurguladığımız hiç bir kurala uymayan bir kelime çıkarsa.
 if kelime BU ise kök ŞU dur.  
demek zorunda kalıyorsunuz.

Modern yaklaşımlarda Olabildiğince çok veri bularak , Bir birini takip eden bir yapının diziliminden örüntüler çıkarıp istenen sonuca ulaşılmaya çalışılır. Biz bu projede bunu yapmaya çalıştık. Verimizi sağlıklı bir şekilde büyütebilirsek, modelin  başarısı artacağını umuyoruz.

* Bir başka büyük özelliği etkileşimli bir şekilde sunuluyor olması.  Günümüzde Türkçede Doğal Dil İşleme üzerine çalışma yapacak kişin, ilk toslayacağı duvar, elde hazırda verinin olmayışıdır. Sağ olsunlar Yıldız Üniversitesinden Kemik gurubunun yıllar önce yaptıkları dışında açık şekilde ulaşılabilir bir veri malesef yok. Bu çalışmayla gönüllülerin girdiği yeni kelimeler ve düzeltmelerle çok daha geniş bir verisetine ulaşabilme imkanını sunuyor.

Bu proje bir rol model olarak düşünülüp çok daha kompleks DDİ ( NLP ) problemleri için çözüm ve veriseti toplama sistemleri düşünülebilir.

Elbette bunu özel sektörde çalışan ben ve Master tezini vermeye uğraşan Yavuz tek başımıza yapamayız. Kullananlar olması lazım. Kullanıcaların yazdıklarının toparlanıp ayıklanması lazım. Sistemin yeniden eğitilmesi lazım. Epey bir emek gerekiyor.  Hatta bence bu bu tip bir proje ve elbette daha gelişmişleri, Akademik olarak sahiplenilmesi gereken projelerden.  Biz projeyi çalıştırdık. Kodumuzuda deeplearningturkiye  gurubunun github hesabında  yayınladık

github.com/deeplearningturkiye/kelime_kok_ayirici

Bundan sonra Proje sahiplerini bekliyor.

Derin Öğrenme Kısmı:


Gelelim işin teknik kısmına Modelimiz Seq2Seq denen yapıda bir ağ.  Keras kullanıldı. Kelimeler harf bazlı kodlandı. Harf çeşit sayımız 34. Yani bir harfi 34 uzunluğunda vektör olarak kodluyoruz. Maksimum kelime uzunluğu eldeki veri setine göre 22 olarak belirlendi.
RNN ağ katmanı veriyi zaman bazında istiyor. Bizim durumumuzda kelime uzunluğu 22 olduğundan
22 seferde  34 uzunluklu vektörler. Ağın çıkışıda  aynı şekilde kodlanmış olarak sadece Kök kımı üretiliyor.

Ağın genel yapısına bakalım


çok sade bir çoklu girişden çoklu çıkış -seq2seq-  üreten RNN li bir model . Fazladan diyebileceğimiz  sadece başta Dikkat - Attention - kısmı var. Giriş deki verilerin önem derecesini öğrenmesi için bir YSA katmanı yerleştiriyoruz ve katmanın çıkışını veri için bir önek katsayısı olarak kullanıyoruz.

Modeli sade tuttuk çünkü eğitim eğrisi gayet güzel test verisi başarısıda epey yüksek.



Elbette Verilerin çoğalması ile Modelede ilaveler gerekebilir. Kodda kerasın çeşitli callback fonksiyonları kullanıldı. Onlardanda bahsedelim.

  • EarlyStopping : Eğitim esnasında takip ettiğiniz  değerde belirleyeceğiniz adım -epoch - boyunca iyileşme yoksa eğitim veridiğiniz adım sayısından önce durduruluyor. Bizim kodumuzda 9 adım boyunca test verisi başarımında bir iyileşme olmuyorsa duryor.
  • ReduceLROnPlateau : Eğitim esnasında takip ettiğiniz  değerde belirleyeceğiniz adım -epoch - boyunca iyileşme yoksa Öğrenme hızını sizin belirleyeceğiniz bir katsayıyla çarparak küçültüyor. Bizim kodumuzda 2 adım boyunca test verisi başarımında bir iyileşme olmuyorsa Öğrenme hızı 0.5 çarpılarak yarıya indiriliyor.
  • ModelCheckpoint : Eğitim esnasında her adım sonunda belirleyeceğiniz şartlara göre modelin komple yada sadece ağırlıklarının kaydedilmesi işini yapar. Bizim kodumuzda test verisi başarım değerinde bir yükselme olmuşsa kaydediyor.
  • CSVLogger : Eğitim esnasında her adım sonunda , hem eğitim hem test verisi için , Hata değeri - loss - başarım değeri - acc - . Ve  öğrenme hızı - learning rate -  değerlerini kaydeder.

Bizim anlatacaklarımız bu kadar. Bayda uzamız buraya kadar sabırla okuğunuz için teşekkürler . Her türlü görüş ve önerilerinizi bekleriz.