Perşembe, Ekim 26, 2017

Levent Ali Keten 'nin hatırasına....

Levent ile tanışıklığımız 2009 yılına dayanıyor. Her şey aşağıdaki ilk e-posta ile başladı



Merhabalar, 

...

Sizin de bir yazınızda belirttiğiniz gibi yazılım, içimde hep ukte kalan birşeydi. 1990 yılında üniversiteyi kazanınca yazılımı bıraktım. Üç yıl öncesine kadar da yeniden elime almadım. Yazılıma Commodore 64 le, basicle başladım. Sonraları cobol, ne yazdığımı hatırlayamayacak kadar C. Orta okul dönemim elektronik sevdasıyla geçti. Evde bozmadığım birşey kaldı mı hatırlamıyorum. Ama bir sürü de şey yapmıştım. Sanat okulunu 2.likle kazandığım halde 1. ye bölüm değiştirme hakkı tanıdılar bense tercih sebebiyle Tesviye bölümünde okudum. Sonra onu çok sevdim. Makinalar, çalışmaları hep merakımdı çünkü. Çok iyi bir tesviye eğitimi aldım. Ancak üniversitede matematik eksikliğim yüzünden Turizm Eğitimi bölümünü kazandım. Kısacası devletin bana eğitimim için yaptığı tüm yatırımlar boşa gitti. Elektronik okuyamadığım için tornacı, mühendis olamadığım için turizmci, turizmi sevmediğim için de bilgisayarcı olmuştum. Ama yazılım hep ukte kalmıştı içimde. 

Bu hayatta neyi istediysem Allah'tan hepsinin sahibi oldum. Söke söke aldım hayattan her istediğimi. Uzunca bir bilgisayar satıcılığından sonra, sektörün artık tekel büfeleriyle yarıştığı dönemde kapadım işyerimi. Ankara'ya gidip 6 ay boyunca yazılım kursu aldım. Dot.Net. İyi bir yazılımcıyım. İyi bir algoritma mantığım var. Eğitimden sonra birkaç yazılım yapıp sattım. Fizik tedavi merkezlerine. Ancak sağlık bakanlığı 1 yıl içinde öyle kararnameler çıkardı ki, yazdığım tüm yazılımı iki kez yazmak zorunda kaldım. Sonra kararnamelere yetişemeyince, sağlık alanını bıraktım. Çünkü ekip kurmaya ne maddi gücüm yetiyordu, ne de bu ülkede ortak iş mantığı gelişmişti. Sonra iki yıl Eskişehir'de kaldım. Birkaç firmaya birkaç yazılımdan sonra doğduğum yere, Mersin'e geri döndüm. Burada da aklımdaki projeleri hayata geçirebilmek için, hayatımı idame ettirebilecek bir ek gelir adına web tasarımları yaptım. En son 5 ay önce  Mersin Büyükşehir Otogar'ına otomasyon sistemi yazma işini almam, sizinle tanışmaya kadar getirdi işleri.

Muhasebe otomasyonunu yazdıktan sonra, benden kapı girişlerinde plaka tanıma sistemi olmasını istediler. Herkesin belirli alanlarda uzmanlaşmasını her zaman benimsemişimdir. Bu yüzden bu komponenti yazan bir firmadan alıp kullanmak istedim. İşte herşey ondan sonra başladı. Bu komponenti yazan firmalar, ya komple sistemi satıyorlardı, ya da 5 bin euro istiyorlardı. Ne yalan söyleyim, bu güne kadar 5.000 euroluk bir yazılım işim olmadı. Hele ki Anadolu'da bu fiyat!

En son görüştüğüm bir İstanbul Teknopark firmasına, yaptıklarının yanlış olduğunu, bu komponentin binlerce kullanım alanı olduğunu, bu fiyata sattıkları sürece bu alanlarda bunların kullanılamayacağını, bunun aynı zamanda binlerce istihdamı önlediğine varana kadar konuşmalarım boşunaydı ve en son dalga geçer gibi, bu komponenti 4 yılda bilmem kaç mühendisle, profla yazdıklarını, bunun öyle benim yazdığım yazılıma benzemeyeceğini küçümser bir tavırla söylediklerinde, bende "e bizde oturur kendimiz yazarız" dedim ve hiç alanım olmayan görüntü işlemeye dalmış oldum böylece.

3 aydır kısıtlı kaynaklarla geldiğim aşama plaka karakterlerini temizlenmiş olarak çıkartmak oldu. Bu aşama içerisinde oldukça başarılı sonuçlar elde edebildim. Ancak bu aşamadan sonra OCR işleminde YSA kullanıldığını öğrendim. Elimdeki kaynak miktarı sanırsam bir 200 Mb civarında. Onlarca tez, döküman, internet sayfası vs. Ama  üzülerek söyleyim ki bir çoğu kopyala yapıştır arasına birşeyler sıkıştır yazılmış. 

YSA'yı anlayamadığım için onunla ilgili her hangi bir algoritma ve  kodda türetemiyordum. Taaki sizin sitenizle karşılaşana kadar. Aslında algoritma olarak sizin sitenizden çok yararlandığım söylenemez. Ama YSA'nın ne olduğunu sizin siteniz sayesine öğrendim. Sitenizde ilgimi çeken bu alanla ilgili okumadığım bölümünüz yok. Elleriniz dert görmesin. Ancak ben 38 yaşından sonra yeniden yazılıma döndüm. Teknik olarak okuduğumu eksikleri tamamlama yöntemiyle anladığım bir ingilizcem ve kod olarakda VB.Net. 
Yazdıklarından da anlacağınız üzere, Kendisi benim yaşlarda çekirdekten yetişme, şevkli bir yazılımcıydı.  Hoş sohbetti. Bizimde ysa konusundaki yardımımızla,  o yıllarda bir plaka okuma yazılımı geliştirmeyi başardı. Vefakardı işi bitince bizi unutmadı, sonrasında da irtibatımız devam etti. Gerek online gerekse ankaraya gelikçe yüz yüze görüşmelerle muhabbetimiz devam etti. Çok girişken bir kişiliği vardı. Ben yıllarca dökmeye devam ederken o maceradan maceraya atıldı. Çok değişik alanlarda değişik yazılımlarla uğraşdı. Mesela Damda topraksız tarım işine girişti. Kendi elleriyle imal etti



otomasyonu için devreler kurdu programlar yazdı.

Firmasını  Mersin teknoparka'a taşıdı orada çalışmaya devam ediyordu.
 Keten Yazılım
En son temmuz ayında yazışmamızda
"akciğerde bir kitle tespit ettilerne olduğuna karar veremediler yarın bir docent muayne edecek"
diyerek sağlık problemlerinden bahsetmişti.  Bir kaç kez telefonla ulaşmaya çalıştıysamda, sonrasında görüşmemiz malesef mümkün olmadı.  Şimdide Geçen hafta cuma günü vefat ettiği haberi geldi.
Ben bir dostumu, ülkmizde çilekeş bir yazılımcısını kaybetti çok üzgünüz. Kendisine Allahdan Rahmet. Başta kızı olmak üzere yakınlarına başsağlığı ve sabır diliyoruz...

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, Ekim 01, 2017

Pooling Terimi hakkında...

Terimlerin dili bizim gibi üreten değilde takip eden topluluklar için  bir mesle olmuştur.  Bilimi , teknolojiyi geliştirenler , terimleride belirlemektedirler. Bizde ise genelliklede terimler olduğu gibi yada küçük değişikliklerle kullanıma giriyor.

Asla böyle bir şey olmamalı anlayışında değilim. Nitekim  teknoloji gibi yabancı tabir yaygın olarak kullanılmaktadır. Sonuçta kelimeler iletişim için kullanılır. Terimin ifade ettiği şeyi bilen insanlar için  kelimenin kendisinin pek bir önemi kalmamaktadır.  Eğer bir terim yeterince yaygınlaşmışsa onun kullanılması gerektiğini düşünüyorum. İlla Türkçeleştireceğim anlayışının çoğu zaman dilde fakirleşmeye sebep olacağını. Hatta asıl fonkisyonu olan iletişimi sekteye uğratacağını düşünüyorum. Mesela ; Teknik kitapların, yaygınlaşmış terimleri bilmeyen birisi tarafından tercüme edilmesiyle anlaşılmaz bir metne dönüştüğünü muhtemelen görmüşsünüzdür.
 
Yaygınlaşmamış bir terimin,  zamanında ve doğru bir şekilde türkçe karşılığının bulunmasının çok önemli olduğunu düşünüyorum.  Terimi ilk defa duyan bir insan o yabancı tabirin ifade ettiği şeyi öğrenir. Kelime sadece o kavramın bir etiketidir.  Türkçe karşılığın önemi burdan geliyor. Düzgün bir karşılık , türkçede ifade ettikkleri sebebiyle konuyu bilmeyen birisinede kavram hakkında bir şeyler anlatır. Bir önek vereyim "bisiklet" kelimesi bisikleti bilmeyen birisi için bir şey ifade etmez. Yabancı dildeki karşılığı bicycle - iki çember -   ile kaffasında hiç bilmeyene bile bir şeyler çağrıştırır.

Yaygınlaşmamış terimlerin türkçeleştirilmesinde yapılan bir hatada da kelime bazlı tercümeye kapılmaktan geliyor. Hatta bu yanlış, bilen insanları anlamsız karşılık yada orjinali arasında bırakıyor. Belkide pekçoğu orjinalini tercih etmek zorunda kalıyor.

Yapılması gereken ne peki derseniz. Benim görüşüm şu şekildedir. Tercüme yapanlar bilir bir kelimenin birden fazla anlamı vardır. Her anlamı bir birini karşılamaz.
Doğru tercüme kavramı Türkçeye çevirmekden geçer.

Yapılan hatayı Derin öğrenme litaratüründeki  "Pooling" tabirine bulunan "Havuzlama"  karşılığı ile açıklayayım.

Gerçekte Pooling terimi neyi ifade eder.




Tercüme mantığı ne peki 
pool =  havuz 
pooling  = havuzlama
Önce çıkarımın yanlışlığına bakalım. Pool ne demek

Oxford Sözlüğünden bakıyoruz. link

iki ana anlamı olduğundan bahsediliyor ilk anlamı

1 ) pool  :  A small area of still water, typically one formed naturally.

Biz fiil olarak kullanığımızdan , fiil hali neymiş diye bakalım .

1 ) pool  Verb :  (of liquid) form a pool on the ground or another surface.

yani havuz yapmak anlamına geliyor. Pooling teriminin derin öğrenmedeki anlamını düşünürseniz. Bu anlamın bu kavramla alakasının olmadığını anlayabilirsiniz.

İkinci anlamına gelelim
2)  pool :  A shared supply of vehicles or resources to be drawn on when needed.
fiil hali
2) pool verb - with object  :   of two or more people or organizations) put (money or other assets) into a common fund.
bu anlamı bizim kavrama daha uygun gibi.

oxford sözlüğü direk pooling için ayrı bir anlam vermemiş. Cambridge sözlüğünde şöyle bir karşılık var
pooling : the act of sharing or combining two or more things

bu anlam aslında kavramın ifade ettiği şeyi hissettiriyor. Birden fazla şeylerin bir araya getirilip paylaşılması.

Gelelim  Türkçe tarafına ;

TDK sözlüğünden havuzun manasına bakalım peki
havuz
isim Arapça ḥavż
1. isim Su biriktirme, yüzme, çevreyi güzelleştirme vb. amaçlarla altı ve yanları mermer, beton benzeri şeylerden yapılarak içine su doldurulan, genellikle üstü açık yer
"Ben havuzu seyrederken o giysileriyle içine dalardı." - R. Mağden
2. Kum, asit vb. konulan çukur yer
"Kum havuzu."
3. denizcilik Büyük gemilerin onarılmak için çekildikleri yer
4. Bir amaç güdülerek farklı kaynaklardan gelen paranın ilgililere daha sonra paylaştırılmak üzere toplandığı belirli bir yer

Bu dört anlamdan olsa olsa sonuncusuyla bir nebze zoraki bir bağdaştırma yapabilirbiliriz. Ama bir başka problem daha var "Havuzlama" fiil olarak zaten TDK sözlüğünde mevcut.  Denizcilikte 3. anlamı için kullanılıyor. 
havuzlamak : Gemiyi onarmak için havuza çekmek
Zoraki bağdaştırma ancak kavramı bilen için bir anlam ifade eder. Doğrusu bulunan karşılığın Kavramı bilmeyen için kavram hakkında ip uçları verebilmesidir.

Sonuç olarak ;  havuzlamayı pooling karşılığı olarak kullanmayı doğru bulmuyorum. Ne saçma türkçe karşılıları savunmak nede olduğu gibi bırakmak doğru değil. Benim tercihim ya doğrudan pooling diyorum yada ebat küçültme yada  örneklem tabirini kullanıyorum.