04.10. Python ile Metin Sınıflandırması Örneği

Bu yazımda öğrencilerimin sıklıkla sorduğu metin sınıflandırması (text classification) konusunda basit bir kod yazıp hangi bölümlere bakmaları gerektiği hakkında bilgi vermeye çalışacağım. Benimde fazla kullanmadığım Python Scikit-Learn kütüphanesini kullanacağız. Metin sınıflandırması nedir ile başlayalım.

Metin sınıflandırma metin madenciliğinin konularından biridir. Metin madenciliği metinler üzerinden bilgi çıkarımı yapmayı amaçlar. Metin sınıflandırmada ise sınıflandırma metotları kullanarak bir bilgi çıkarımı yapılır. Sınıflandırma işlemi için bir eğitim verisi gerekir. Bu eğitim verisinden elde edilen model üzerinden yeni gelen metinlerin tahmini yapılabilir. Örneğin, sinema yorumlarını topladık ve olumsuz/olumlu yorumları işaretledik. Bu veri bizim eğitim veri setimiz oluyor.

Veri setinin hazırlanması

Bu örneğimizde 10 cümleyi amazon Türkiye üzerinden topladım ve olumsuz(0)/olumlu(1) olarak bir CSV (comma-separated values – literatürde sıklıkla kullanılır) dosya şeklinde kaydettik. Örnek eğitim verimiz:

ornek_dataset.txt olarak kodu yazacağımız klasöre kaydettik. Şimdi, sıra bu dosyayı okutup Python tarafına taşımaya geldi. Bu noktada, CSV dosya okutmak için pandas kütüphanesi duymuştum. İlk okumada hata aldım, ancak aşağıdaki kod ile okumayı başardım. (UTF-8 ile ilgili bir hata mesajı verdi)

data görüntüsü (print(data)) görüntüsü aşağıdaki gibidir.

“…” bu metnin devamı var anlamına geliyor. Python’ın sevdiğim bir özelliği, matrisleri de böyle küçültüyor. Şimdiki amacım cümleler ile sonucu birbirinden ayırmak. Bunun için iloc komutu ve “:” operatörü ile gerekli kolonları bir listeye aktarıyorum. iloc tamsayı tabanlı pozisyon üzerinden verileri elde etmek için uygun bir metot, “:” içinde Python Liste konusuna bakabilirsiniz.

,0 ile cümleleri ve ,1 ile metinleri alıp for döngüsü ile dolaşıp, dönen sonuçlardan bir liste oluşturduk.

Cümleleri vektöre çevirme

Ne yazık ki, cümlelerin bilgisayar için bir anlamı yoktur. Bu verileri sayısal bir değere çevirmeliyiz, anca sayısal veriler üzerine sınıflandırma metotlarını kullanabileceğimizi unutmamalıyız. Vektörümüz: kelimelerden ve bu kelimenin cümlede olup olmadığını gösteren bir sayısal değerden oluşabilir.

Ürünü, kargo, teslim gibi kelimeler ilk cümlede var iken diğer cümlede yok. Diğer tüm kelimelerde sistemde olacak. Tahmin edebileceğiniz şekilde büyük bir matrisimiz oldu. Bu matris sınıflama metotlarında artık kullanılabilir. Ancak günümüzde 1 ve 0 yerine tf, tf-idf gibi daha fazla anlam içeren sayısal değerler kullanılıyor. Scikit kütüphanesi TfidfVectorizer sayesinde bu işlemi çok kolay şekilde yapıyoruz. (tf-dif için bu blog yazıma bakabilirsiniz. Diğer taraftan internette birçok bilgi var. )

TfidfVectorizer sınıfından bir nesne oluşturuyoruz. (Diğer metinden vektör oluşturma yöntemleri için tıklayın.) TfidfVectorizer sınıfının birçok parametresi var. Biz kelimeler üzerinde çalıştığımız için analyzer=’word’ ve tüm harfleri lowercase = True ile küçük harfe çevirdik. Bu metni işleme aşamasında birçok ek işlem yapılabilir. Örneğin kelimelerin köklerini bulma (stemming), bazı kelimeleri matristen çıkarma (stopwords) gibi temel işlemler kullanılabilir. Burada bir uyarım olacak, “bu ürünü beğendim” ve “bu ürünü beğenmedim”  iki cümlemiz olsun. Türkçe stemming uygularsanırsa, beğen kökü her iki kelime içinde (beğendim / beğenmedim) kullanılmış olur. “beğenmedim” kelimesi içindeki “me” nin anlamını kaybedeceğinizi unutmayın. Şimdi, vektörümüzü elimizdeki matrise uygun hale getiriyoruz.

Burada, fit_transform fonksiyonu ile tüm cümlelerdeki kelimeleri içeren ve tf-idf değerlerini içeren büyük bir dizi oluştu. Oluşan diziyi matrise dönüştürmek için toarray() fonksiyonu kullanılır.

Çıktının bir kısmı:

Şimdi elimizde sınıflama metotları için uygun bir veri oluştu. Ben bu bölümde bilinen bir sınıflama metodunu kullanmaya karar verdim: Naive Bayes.

Naive Bayes sınıflama metodu ile model oluşturma 

GaussianNB sınıfından bir nesne oluşturup yukarıdaki verileri ve verilerin çıktısı (olumlu-1, olumsuz-0) değerleri içeren classification_training parametrelerini içeren fit fonksiyonu ile modelimizi oluşturduk. Bu modeli kaydedip, ihtiyacımınız olduğunda yukarıdaki işlemlere gerek kalmadan direkt kullanabilirsiniz. Artık modelimiz hazır. Yeni gelen cümleyi bu modele göre değerlendireceğiz.

Tahmin yapalım

Şimdi bir örnek cümle gönderip soralım, bakalım sistem ne diyecek:

Buradaki ekran çıktısı “0” yani cümle “olumsuz”muş. Bir de olumlu cümle yazalım.

Sonuç “1”…

Basit bir model oluşturduk ve onun üzerinden tahmin yapabiliyoruz. Ancak 10 cümle ile eğitildiğimizi unutmayalım. 10 cümle içinde geçen kelimeleri kullandığımız için sistemimiz güzel cevaplar verdi ama bilinmeyen kelimeler ve zor cümleleri her zaman işimizi zorlaştırılır. Ayrıca, Türkçe yazarken İngilizce kelimeleri kullanmakta işin diğer bir zorluğudur. Hocam, “ben bir kelime havuzu yaparım ve gelen cümlede olup olmamasına bakarak sınıflama metotlarını kullanmadan bu işi çözebilirim” diyebilirsiniz. Ama unutmayın, unuttuğunuz her kelime size olumsuzluk olarak döner, ayrıca kelimelere ağırlık vermeniz zor bir süreçtir. Sınıflama metotları aslında bu sorunlar için bir çözüm sunuyor. Ama az bir eğitim verisi ile de iyi sonuçlara ulaşmanın zor olduğunu unutmayın. Konuya bir merhaba dedik, gerisi sizden…

Bol kodlu günler…

Tüm kodlar, jpyter