Kadın mı Erkek mi?

Taner Sayın
6 min readJun 9, 2021

--

M erhabalar atılan tweet kim tarafından atılmış kadın mı erkek mi bunu tahmin etmeye çalışacağız.

Öncelikle kütüphanelerimiz import edelim;

Daha sonra data setimizi dahil edip verimizi yazdıralım.

JupyterLab’da verilerin belirli bir kısmını görebiliyoruz dilerseniz print(data) ile daha detaylı bakabilirsiniz. Veri setimizdeki bulunan toplam satır ve sütünlara bakacak olursak;

26 sütun 20050 satır bulunmakta

Bizim çalışacağımız gözlem sayısı 2 olacak bunlardan biri gender diğeri ise description yani kişilerin attıkları tweetler olacak. Veri setinden bu iki gözlemi alıp farklı bir tabloda tutalım;

Bu halde iken veri setinde boş olan kısımları atıp daha sonrasında atılan verilerin indekslerinin yeniden tanımlanmasını yapalım;

Elimizdeki verilerde female(kadın) male(erkek) olarak bulunmakta aralarındaki farkı sayısal olarak belirtmemiz gerek bunu için female ise 1 male ise de 0 yapalım ve sonrasında veri setimizin ilk 5 elemanını gözlemleyelim;

Elimizdeki etiketleri ve yorumları ayırıp liste içine alalım bu işlemleri daha sonrasında kolaylık olması için kullanıyoruz. Cinsiyetleri yani etiketleri target adında bir değişken liste biçiminde tutsun, tweetleri de data adında değişken ile saklayalım;

Temel işlemlerimiz yaptıktan sonra artık verilerimizle işlemler yapabiliriz. Stop wordlerin tweetlerden arındırılmasıyla başlayabiliriz. Stop words arama motorları üzerinde yapılacak sorgular sonucunda kullanıcıya sonucu daha hızlı gösterebilmek için yok sayılan kelimelerdir. Bunları hem kullanacağımız diğer kütüphaneleri dahil ederek hem de nltk kütüphanesi yardımıyla stop wordsleri görebiliriz;

Bu kelimeler kullanmak istemediğimiz, tweetlerden arındırmak istediğimiz kelimeler. Daha önceden data içinde tuttuğumuz verileri for döngüsü yardımıyla gereksiz ifadelerden, büyük harflerden ve stop wordlerden arındırarak yeni bir listede tutalım;

Şimdi daha önceden arındırılmamış data değişkenindeki ilk değişken ile arındırılmış veri setindeki ilk elemanlara bakalım;

Daha önce yazdırdığımız stop wordlerin içindeki ‘i’, ’my’ ve ‘own’ kelimeleri silindi ve bunu tüm veri setine yazdığımız for döngüsü ile oluşturduk.

Verilerimizi arındırdıktan sonra test ve eğitim kısmına geçebiliriz. Verilerin %80 eğitim %20 test verileri olacak. Önce verilerin %80 ne kadar ettiğini hesaplayacağız ve ona göre verileri ayrılım;

Eğitim setindeki verilerin %80'i yani 12.979 adeti eğitim, diğer kısmı ise test olarak ayırdık.

Elimizdeki verileri yorumları artık tokenleştirebiliriz. Tokenleştirme bir paragrafın cümlelere, cümlelerin, kelimelere bölünmesi işlemidir. Bu bölünmeyi yaparken veri setinde en çok kullanılmış 10.000 kelimeyi alalım

çıktısını elde edeceğiz. Her bir ayrılmış kelimeyi sayısal değere dönüştürmemiz gerek yani her bir kelimeye vektör atamasını yapalım ve bir önceki hali ile yeni hali arasındaki farkı görmek için birlikte yazdıralım;

Cümle bir yazı biçimindeyken artık sayısal değer alarak vektör haline dönüştürülmüş oldu.

Tabi ki her cümlenin uzunluğuna göre farkı uzunlukta vektörler olacak.

Eğitim veri seti için yaptıklarımızı test veri setine de uyguluyoruz;

Token işlemleri bittikten sonra yorumlara birde padding ekleyeceğiz. RNN ile oluşturduğumuz modellere belirli boyutta inputlar veriyoruz, sinir ağlarında bu genelde böyledir. Hep belirli boyutlarda verilerle çalışır. Veri setimizdeki tweetlerde hepsi farklı sayılarda kelimelerden oluşuyor. Farklı sayılarda kelimeleri RNN’e input olarak veremeyiz. Bu yüzden tüm tweetleri aynı boyuta getirmemiz gerekir. Bunu yapmanın etkili bir yolu var; kendimiz belirli bir boyut belirleyeceğiz ve eğer bir tweet bu boyuttan düşük boyutluysa eksik kalan yerlere 0 ekleyeceğiz. Eğer belirlediğimiz boyuttan büyükse de yorumun bir kısmını silip belirlediğimiz boyuta getireceğiz;

Buradaki bilgiler ile en uzun tweeti yazdırabiliriz;

Networke verilerin verilerin belli bir boyutta olması gerektiğini daha önceden belirtmiştik. Tüm yorumların boyutunu eşitlemek için padding kullanıyoruz. Bu boyutu belirlerken kafamıza göre bir sayı belirleyebiliriz, tüm yorumların boyutunu en fazla token bulunan yoruma eşitleyebiliriz veya ortalama kullanabiliriz. Daha da iyisi hafızayı yormayacak, biraz matematik kullanarak verilerin çoğunu kapsayacak bir sayı belirleyelim. Bu sayı sayesinde çok fazla kelimeyi yorumlarda çıkarmayacağız. Kısa cümlelere de çok fazla padding eklenemeyecek;

yazdığımız bu matematiksel işlem sonucunda her bir tweet Network’e 18 tokenli vektör olarak verilecek. Eğer bir tweet 18 den büyükse vektör silinecek, eğer 18'den küçükse de 0 ile vektör 18 boyutuna tamamlanacak.

Yorumların %96'sında 18 taneden az token bulunuyor. Yorumların %96'sına 0 ekleyerek token sayısını 18'e çıkaracağız. Sadece %4'lük kısımdan veri kaybımız olacak. Bunu da şu kod ile bulduk;

Elimizdeki eğitim ve test verilerine padding ekleyip boyutlarına bakalım;

Daha önceden ayırdığımız eğitim ve test veri setleri %80 %20 olarak ayrıldı ve aynı zamanda aynı boyuta indirgenmiş oldu. Bir örnek görmek istersek;

formatında bulunmakta. Aynı iki tweetin padding uygulanmış haline ve birde padding uygulanmamış halini karşılaştıralım. Örnek olması açısından elimizdeki 80. tweeti alalım;

Padding eklenmeden önceki uzunluğu 12 iken padding eklendikten sonra tüm tweetlerin boyutu 18 oldu.

Keras içinde stringi verip tokenleri görebiliyoruz ancak tokenleri verip stringi göremiyoruz bunun için bir fonksiyon yazıp tekrardan string hale döndürmemiz gerekecek. word_index içinde sözlük olarak kelimeler ve kelimelerin sayısal olarak tokenleri bulunuyor. Biz bu sözlüğü tersine çevireceğiz. Sayılar anahtarımız kelimeler ise değerlerimiz olacak;

Bunu text haline getirmek için fonksiyonumuzu yazalım;

Tümüne bir arada bakalım;

Böylelikle yazdığımız fonksiyon sayesinde tekrardan tokenleri text haline çevirebildik.

Önce embedding matrisi oluşturup 3 katlı Gru ile eğitim yapacağız. Gru sonunda tek bir nöron olacak ve bu nöronun ürettiği değer 1'e yakınsa kadın, 0' a yakın ise erkek olacak.

Öncelikle ardaşık bir model oluşturacağız. Sonrasında modelimizde olmasını istediğimiz her şeyi bu modele katman katman ekleyeceğiz. Her kelimeye karşılık gelen 50 uzunluğunda bir vektör oluşturalım bu sayıyı istediğiniz gibi ayarlayabilirsiniz;

Boyutlar belirlendiğine göre artık kerasta embedding layer oluşturabiliriz. Kelime vektörleri word2vec veya başka yöntemle oluşturulabilir fakat biz rastgele oluşturacağız. Vektörler rasgele oluşturulması bir problem teşkil etmiyor böyle bile daha iyi sonuçlar çıkabiliyor. Hatta modeli eğitirken kelime vektörlerini de eğiteceğiz;

Örneğin “secret get ahead get star” şeklinde bir örnek tweet alalım. 10.000 kelime içerisinden bu cümle içerisindeki kelimelere karşılık gelen vektörleri alacağız. Yani “secret”,”get”,”ahead”,”star” vektörlerini alıp bir sonraki layera input olarak vereceğiz. Bu layer sadece gelen inputların vektörlerini output olarak veriyor. Embedding layerin outuputu bir sonraki layerin inputu olacak;

Diğer gerekli tüm kütüphanelerimiz de dahil edip gerekli işlemleri yazalım;

Modelimizin değerlerini özet şeklinde bakalım;

Modelimizi fit edelim;

modeli fit ederken dikkat edersek loss değerimiz gittikçe azalırken accuracy yani başarı oranımız artmakta. Modelimizin tahminlerine bakmak için ilk 2 tweeti JK Rowling’den diğer iki tweeti Elon Musk’tan örnek verelim;

Bunun gibi örnekleri arttırıp, değiştirip farklı sonuçlar alınabilir. Vaktinizi ayırdığınız için teşekkürler.

--

--

No responses yet