Doğal Dil İşleme Serisi 2: Naïve Bayes ile Duygu Analizi

Yusuf ANI
novaresearchlab
Published in
7 min readSep 4, 2020

Merhabalar, yazı serimizde Deep Learning AI ekibinin “ Natural Language Processing with Classification and Vector Spaces” adlı NLP kursunun geniş özetini bulacaksınız. 4 haftadan oluşan bu kursun ana başlıkları şu şekilde:

1- Sentiment Analysis with Logistic Regression — Lojistik Regresyon ile Duygu Analizi

2- Sentiment Analysis with Naïve Bayes — Naïve Bayes ile Duygu Analizi

3- Vector Space Models — Vektör Uzayı Modelleri

4- Machine Translation — Makine Çevirisi (Giriş Seviyesi)

Bu yazıda kursun ikinci bölümü olan Naïve Bayes ile Duygu Analizi konusunu özetledik. Yazımızın sonunda Github kodlarını bulabileceksiniz. Ayrıca diğer yazılara profillerimizden ulaşabilirsiniz. Keyifli okumalar :)

Naive Bayes Algoritmasını öğrenmeye geçmeden önce Bayes Teoremi ve olasılık hakkındaki bilgilerimizi gözden geçirmemizde fayda var. Eğer konu hakkında yeterli bilginiz olduğunu düşünüyorsanız Naive Bayes bölümüne geçmenizi tavsiye ederim.

Bayes teoremi, olasılık kuramı içinde incelenen önemli bir konudur. Bu teorem bir rastsal değişken için olasılık dağılımı içinde koşullu olasılıklar ile marjinal olasılıklar arasındaki ilişkiyi gösterir. Kaynak: Wikipedia

Eğer sizin de tanımdan anladığınız tek şey olasılık ile ilgili olduğuysa konuyu biraz daha matematiksel olarak ifade edip anlaşılır kılalım.

Diyelim ki elinizde cümlelerin pozitif anlamlı veya negatif anlamlı olarak etiketlendiği tweetlerden oluşmuş bir derlem (corpus : Metin halindeki düzenli veri kümesi olarak düşünebilirsiniz) var.

Şekil-1

Pozitif olarak etiketlenmiş bir cümlede geçen kelime negative olarak etiketlenmiş bir cümlede de geçebiliyor. Örneğin “happy” (Mutlu) kelimesi için:

Bugün çok mutluyum. -> Pozitif

Mutluymuşum gibi davransam da berbat hissediyorum. -> Negatif

örnekleri verilebilir. Bu duruma olasılıksal açıdan yaklaşalım.

Şekil-2

Diyelim ki A bir tweetin pozitif olarak işaretlenmesini göstersin. Yukarıdaki örnekte 13 yeşil kutu (pozitif) ve 7 turuncu kutu (negatif) olduğunu biliyorsak A olayının gerçekleşme olasılığını P(A) = 0.65 ile gösterebiliriz. Tersi durumda da 0.35 olasılığımız var.

Şekil-3

Şimdi de B bir tweetin içinde “happy” kelimesini içermesini göstersin. Kısaca 4 adet “happy” kelimesini içeren tweet olduğu için P(B) = 0.2 diyebiliriz.

Bir tweetin pozitif olarak etiketlenmesi ve aynı zamanda “happy” kelimesini içermesi olasılığı, sadece kesişim alanının tüm derlem alanına oranıdır.

Şekil-4

Eğer cümlede “happy” kelimesinin geçtiğini biliyorsak bu tweetin pozitif olma olasılığını nasıl ifade edebiliriz? Aslında yukarıdaki diyagramda mavi çembere baksak bu soruyu cevaplandırmış oluruz. Bunun matematik dünyasındaki karşılığı da aşağıdaki gibidir.

Şekil-5

Benzer şekilde yeşil çembere yani elimizde 13 tane pozitif tweet varken içinde “happy” kelimesinin geçtiği cümleleri arıyorsak aşağıdaki gibi bir gösterim yapabiliriz.

Şekil -6

Buraya kadar çok güzel şekilde kutucukları saydık ve dedik ki pozitif olduğunu bildiğim 13 kutum vardı. 3 kutumda “happy” kelimesi geçiyor bölerim sonucu bulurum dedik. İyi güzel de biz bunu bilgisayara veya matematik bilimine nasıl anlatacağız? Bizim fark etmeden uyguladığımız koşullu olasılık formülü nedir?

Alın size cevap:

Şekil-7 Dikkat Bayes Teoremi hakkında spoiler içerir.

Kısaca üstteki formülü cümlelere dökersek benim elimde tweetler var. Ben bu tweetler arasında “happy” kelimesi geçenlerden kaç tanesi pozitif olarak etiketlendiğini bulmak istiyorum. Bunun için yapmam gereken hem pozitif hem de “happy” kelimesi geçme olasılığını “happy” kelimesi geçme olasılığını bölmek.

Bayes kuralını türetmek için gerekli olasılık bilgilerini tekrarladığımızı düşünüyorum. Şimdi asıl amacımıza geçelim. Formül aşağıda açık bir şekilde gösteriliyor ve aslında biz bunu yazımızda çoktan kanıtlamıştık. Nasıl mı?

Şekil-8 Bayes Teoremi

Yukarıda Şekil 7'deki formülü hatırlayalım. Formülde paydaları karşı tarafa atalım.

Şekil-9

Olasılıksal olarak bir tweetin pozitif olması ve “happy” kelimesini içermesi ile “happy” kelimesini içermesi ve pozitif olmasının aynı anlamlara geldiğini bildiğimize göre aşağıdaki denklemi elde ederiz.

Elde ettiğimiz denklemde “happy” kelimesini içerme olasılığını karşı tarafa attığımızda Bayes teoremini türetmiş oluyoruz.

NAIVE BAYES

Naive Bayes, denetimli (Supervised) makine öğrenmesinin bir örneğidir ve önceki yazımızda kullandığımız lojistik regresyon yöntemiyle birçok benzerliği paylaşır.

Naive kelime olarak “saf” anlamına gelmektedir. Naive denilmesinin temel sebebi bu yöntemin sınıflandırma için kullandığınız özelliklerin bağımsız olduğunu varsaymasıdır. Ne demek istediğimizi örnekler üzerinden anlatayım.

Şekil-10

Elimizde yine pozitif ve negatif cümlelerden oluşmuş tweetler olsun. Amacımız bu cümleler üzerinde sentiment analysis (duygu analizi) yapmak.

Bu cümlelerden önceki yazımızda olduğu gibi bir sözlük (vocabulary) çıkartalım. Bunun için Şekil-11'deki gibi her bir kelimenin pozitif cümlelerde geçme sıklığını ve negatif cümlelerden geçme sıklığını not edelim.

Şekil-11 Burada negatif toplamı yanlış yazılmış. Fakat hesaplamaların değişmemesi için yazının devamında 12 olarak kabul edelim.

Sözlüğü çıkarttığımızdan sonraki aşamada koşullu olasılık kullanarak kelimelerinin negatifliğini ve pozitifliğini bulacağız. Bunun için “happy” kelimesini örnek alırsak, pozitif cümlelerde geçme sıklığını (2) tüm pozitif kelimelerin sıklıklarının toplamına bölerek koşullu olasılık uygulayalım. Aynı işlemleri tamamen bağımsız olarak negatif kısım için de yapalım.

Şekil-12

2/13 = 0.153 yuvarlarsak…0.15 -> Pozitif oran

1/13 = 0.083 yuvarlarsak… 0.08 -> Negatif oran

Yukarıda da bahsettiğim gibi negatif ve pozitif özellikler birbirinden tamamen bağımsız olarak hesaplandı.

Şimdi elimizdeki cümleleri nasıl test edebileceğimize bakalım. Bunun için Şekil-12'deki olasılık tablomuzu kullanarak cümledeki her bir kelimenin pozitiflik oranını negatiflik oranına bölerek çıkan sonuçları çarpmamız gerekiyor.

Şekil-13

Sonuç 1'den büyük olduğu için cümleyi pozitif olarak değerlendirebiliriz. 1'den küçük olsa negatif olarak değerlendirecektik.

Buraya kadar Naive Bayes hakkında fikriniz olduğunuzu düşünüyorum. Şimdi bazı geliştirmeler yapmaya başlıyoruz.

Laplacian Smoothing

Eğer siz de “because” kelimesinin negatiflik oranının 0 olduğunu fark ettiyseniz yalnız değilsiniz (Bkz. Şekil-12). Bu tarz durumlarda hesaplamalarımız bozulur. Bu sorunu çözmek için formülü biraz geliştirelim.

Şekil-14 Laplacian Smooting Formula

Laplacian Smoothing kullanarak pozitiflik oranın hesaplanmasını değiştirdik.

  • freq(w,class) -> Bir önceki formüldekinin aynısı. Bir sınıftaki cümlelerde kelimenin kaç kere geçtiğini belirtir. “happy” kelimesi için bu sayı 3'tü.
  • N -> Bir önceki formüldekinin aynısı. Sınıfta kelimelerin toplam sıklığı. “happy” için bu 13'tü.
  • V -> Örneklemdeki unique(benzersiz) kelime sayısı. “i”,”am”,”because”,”learning”,”NLP”,”sad” ve “not” kelimeleri olmak üzere 8 adet kelimemiz var.

Bunun sonucunda 0 gelme olasılığı kalmıyor :D

Şekil-15 Güncellenmiş Tablo

Log-Likelihood

Log-Likelihood daha önce hesapladığımız değerleri logaritmik tabanda inceleyerek bizim daha doğru kararlar vermemizde yardımcı oluyor.

Şekil-16 İkili Sınırlandırma için Naive Bayes Formülü

Öncelikle likelihood’un ne olduğuna bakalım. Şekil-16'daki mavi çerçeveli alanı daha önceden biliyoruz. Bu orana likelihood denir. Kelimenin Türkçe karşılığı ise olabilirlik anlamına gelmektedir. Yani kısaca her bir pozitif kelimenin oranın negatif kelimelere oranından bir ratio elde ediyoruz.

Eğer formüle pozitif ve negatif cümlelerin oranını da katarsanız bu sefer prior ratio(oran) hesaplamış olursunuz. Bu oran özellikle pozitif ve negatif örnek sayısı eşit olmayan durumlarda önem kazanır.

Gelelim neden logaritmik tabanda işlemlerimizi yapmamız gerektiğine. Buraya kadar birçok işlem yaptık ve bu işlemler sırasında sayıların çok fazla küçülerek bilgisayarlar tarafından saklanamayacak durumda olması ve bilgisayarlar tarafından 0 olarak algılanması ihtimali var. Bu duruma underflow denir.

Şekil 17 Log prior ve log likelihood uygulanışı

Elimizdeki formülü logaritmaya uyarladığımızda ise Şekil-17'deki gibi bir formül elde ediyoruz.

Son olarak aşağıya uygulanmış bir örneğini bırakıyorum.

Şekil-18

Naive Bayes Uygulama Adımları

Eğer Naive Bayes’i ikili sınıflandırma için uygulamak istiyorsanız önceki yazımızdaki gibi bir gradient descent uygulamanıza gerek yok kaba tabirle burada yaptığımız iş kelime sıklıklarını kullanarak olasılıksal olarak tahminlerde bulunmak. Bunun yapmanız gereken adımlar şu şekilde :

0- Veriyi etiketli olarak edinin.

1- Elde ettiğiniz veriyi ön işlemlerden geçirin. (Temizleyin, Dictionary(Sözlük) oluşturun.)

2- Sözlükteki kelimeler için sıklık(frekans) hesaplayın. (freq(w,class))

3- Laplacian Smoothing formülünü kullanarak her kelime için bir koşullu olasılık değeri hesaplayın.

4- Lambda değerini yani log likelihood değerini hesaplayın.

5- Modelinizin log prior değerini de hesaplayarak cümleleri test edebilirsiniz.

Tüm bunların uygulandığı kodlara yazının sonundan ulaşabilirsiniz.

Naive Bayes Kullanım Örnekleri

  • Sentiment Analysis (Duygu Analizi)
  • Author Identification (Yazar Tespiti)
  • Information Retrieval (Bilgi Alımı)
  • Word Disambiguation (Kelime Netleştirme)

Naive Bayes Kullanmanın Avantajları

  • Herhangi bir eğitim süreci gerektirmediğinden çok hızlı bir şekilde uygulanıp kullanılabilir.
  • Basit ve küçük veri kümelerinde kullanılmaya elverişlidir.

Naive Bayes Kullanmanın Dezavantajları

  • Naive Bayes her bir kelimenin birbirinden bağımsız olmasını kabul ettiği için gerçekten bağımlı cümlelerde kötü sonuçlar verebilir.
  • Veri kümesinin çok dengesiz olduğu durumlarda kötü sonuçlar verebilir.
  • Yaptığımız iş kelime saymak olduğu için ironi içeren cümlelerde çok kötü sonuçlar verebilir.

Bu bölümde Naïve Bayes’in nasıl işlediğini anlatmaya çalıştım. Tüm anlatılanların Python dilinde kodlanmış haline buradaki dosyalardan erişebilirsiniz.

Yazı konusunda kafanıza takılan noktalar, eleştiriler veya öneriler için yorumlar kısmında cevap vermeye çalışacağım. Sağlıcakla kalın.

--

--

Yusuf ANI
novaresearchlab

Bilgiye sahip olarak doğmuş birisi değilim. Öğretmeyi seviyorum ve öğrenmeye çalışıyorum — Konfüçyüs