Sayfalar

Doğal Dil işleme etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Doğal Dil işleme etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Perşembe, Eylül 19, 2019

FastText ile Kelime Vektörü Oluşturma

Bu yazımızda FastText kullanarak nasıl kelime vektörü oluşturabileceğimizi nasıl göreselleştire bileceğimizi göreceğiz.

İlk yazımızda bahsetmiştik

"Sonra Kelime vektörü - word2vec - denen bir kavram çıkmış ortaya.  Her kelime için sabit uzunlukta bir vektör kullanmak. "Birlikte geçen kelimeler anlamca yakındır" var sayımından yola çıkılıyor.  Başlangıçda aynı yapay sinir ağlarındaki gibi kelimeler için rastgele seçilmiş vektör değerleri atanıyor. Devasa derlem - corpus - kullanarak danışmansız şekilde - unsupervised - her kelime için birlikte geçtiği kelimelere göre bu vektörler güncelleniyor. "
Kelimelerin anlamca yakınlıklarına göre orantılı birer vektöre dönüştürülebilmesinin önemi büyük. Doğal dil işleme ile yapılacak hemen her işte işimize yarar bir başlangıç noktası verir. Mesela bir arama algoritmasında sadece yazdığınız kelimeyi ararsınız. Aynı yada yakın anlama gelen kelimelerin geçtiği yerlere ulaşamazsınız. Anlamca yakın kelimeler ile arama yapabilmek için kelime vektörleri çok işinize yarayacktır. Bir başka aklıma gelen örnek; iki metnin anlamca yakınlığının hesaplanmasında kullanılabilir.

FastText 'in sitesinde değişik dillerde Common Crawl ve  Wikipedia dan toplanmış derlemler le eğitilmiş hazır kelime vektör modelleri var. Elbette Türkçe içinde var.
fasttext.cc/docs/en/crawl-vectors.html
 Buradan yayınlanan hazır eğitilmiş kelime vekörleri iki formatta sunuluyor.  Uzatnısı .bin  olan FastText modeli doğrudan yüklüyebiliyorsunuz. Yada uzantısı  .txt olan da her satırda başta kelime devamında vektör olacak şekilde hazırlanmış bir metin dosyası olarak.
Hemen baştan uyarayım dosyalar çok büyük ve devasa kelime sayısına sahip. Bu tip bir modeli her bilgisayarda yüklüyebilmeniz pek mümkün olmaz.

Bu tip genel vektörlerin bir başka handikapıda şudur. Kelimeler çeşitli alanlarda çok farklı anlamlara gelebilmektedir.  Sadece eş anlamlı kelimeler için olan bir durum değil bu.  Mesela bir başkent ismi turizm ile ilgili metinlerde doğal güzellikleri mesire yerleri felanla geçerken. Uluslar arası politika yazılarında o ülkeyi ifade eden özne olarak kullanılabilir.  Böyle durumlarda o kelimenin anlamını yeterince gösterebilen vekötre ulaşamayabiliriz. Bu tip problemlemin kısmen çözümü uygulamanıza has derlem oluşturmak ve eğitimi o derlem üzerinde yapmaktır.

Türkçe için deneme yapmamıza uygun bir derlem buluyoruz. Derlem konusunda eskiden beri çalışmalarıyla bilinen  Ahmet Aksoy 'un  çalışmasını kullanacağız. Bu derlemi Kaggle  da veri kümelerinin yayınlandığı kısımda yayınlamışlar.

www.kaggle.com/ahmetax/hury-dataset

Bizde ordan indirip FastText GUI ile eğitim  yapacağız. Bu derlemde Hürriyet gazetesinden çekilmiş haberler cümlelerine ayrılmış, noktalama işaretleri sayılar ve etkisiz kelimeler - stop words - çıkarılmış. Devam etmeden "stop words" kavramından bahsedelim. Kavram olarak anlamı cümle içlerinde kaldırıldığında anlamı değiştirmeyen kelimeler diyebiliriz.  Değişik tercümelerine denk gelmek mümkün ; gereksiz kelimeler, dolgu kelimeler, etkisiz kelimeler vs ...

Evet elimizde temizlenmiş hazır dermlem var biz bu derlem ile FastText GUI ile gözetimsiz eğitimler yapıp kelime vektörleri oluşturacağız. Elbette  fasttext i komut satırında kullanarak yada python paketindeki fonksiyonlarlada eğitimler yapabilirsiniz. GUI için çalıştıralbilir paket oluşturduk onu da kullanabilirsiniz.

İki ana eğitim metodu var skipgram ve cbow bir her ikisi içinde 100 lük vektörler üretecek şekilde eğitimler yaptık.  Ek olarak fasttext 'in klasik wor2vect in gelişmişi olduğunu söylemiştik.  Başlıca üstünleklerinden biriside kelimeyi harf ngramlar olarakda tutabiliyor olmasıdır. Bu konuyla ilgili eğitimde seçeneklerimiz var. harf ngram kullansın / kullanmasın diye de 2 seçenekli ilave eğitim yaptık. Toplam da 4  eğitim oldu.

GUI kullanımından bahsedelim biraz



Sol en üstte "Command"  kısmındaki açılır listede  4 seçenek var
"skipgram" ve "cbow" gözetimsiz eğitim için kullaınacak seçenekler dir. 
"supervised" seçeneği gözetim li eğitim için
"test" de gözetimli eğitimi yapılmış modeli bir veri seti üzerinde çalıştırıp sonuçları görmek için.

Üstte Ortada "Run Mode" var. burda 2 seçeneğimiz var
"slient" da fasttext arkaplanda  ekrana çıktı vermeyecek şekilde çalıştırılır ve sonuçlar işlem bittiğinde GUI de ekranda gösterilir.
"std output" seçeneğini seçtiğinizde fasttext çalışıtırılır ve komut satırı penceresinde çalışmasını ve yazdıklarını görebilirsiniz. fakat işlem bittiğinde yaptıkları GUI ekranına gelmez.

Harf ngram seçeneğini belirleyen kısım ise altta ortadaki "min char ngram" ve "max char n gram " seçenekleri her ikisinide 0 yaptığınızda harf ngram kullanmayarak eğitimi yapacakdır.
"learning rate" seçeneği başlangıç öğrenme hızıdır. Yapay öğrenme metodlarının çoğundaki anlamda kullanılır en büyük değer 1.0 dır fakat çok büyük olursa  hata  - loss - değeri küçülmek yerine büyümeye başlıyor ve sonra program çakılıyor. ona dikkat edin
"epoch" ise yine eğitim iterasyonunun ne kadar fazla yapılacağına dair bir parametre, Ne kadar büyük verirseniz o kadar uzun süre çalışır.
"word ngram"  için seçenek var. Bir dışında bir seçenekle kelime ngram yapısını kullanmış olursunuz.
"word vector Dimension"  seçeneği kelime için üretilecek vektör büyüklüğünü belirler.


Eğer eğitimi "slient" yaptıysanız eğitim süresince loss değerinin değişimini gösteren bir grafikde çizdiriyoruz gui altta



FastText kendi içinde multi thread bir yapıda olduğundan çalışırken mesaj almakda epey problem yaşadım. Halada tam çözümü olmayan bir sürü kısmı vardır. Ama yinede komut satırı açıp uzun uzun parametereleri yazmayla uğraşmak zorunda kalmıyorsunuz.

 Gelelim sonuçlara. Yukarda belirttiğim gibi 4 eğitim yapıtık.  hepsinde 100 lük vektör oluşturduk.
  1. skipgram + subwords ( char ngram ( 3 - 6) )
  2. skipgram  sadece kelime bazlı
  3. cbow + subwords ( char ngram ( 3 - 6) )
  4. cbow  sadece kelime bazlı



sonuçları nasıl görselleştirebiliriz derseniz kelime vektörlerini  iki boyuta PCA  indirip grafik olarak gösterebiliyoruz. Mesela İlk eğitim sonucu elde edilen vektörlerden rast gele seçilmiş 250 kelime için şöyle bir grafik çıkıyor.



 Bazen ilginç bağlantılar görülsede bu şekilde çoğu yerinde karman karışık bir yapı çıkıyor.  Bizim anlamca ilgisini bildiğimiz kelimelerden oluşturduğumuz bir listeyi aynı şekilde görselleştirerek bakıyoruz.



Burda gayet  şık bir anlamca uygun bir dağılım görüyoruz. altın, gümüş, elmas, zümrüt, platin gibi değerli maden ve metaller sağ üstte toplanmış. Sol üst tarafa doğru ise toplanan kelimeler ise ; Terör, terörist, cinayet, tecavüz, katil, katiller, pkk, deaş,  gibi kelimeler. Hatta "terörizst " diye bir kelime bile var. Biz bu kelimeyi mahsus koyduk aslında böyle bir kelime yok. Ama bu eğitimde harf bazlı ngram kullanıldığından bu kelimenin vektörünü doğru konumlandırabilmiş. Diğer kelimeleride inceleyin benzeri yakınlıklarda konumlandıklarını görebilirsiniz.

Hemen 2. eğitim sonucuna bakıyoruz



burda diğer kelimelerde yine mantıklı ve benzeri sonuçlar görürken  "terörizst " kelimesinin nisbeten olması gereken yerde uzukta ortaya çıktığını görüyoruz. Buda harf bazlı ngramın faydası diyelim.

3. eğitim cbow + subwords sonuç grafiği




4. eğitim cbow kelime bazlı sonuç grafiği


Eğitim sonrası ulaşılan hata değerleride yazalım
  1. skipgram + subwords ( char ngram ( 3 - 6) )  --  Loss : 0.990
  2. skipgram  sadece kelime bazlı --  Loss : 0.961
  3. cbow + subwords ( char ngram ( 3 - 6) ) --  Loss : 1.480
  4. cbow  sadece kelime bazlı --  Loss : 1.352
Evet epey uzun da ols bir yazının daha sonuna geldik. Her türlü görüş ve önerilerinizi bekleriz.

Pazar, Eylül 15, 2019

Python dan EXE ye çevirmek...


C/C++ ile programlamaya başlayan biri olarak Python ile program yazmak oldukça zahmetsiz geliyor. Bir kütüphane kurmak çoğu zaman komut satırında bir "pip"  yazmayla halloluyor. Keza kodun içerisinde de bir "import" ile kurulmuş kütüphaneyi kullanmaya başlıyabiliyorsunuz.

C/C++ da olsa bir kütüphaneyi kurmak için ya o kütüphaneyi derlemeniz gerekiyor ya da kullandığınız derleyiciyle derlenmiş kütüphaneyi bulmanız gerekiyor. Keza yazdığınız kodda kütüphaneyi çağırabilmek içinde bir sürü formaliteyi halletmiş olmanız lazım. Bu konu çok sorulduğundan hakkında  Kütüphane kullanımı diye yazı bile yazmıştık. Bütün bunların üstüne programınızı derleyip çalıştırmışsanız. Çalıştırılabilir halini kolayca başkalarıyla paylaşabiliyordunuz. Yanına eğer gerekiyorsa kullanılan dinamik kütüphaneleri -DLL- koyarak elbette.

Pythonda bu imkan kolay değil. Kodu verebilirsiniz elbette ama insanlar sadece kullanmak istiyorsa bile mecburen python ve gereken paketleri kurmaları bekleniyor. Helede kullanıcının programlamayla ilgisi yoksa bu seçenek tümden zor oluyor. Yada python dosyalarından çalıştırılabilir dosya çevrimi yapan bir uygulama kullanacaksınız. Bundan önceki 3 yazımızda FastText ve onun için yazdığımız GUI programından bahsettik. GUI programının kullanımını kolaylaştırmak adına bizde exe formatına çevirelim dedik. Ve kolları sıvadık

Python kodlarını çalıştırılabilir hale getirmek için değişik projeler oluşturulmuş benim görebildiklerimi listeleyim 
Uzun boylu bir inceleme yapmadık. Kabaca bir araştırma sonrası biz PyInstaller kullanmaya karar verdik.  Birileri oturup incleyip karşılaştırma yaparsa bizde seviniriz. Çalışmaların çoğunun yaptığı aslında çevrilmesi için belirlenen python dosyasından o dosyada kullanılan paketleri tespit edip sonra ilgili dönüşümleri yapmasıyla oluyor. Elebette zor bir işlem helede kurulmuş paket sayınız çoksa. Burda önerim yeni bir ortam - virtual environment - kurmanız.  Benim bilgisayarımda Anaconda verisyonu var.  conda komutuyla hemde python versiyonu seçerek oratm kurabiliyorsunuz

conda create -n pvinst python=2.7

komutuyla pvinst isimli bir ortam kurduk. Bu ortamı activate komutuyla aktif edip içine sadece fasttextgui için lazım olan paketleri kuruyoruz.
artık pyinstaller komutunu kullanabiliriz. genel hali şöyle
usage: pyinstaller [-h] [-v] [-D] [-F] [--specpath DIR] [-n NAME]
                   [--add-data ]
                   [--add-binary ] [-p DIR]
                   [--hidden-import MODULENAME]
                   [--additional-hooks-dir HOOKSPATH]
                   [--runtime-hook RUNTIME_HOOKS] [--exclude-module EXCLUDES]
                   [--key KEY] [-d {all,imports,bootloader,noarchive}] [-s]
                   [--noupx] [--upx-exclude FILE] [-c] [-w]
                   [-i ]
                   [--version-file FILE] [-m ] [-r RESOURCE]
                   [--uac-admin] [--uac-uiaccess] [--win-private-assemblies]
                   [--win-no-prefer-redirects]
                   [--osx-bundle-identifier BUNDLE_IDENTIFIER]
                   [--runtime-tmpdir PATH] [--bootloader-ignore-signals]
                   [--distpath DIR] [--workpath WORKPATH] [-y]
                   [--upx-dir UPX_DIR] [-a] [--clean] [--log-level LEVEL]
                   scriptname [scriptname ...]
                  
biz öyle teferruata felan girmeden

pyinstaller fasttext_gui_main.py --clean


diye yazıyoruz ve gereken dosyalar oluşturuluyor. Elbette sonucu denemeniz ve gereken ilave dosyalarıda toplamanız gerekiyor.

GUI içinde düğmelerde kullanılan görüntü dosayalarını diziniyle birlikte ilgili dizine atıyoruz
GUI programı aslında arkaplanda alt işlem olarak fasttext.exe yi çalışıtırıyor. fasttext.exe de bazı DLL dosyalarına ihtiyaç uduryor onlarıda ekliyoruz.
Her nedence pygal ın css ile kısmında bütün  herşey ilgili dizine aktarılmamış. O dosyalarıda ekliyoruz.
artık elimizde çalıştırılabilir FastText GUI var  hayırlı olsun

Indirmek için github hesabının release sayfasına buyrunuz

bu sayfadaki daki fasttext_gui_main.7z isimli  sıkıştırılmış dosyayı indirip açın "fasttext_gui_main.exe" dosyasını çalıştırın

Her türlü görüş ve öneriliriniz bekleriz. Eğer kısmet olursa FastText yazılarımıza kelime vektörleri ile ilgili  konularda devam edeceğiz

Cumartesi, Ağustos 31, 2019

FastText ile hızlı metin sınıflandırma - 3

Bir önceki yazımızda veri kümemimiz ile FastTextGUI kullanarak eğitim işlemini yapmıştık. Eğitim sonucunda uzantısı .bin  olan bir models dosyası oluşturuldu. Bu yazımızda eğittiğmiz modeli nasıl kullanacağımızı göreceğiz.

Eğtilmiş modeli kullanmanın iki yolu var. Birincisi FastText in komut satırı çalıştırılabilir programını kullanarak. İkinci yolu FastText i python kütüphanesi olarak yükleyerek.

İlkinden başlıyalım. FastText programının kullanım parametrelerine bakalım


Bu seçeneklerden  tahmin için "predict" yada "predict-prob" sçeneğini kullanabiliriz. aralarındaki fark ikincisinde tahmin ile birlikte tahin kesinlik ihtimalinide veriyor.  Tahmin yapılmasını istediğiniz metinleri her biri bir satır olacak şekilde bir metin dosyasına kaydetmemiz gerekmekdedir. Her tahmin için geçici bir metin dosyası yazdırıp FastText programıyla çalıştırmamız gerekiyor. Bu işlem için bir fonksiyon yazdık


Kullanım için test için hazırladığımız dosyayı yüklüyoruz. Burdaki gerçek sonuçları da ayırıp sorgumuz yapıyoruz sonuçlarıda gerçek sonuçlarla karşılaştırmak için sckit-learn kütüphanesinin , confusion_matrix, classification_report  fonksiyonlarını kullanıyoruz.
confusion_matrix : Karşılaştırma matrisi  tahmin edilen ile gerçek değerelri karşılaştırmanıza yarar matrisin bir ekseni gerçek değerler diğer ekseni tahmin edilen değerleri gösterir.

 her satır gerçek değerleri gösterir her sutunda tahminleri gösteriyor. Eğer modelimiz %100 başarılı olsaydı satır ve sutun indeksi aynı olan yerlerde her sını için örnek sayısı olan 5 bin dğerini göremiz gerekirdi.  Örnek vermek gerekirse ilk sınıfımız olan Şirket sınıfındaki  5 bin örnekden 4767 tanesi Doğru tahmin edilmiş. 39 tanesi  2. sınıf olan Eğitim kurumu olarak Yanlış tahmin edilmiş.
Bir güzelliğide bir birine karıştırılan sınıfların kolaylıkla görülebilmesidir.

classification_report : fonksiyonu ise  sınıf bazında recall: duyarlılık , precision: kesinlik ve bu ikisinin karışımı bir ölçüt olan f1 skorlarını hesaplayıp listler. Adıyla müsemma Sınıflandırıcı raporu düzenler



 İkinci metodumuz FastText python pakedini yüklemek. Tahmin edebilecğiniz gibi
pip install fasttext


şeklinde yapıyorsunuz. 

import fasttext
 model = fasttext.load_model('models/dbpedia_1.bin')

ile yüklüyoruz
tahmin için sorgu listemizi bir yere kaydetmemize gerek yok artık direk çağırıyoruz
model.predict(qlist)
sonuçları yine ilk örneğimizdeki gibi hesaplattırıyoruz. Aşağı yukarı aynı sonuçlara ulaşıyoruz. Toplamda  98.3 lük başarı değerine ulaşıyor modelimiz. Eğitim aşamasına geri dönüp değişik parametre ayarlarıyla daha iyi sonuçlara ulaşmaya çalışabilirsiniz. Yada ilk aşamaya dönüp Veri kümesi üzerinde değişik ön işlemeler yapıp sonuçlar üzerindeki etkisini gözlemleyebilirisiz . gerisi size kalmış

 FastText hakındaki bu seri yazımızı bitiriyoruz.  Üç yazı boyunca yaptıklarımızı github hesabımızdan paylaşıyoruz.  Kimbilir belki taş üstüne taş koyan çıkar.

Bu yazımızdaki kullanım ile ilgili kodlar,  "example"  dizininde "evaluation_with_executable" ve  "evaluation_with_python_binding" isimli ipython dosyalar olarak bulunuyor.
Veri kümesini FastText 'in kullandığı şekle çeviren kod  yine "example" dizininde "prepare_data" isminde

FastTextGUI nin kodlarına ise gui dizinin içinde ulaşabilirsiniz

Projenin github adressi ;

  https://github.com/birolkuyumcu/fasttext_gui
 Her türlü görüş ve önerilerinizi bekleriz.

Cuma, Ağustos 30, 2019

FastText ile hızlı metin sınıflandırma - 2

Metin sınıflandırma için öncelikle bir veri seti bulmamız gerekiyor biz bu yazımız için dbpedia veri kümesini kullanacağız. Sizde uygulama istiyorsanız aşağıdaki linkden indirebilirsiniz


Veri Kümesinin açıklamasını okuyoruz.
...
The DBpedia ontology classification dataset is constructed by picking 14 non-overlapping classes from DBpedia 2014. They are listed in classes.txt. From each of thse 14 ontology classes, we randomly choose 40,000 training samples and 5,000 testing samples. Therefore, the total size of the training dataset is 560,000 and testing dataset 70,000.
...
Yani DBpedia 2014 den çekilmiş  14 değişik sınıfa ait yazılar başlık + içerik olarak toplanmış.  Her sınıf için eğitimde 40 bin  test veri seti için 5 bin örnek kaydedilmiş. DBpedia  wikipedia da üretilmiş içeriklerin yapısal bir şekilde derlenip torpalanmış halidir diyelim. DBpedia hakkında daha fazla bilgi için sitesine gidebilirsiniz. Belkide size lazım olan veri kümesini bu şekilde temin edebilirsiniz...


Açıklamanın tamamını veri kümesini indirip açtığınızda "readme" belgesinden okuyabilirsiniz

veri kümemiz sıkıştırılmış dosya olarak geliyor bulunduğumuz dizine açınca  "dbpedia_csv" isimli bir dizine açılıyor

Sınıf isimlerimizi okuyoruz



Şirket , eğitim kurumu, vs diye başlayan 14 başlık var. Başlıkları ayrı yazmışlar çünkü veri kümelerinde  yani "dbpedia_csv/train.csv" ve "dbpedia_csv/test.csv" de sınıf isimleri 1 den başlayan sayı olarak yazılmış



FastText eğitim için veri kümesinin bir metin dosyası halinde verilmesini istiyor. İstediği Format ise  her satırda bir veri birimi  başta  "__label__" a hangi sınıf sa onu yazıyoruz sonrasında boşluk ve  virgül  ile ayrıp satırın devamında  o sınıfa ait bir metin yazıyoruz.  Bizim metin kısmı başlık ve açıklamda olarak iki parçalı geldiğinden birleştiriyoruz.  Etiket olarak yukarıda okuduğumuz sınıf isimlerini kullanıyoruz. Metin verisinde yaptığımız tek işlem ise küçük harfe çevirmek. Veriler sıralı şekilde verilmiş, bizde karışmadan aynı şekilde FastTextin istediği formata çevirip yazıyoruz



aynı işlemi test verisi içinde yapıyoruz.


Evet artık 'dbpedia.train' ve 'dbpedia.test' diye 2 dosyamız oldu içine bakıyoruz



Bu aşamadan sonra sıra geliyor FastText'e.  İki şekilde kullanmak mümkün FastText'i derleyip komut satırından çağırmak , yada Python paketi olarak kurup onu kullanmak. FastText ilk çıktığında python paketi yoktu ve bizde bu eğitim işinde parametere ayarlarını kolay yapabilmek için bir GUI yazdık. Ve halende kullanıyoruz. Fakat malesef kod python2 de kaldı python3 e taşımaya fırsat ve gerek bulamadık daha kullanmak için python2 , pyside , pygal, paketleri gerekiyor. 
Görünümü şu şekilde ;



FastText i kullandığından kelime vektörü  hesabı içinde kullanılabilir elbette ama bizim şu anki önreğimiz metin sınıflandırma olduğundan command kısmında "supervised" seçeneğine ayarlıyoruz. TextFile kısmına eğitim veri kümemiz için hazırladığımız dosyayı seçiyoruz.   
Model File kısmında Eğitim sonrası eğitilen modelin ismini belirliyorsunuz. 
Sağ üstteki Play tuşu ile eğitimi başlatabiliyorsunuz. En sağdaki Dur işaretide durdurmak için
Altta Learning Rate  ile başlangıç öğrenme hızını belirliyorsunuz
Epoch Diğer makina öğrenme metodlarından bildiğiniz gibi eğitim kaç adım yapılacağı
En az kaç defa geçen kelimenin alınacağı, karekter ngramlarında hangi aralığın kullanılacağı, kelime ngramı kaçlık kullanılacağı vs gibi pek çok seçenek var. Ayarlı seçenekler ile başlayıp denemeler yapmak gerekiyor.

Eğitim bitince eğitim veri kümesinin ismi aynı uzantısı .test olan bir dosya varsa eğitilmiş model ile bu test dosyası çalıştırılıp sonuçda veriyor







Resimden de göreceğiniz üzere
  • precision: kesinlik    0.983
  • recall: duyarlılık   0.983
değerlerine ulaşttık ki gayet güzel sonuçlar

Eğitim sonunda  Loss  değerinin düşüşünüde grafik olarak alabiliyorsunuz.




Eğitim sonucunda uzantısı bizim belirlediğimiz isimde
uzantısı .bin  olarak model dosyası
uzantısı .vec  olarak kelime vektörelrinin tutulduğu dosya oluşturulur
FastTextGUI de bunlara ilaveten
uzantısı .log olan eğitim serencamını tutan dosya
uzantısı .svg olan  loss düşüş grafiğinin dosyasını oluşturur.


Eğittiğimiz modeli kullanmak için sadce uzantısı .bin olan dosya yeterli olmaktadır.

Eğittiğimiz modelin kullanımını bir sonraki yazımıza bırakıyoruz.  Yazı dizimiz bittiğinde bütün kodlar yayınlanacaktır.

Her türlü görüş ve önerilerinizi bekleriz.

Perşembe, Ağustos 29, 2019

FastText ile hızlı metin sınıflandırma - 1

 

 

 Girizgah :

Önce bu konuya nerden girdik ondan bahsetmek istiyorum. Blogda duyuru şeklinde yazmamış olsamda Linkedin hesabımdan beni takip edenler biliyor ki artık bir dökümcü değilim. 2016 yılı Temmuz ayın dan beri Sefamerve.com un ArGe kısmında çalışmaktayız. Bu yılın başından beride bölümümüz ArGe merkezi statüsüne kavuştu. "Bir dökümcü ve bir simitçiyle"  başlayan macera bizi nerelere götürecek ? Kısmetimizde ne tür vavlar çizmek var göreceğiz bakalım...

2017 yılında metin sınıflandırma ile ilgili bir ihtiyacımız oldu. Bu konu daha öncesinda tecrübemizin olmadığı bir alandı.  Hızlıca bu problemi nası çözeriz diye araştırır ken FastText'e ulaştık. Çokda beğendik. O zamanlar sadece komut satırından program olarak çalışan hali yayınlanmıştı. Kullanımını kolaylaştırmak için üzerine çala kalem bir GUI yazdık ve kendi işlerimizde kullandık.

FastText i kullanarak makale çalışmasıda yaptık. Deniz Kılınç hocamızın yayınladığı TTC-3600 veri seti üzerinde bir uygulama yaptık. Bu konuda Deniz hocamızın zaten öncesinde yaptığı çalışmalarda vardı. Makalede ismi geçmiyor olsada emekleri büyüktür, teşekkür ederiz. Bu makaleyi biz Japonyada Tokushima üniversitesinde düzenlenen NLPIR 2019 konferansına yolladık ve kabul aldık. Yakın zamanda da makalemiz  ACM (Association for Computing Machinery) Digital Library altında  yayınlandı.

"An automated new approach in fast text classification (fastText): A case study for Turkish text classification without pre-processing"

FastText:

Uzunca girizgahdan sonra esas konumuza dönüyoruz.  Elimizde pek çok Yapay Öğrenme  - Makine Öğrenmesi - algoritması var. Fakat Bu metodların hepsi sayılar üzerinde çalışıyor. Doğal Dil İşleme üzerinde ki ana problem de burda başlıyor. Metin verisini nasıl sayısallaştırabiliriz ?  Kelime bazlı, harf bazlı yada bunların gurupları -ngram-  şeklinde yaklaşımlar olmuştur.  Kategorik dönüşüm şeklinde ilk akla sistemdir. Kelime sayısının çok büyük olmasıyla devasa vektör uzunluklarıyla sonuçlanabilir.

Sonra Kelime vektörü - word2vec - denen bir kavram çıkmış ortaya.  Her kelime için sabit uzunlukta bir vektör kullanmak. "Birlikte geçen kelimeler anlamca yakındır" var sayımından yola çıkılıyor.  Başlangıçda aynı yapay sinir ağlarındaki gibi kelimeler için rastgele seçilmiş vektör değerleri atanıyor. Devasa derlem - corpus - kullanarak danışmansız şekilde - unsupervised - her kelime için birlikte geçtiği kelimelere göre bu vektörler güncelleniyor. Bu öğrenme sürecinin iki ana şekli var. CBOW ve skipgram 

bu iki yapının şematik gösterimi şöyle




cbow da  hedef kelime vektörüne  o kelimenin etrafında geçen kelimelerin vektörlerinin toplamıyla ulaşılmaya çalışıyor ve bu hedef doğrultusunda vektörler güncelleniyor
skipgramda ise tersine hedef kelimeyle birlikte geçebilecek kelime yada kelime ngramlarına ulaşılmaya çalışıyor ve bu hedef doğrultusunda vektörler güncelleniyor


Bir rivayete göre cbow daha hızlı eğitilir ve  sık geçen kelimeleri daha iyi temsil eden vektörlere ulaşabilir. Skipgram  eğitim veriniz az da olsa iyi çalışır, nadir geçen kelimeleri bile yeterince iyi temsil edebilecek vektörlere ulaşabilir.

Eğitim sonucunda vektör uzayında benzer anlamlara gelen kelimeler yakın yerlerde kümelendiği gibi
kelime vektörleri uzayında yapılan işlemler de anlammı sonuçlar verebilmektedir. Meşhur örnekler


Erkek kelimesinin vektöründen Kral keliimesinin vektörünü çıkarıp Kadın kelimesini ilave edine ulaştığımız vektörel değer Kraliçe kelimesinin vektörel kaşılığına ulaşıyor



yada ülkeler ve başkentleri arasında  böyle bir vektörel ilişki görülebiliyor. 

Kelimelerin bu tür anlamsal bağ  içeren vektörel dönüşümleri elbette doğal dil işleme için elbette çok önemlidir.

Word2vect metodu  2013 yılında googleda  Mikolov un liderlik ettiği bir gurup tarafından yapılmıştır. Sonrasında Mikolov  Facebook a geçmiş ve FastText bir anlamda bu metodun daha gelişkin halidir.
Temel üstünlüğü kelimeleri  harf engramları olarakda görebilmesinden gelmektedir. Halen geliştirilmeye devam edilmektedir. FastText in detayları için aşağıdaki makaleleri incelemenizi tavsiye ederiz.


Epeyde teoriden bahsetmişiz gelelim pratiğe.  FastText in "supervised" kısmıyla çok başarılı Metin sınıflandırma işleri yapabiliyorsunuz.  Hemde küçük harfe dönüştürmek dışında hiç bir ön işlem yapmadan mümkün oluyor. GPU istemiyor. GPU nuz olsa bile RNN bazlı sistemlere göre çok çok çok daha hızlı eğitiliyor.

Bu yazıy burada noktalayalım bir sonraki yazımızda örnek  uygulama yapacağız. Her türlü görüş ve önerilerinizi bekleriz.

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.

Salı, Ekim 10, 2017

Keras ile Duygu Analizi

Bir başka Keras uygulaması ile yine burdayız. Bu uygulamamız, doğal dil işleme ( NLP ) alanında olacak. Metinden duygu analizi  (Sentiment Analysis) üzerine bir çalışma yaptık.

Doğal dil işleme üzerine bir uygulama geliştirmenin ana zorluğu metinin sayılara dönüştürülmesi. Genel olarak kullanılan metodlar.
  • Kelimeler için vektör karşılığı ( WordVect)  hesaplamak ve bu vektörleri bir dizi şekilde vermek.
  • Kelimeleri bir dizi de tutup orda belli büyüklükte vektörlere eğitim esnasında çeviren Embeding katmanını kullanmak 
  • Metinin harf dizisi olarak düşünüp.  Her harfi harf sayısı kadar uzunlukta bir vectörle ifade etmek.
 Metinden duygu analizi çalışmalarında  genellikle verilen metnin olumlu yada olumsuz olduğunun tespiti üzerine çalışılır. Bizim kullandığımız veri seti de Twitlerin olumlu yada olumsuz olması hakkında.

Veri setimiz hakkındaki bilgilere ve verisetinin kendisine burdan ulaşabilirsiniz

thinknook.com/twitter-sentiment-analysis-training-corpus-dataset-2012-09-22/

Veri setimizde toplamda 1578624 adet kayıt var.
Olumlu   :    790184
Olumsuz :    788440
olumlu ve olumsuz nitelikli metinlerin sayılarıda aşğı yukarı eşit.

Biz metinin sayıya çevrilmesi için harf bazlı bir sistem uyguladık. Veri üzerinde herhangi bir filitreleme yapılmadı. Sadece küçük harfe çevrildi. Metinlerde geçen harler çıkarılıp birer sıra no karşılığla bir sözlükte -dict - tutuldu.
{'\t': 0,
 '\n': 1,
 ' ': 2,
 '!': 3,
 '"': 4,
 '#': 5,
 '$': 6,
 '%': 7,
 '&': 8,
 "'": 9,
 '(': 10,
 ')': 11,
 '*': 12,
 '+': 13,
 ',': 14,
 '-': 15,
 '.': 16,
 '/': 17,
 '0': 18,

...
Veri sadece Ağ yapısı olarak LSTM bazlı basit bir sistem kuruldu. LSTM de dizinin tersine sıralamasınıda hesaba katan Bidirectional katmanı ile birlikte kullanıyoruz.

 Layer (type)                 Output Shape              Param # 
===================================
bidirectional_1 (Bidirection (None, 150, 278)          310248  
_________________________________________________
bidirectional_2 (Bidirection (None, 278)               464816  
________________________________________________
dense_1 (Dense)              (None, 2)                 558     
________________________________________________
activation_1 (Activation)    (None, 2)                 0       
====================================

Total params: 775,622
Trainable params: 775,622
Non-trainable params: 0

Veri epey büyük olduğunda eğitim epey uzun sürüyor biz bir kontrol başarısı %85 civarında kesdik.
Çalışmamıza burdan erişebilirsiniz
github.com/birolkuyumcu/ddm_blog_examples/tree/master/sentiment
 Üzerinde çalışılması lazım elbette ama bence bu halide fena değil. Bir örnek verelim
"Got the Macbook Pro seller to send me the serial number of the machine before I paid.
Turns out its just a macbook so not buying it now"
 bu twit için  modelimiz.  0.623167 oranıyla olumsuz diye karar vermiş
aynı twitin başındaki kısmı alıp sorduğumuzda
"Got the Macbook Pro seller to send me the serial number of the machine "

haklı olarak  0.62573 oranıyla olumlu cevap vermiş.

Giriş niteliğinde, harf bazlı, LSTM içerikli bir çözüm. Bir başlangıç noktası olmasını umuyor, görüş ve önerilerinizi bekliyoruz...


Pazar, Haziran 26, 2011

KNIME ve Haber Metinlerinin Sınıflandırılması 2

Uygulamamız, Başlıkdanda anlayacağınız gibi Haber Metinlerinin otomatik sınıflandırılması. Uygulamamız için gereken veriyi Kemik den aldık. Kemik  Yıldız  Teknik Üniversitesinin Doğal Dil İşleme Grubu.  Neden Kemik? sorusunuda "Çünkü dilin kemiği yoktur" diye cevaplıyorlar.

Gurubun yayınladığı veri kümelerinden 75Haber diye geçen veri kümesini kullanacağız Veri kümesi  M.Fatih Amasyalı tarafından hazırlanmış ve bu makalede
 Otomatik Haber Metinleri Sınıflandırma", M.Fatih Amasyalı, Tülay Yıldırım, SIU 2004
kullanılmıştır.

5 farklı haber sınıfına ait 15’şer, toplamda 75 haber içermektedir.
Haber metinlerinin sınıfları:
  1. ekonomi
  2. magazin
  3. sağlık
  4. siyasi
  5. spor 

KNIME ile veri okunup test ve eğitim olarak 2 ye ayrıldı ( 50 eğitim 25 test ) SVM ve Weka-Bayes ile sınıflandırma işlemi yapıldı
İşlemin akış şeması


ve Test verileri için sonuçlar şöyle
Bayes  25 yazıdan 22 sini doğru sınıflandırmış
 SVM  ise 25 yazıdan 13'ünü doğru sınıflandırmış

KNIME ve Haber Metinlerinin Sınıflandırılması 1



Öncelikle KNIME de nedir ki sorusuna cevap verelim
KNIME yani "Konstanz Information Miner" almanyada Konstanz üniversitesinde geliştirilmiş açık kaynak kodlu ve ücretsiz bir programdır. Veri madenciliği , Veri yükleme, işleme, yazma,  görselleştirme işlerinizi gayet kolay yapabilirsiniz.



Başlangıçda İlaç endüstrisi için yazılmış olsa da artık pek çok alanda kullanımı mümkün kılan özellikleri var.  mesela
  • CRM müşteri veri analizi, 
  • iş zekası ve finansal veri analizi
  • Doğal Dil İşleme
  • Görüntü İşleme
gibi. Neyse kafı fazla uzatmıyayım.
www.knime.org
adresinden indirip kurmanızı  ve   sonra, ek özelliklerininde (Extensions) kurulması için menüden
"File ->Install KNIME extensions" ile kurulumu tamamlayıp incelemenizi tavsiye ederiz.
( Weka ve R entegrasyonu , Python ve Perl Scripting, LibSVM gibi pek çok özellik bu şekilde ekleniyor )
Bu kadar laftan sonra bir uygulamada hazırlayalım istedik. Bekleyiniz yakında ....

Cuma, Aralık 04, 2009

Text Generator



ısırmış ve, “Al bak harika!” diyerek uzatmış, küçük oğlana gelmiş. Elindeki ışığı kızın ana-babasına yollamış. Onları karşısında görünce hemen ormana varmışlar. Ormanda bir ülkeye gitmiş. Tavukla horozun parlak ışıklar sızan son gemiden ona acımışlar ve sert geçmiş. Çirkin Ördek, ama prense dönüşmüş. "Korkma, " En altta eşek, köpek eşeğe. " diye düşünmüş Güzel. “Seninle evlenmek zorunda bırakmışlar. Küçük oğlan hemen bir daha fazla bir kucak dolusu güzel bir çocukmuş. Sabah gözlerini açmış sanki. Her yer istemiş. Ak sakallı adam kıza dönerek "burada her rastgeldiği insana, “Bu taraftan gelin,” demiş. Dışarı çıkmış; arpa getirerek tavukla horozun önüne serpmiş. İneğe de öğle yemeğimi büyük ve bir süre sonra her şeyden bol bol var! Haydi merdivenden yukarı çıkmış. Güzel tavukla horozun önüne serpmiş. İneğe de soğukmuş. Şimşekler çakıyor, rüzgâr yerden çıkıp gitmişti... Herhalde dosdoğru yoluna oğul, ben Çirkin Ördek’in tam mı yitireyim?” demiş. "Bir kese altının çalıntı olduğuna karar vermiş, üçünü de dillerde yankılanmış. 
 İlk C# örneğimizi yayınlıyoruz. Bir ilk de örneğin alanı -ucundan kıyıcığından bir örnek sayılır belki - Doğal Dil İşleme ( Natural Language Processing).

Yapılan işlem pek de karmaşık değil.Kendisine verdiğimiz yazıları kelime çiftlerine ayırıp peş peşe gelme sayılarını tutuyor. ve  Yazı üreteceği zaman bir kelimeden diğerine peş peşe gelme sıklığını  kullanarak seçiyor.sonuçtada yukardaki gibi yazılar çıkıyor.Başlangıç verileri için İnternetten bulduğum masalları ekledim.


İndirmek için : TextGen