Doğal dil işleme (NLP) yöntemleri birçok farklı alanda kullanılabiliyor. Metin olan her yerde NLP, bize el yordamıyla tespit etmemizin hayli güç olduğu birçok kapıyı aralıyor. Kavrama pek de aşina değilseniz önce hazırlamış olduğumuz bir diğer yazıyı okumanız faydalı olabilir: Yeni başlayanlar için doğal dil işlemede temel kavramlara hızlı bir bakış
Bu yazıda NLP kapsamında basit bir duygu analizi (sentiment analysis) uygulamasının nasıl gerçekleştirilebileceğini adım adım öğreneceğiz. Çalışmamızı Kaggle’daki “Restaurant Customer Reviews” veriseti ile gerçekleştireceğiz. Veriseti bir restoran hakkındaki 977 müşteri yorumunu içeriyor.
head fonksiyonu ile ilk beş gözleme göz atmamızın ardından info ve shape ile verisetindeki değişkenlerin türlerini ve verisetinin kaç değişken ile kaç gözlemden oluştuğunu tespit ettik. Ardından metin normalleştirme işlemleri kapsamında tüm gözlemlerin küçük harflerle ifade edilmesini sağladık.
Gözlemlerin küçük harflerle ifade edilip edilmediğini teyit etme amacıyla tekrar head ile ilk beş gözlemi inceledik. Ardından verideki noktalama işaretlerinden, önemi olmayan kelimelerden (stop words) ve frekansı düşük olan nadir kelimelerden (rare words) kurtulduk.
Gözlemleri tokenize ederek yorumları küçük parçalara ayırdık. Bu işlemi ise kelimeleri köklerine indirgememize yardımcı olan lemmatization işlemi takip etti.
Görselleştirme işlemlerine belgede geçen tüm terimlerin frekansını hesaplayarak başlayalım. Hangi kelimenin verisetinde kaç kez geçtiğini tespit edelim.
Ardından kelime frekanslarını büyükten küçüğe sıralayarak en çok bahsedilen kelimelerin neler olduğunu görelim.
Veri setinde bir kelime 25 seferden fazla geçiyorsa bunu ek bir incelemeye tabii tutalım ve bar plot ile görselleştirelim.
Kelime frekansına göre görselleştirme işleminin en yaygın uygulamalarından WordCloud’ı gerçekleştirelim. Böylelikle veri setinde en sık geçen kelimeleri basit bir kelime bulutu içerisinde yakalama şansına sahip olabiliriz.
Duygu analizi ile polarite puanı kapsamında her bir yorum için dört skor elde ediyoruz. Bunlar negative, neutral, positive ve compound.
Bu işlem sonucunda compound skoru sıfırdan büyük olan yorumlar olumlu yorumlar olarak değerlendirilebilecek iken sıfırdan küçük olanlar olumsuz yorumları ifade eder.
compound skorunun pozitif veya negatif olması üzerinden yorumun duygu durumunu da olumlu/olumsuz şeklinde etiketleyen bir değişken yaratmak mümkün. Bir diğer yandan veri setinde hali hazırda yer alan liked değişkeninin de bir yorumun olumlu veya olumsuz olmasına göre sınıflandırıldırıldığını Kaggle’da yer alan açıklamalardan görüyoruz. Yani veri setinde zaten yorumlar olumlu/olumsuz olarak ayrılmış, bizse bunu bir NLP uygulamasıyla duygu analizi kapsamında gerçekleştirdik.
Bizim yarattığımız sentiment_label değişkeni ile hazır gelen liked değişkenin ne ölçüde örtüştüklerini anlayabilmek için bir groupby işlemi yapmak mümkün. Bunun neticesinde bizim analizimiz sonucu olumlu olduğu ortaya konan verilerin yüzde 75’inin hali hazırda olumlu (1) olarak işaretlendiğini, bizim olumsuz olduğunu tespit ettiğimiz verilerinde yüzde 78’inin başlangıçta olumsuz (0) olarak düşünüldüğünü görebiliyoruz. Burayla özel olarak bu çalışma kapsamında ilgilenmiyor olsak da bu tarz durumları zaman zaman göz önünde bulundurmak faydalı olabilir.
Devamında ise makine öğrenmesi için bağımlı ve bağımsız değişkenlerimizi belirtiyoruz. Modelimizde restoranımıza gelen yorumu (review değişkeni) değerlendirip binary bir olumlu/olumsuz (sentiment_label değişkeni) tespitinde bulunacağız. Öte yandan metni makine öğrenmesi dünyasına aktarabilmek için onu sayısal olarak ifade etmemiz ve metinde geçen kelimelerin veri setindeki önemini veya bir diğer tabirle ağırlığını tespit edebilmemiz için istatistiksel bir yöntem izlememiz şart. Bu çalışmada TF-IDF yöntemini kullanıyoruz.
Bu noktada birçok farklı makine öğrenmesi modeli oluşturulabilir ve başarı durumları test edilebilir. Bu çalışma için örnek olarak lojistik regresyon modeli ile rastgele orman (random forest) modellerini oluşturuyoruz. Nihayetinde amacın ne olacağını hatırlatalım: Restoranımıza gelecek, veri setinde bulunmayan bir yorumun olumlu/olumsuz olduğunu belirli bir hata payıyla tespit edebilecek bir makine öğrenmesi modeli.
Başarı testi için veri setinden rastgele bir yorum seçip duygu analizi sonucunu görmek de bize modelin başarısı hakkında belirli bir içgörü sunabilir.
Çapraz doğrulama (cross validation) skoru itibariyle rastgele ağaç modelinin lojistik regresyon modeline kıyasla bu çalışmada daha başarılı olduğu anlaşılıyor. Her makine öğrenmesi modeli kurulumunda olduğu gibi burada da son bir hamlenin gerekliliği gözler önünde: Hiperparametre optimizasyonu.
Sonuç
Netice itibariyle belirli bir başarı oranına sahip, bir metin üzerinden duygu durumu tahmini yapabilen bir makine öğrenmesi modeli geliştirdik. Bu model elbette kusursuz değil. Farklı metin işleme yöntemleri ve makine öğrenmesi modelleriyle geliştirilebilecek bir yapı ile karşı karşıyayız. Eğer konuyla ilgiliyseniz Miuul’un doğal dil işleme ve makine öğrenmesi üzerine sunduğu eğitimlerden yararlanabilir, konuyu bu alanda deneyimli veri bilimcilerden öğrenebilirsiniz.