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