Duygu Analizi ve Fikir Madenciliği -2 (Sentiment Analysis / Opinion Mining)
Selamlar Herkese,
Uzun bir aranın ardından, Deep Learning Türkiye ve medium.com üzerinden serinin devamı olabileceğini düşündüğüm ve gelen talepler üzerine konun bir parça daha derinine inebilmek adına Duygu Analizi(Sentiment Analysis) bir başka deyişle Fikir Madenciliği ile alakalı ilk yazımın devamını sizlerle paylaşmak istiyorum.
Hatırlayacağınız üzere, ilk yazıda Duygu Analizi/Fikir Madenciliği kapsamında “yenilenebilir ve kullanılabilir veriden/verilerden anlamlı ifadeler çıkarma” düşüncesi ile ilgili popülerliği her geçen gün gittikçe artan Sentiment Analysis konusuyla ilgili bir demo kod parçasıyla örnek yapmaya çalışmıştık.
Bu yazıda ise, bir parça daha Duygu Analizi’ni performanslı hale getirebilmek ve biraz daha konun derinine inmek amacıyla, kullandığımız kütüphanelerden ve teknoloji stack’lerinden daha da detaylı bahsetmiş olacağız.
Elde edilen büyük miktardaki veri topluluğunun yapılandırılmamış (unstructured data) olması ve bununla alakalı öngörüler oluşturabilmek adına elimizdeki verilerin işlenmesi gerektiğini vurgulamıştık.Yapılandırılmamış verilerle ilgili örnek verebilmek gerekirse; sosyal medyadaki post’lar ve yayınlar ve buna ek olarak haber makaleleri ile alakalı arama geçmişi verilebileceğini düşünüyorum.Doğal dil analizi(Natural Language Processing) ve ondan anlamlı ifadeler çıkarma süreci ile alakalı bir konuyu ele alacağız.
Duygu Analizi(Sentiment Analysis) metinleri veya metin parçalarını önceden tanımlanmış bir duyguya sınıflandırmayı(classification) içeren yaygın bir NLP görevidir.Metinsel ifadeleri analiz etmek için Python’da yaygın olarak kullanılan NLP kütüphanesi olan Doğal Dil Aracı(NLTK-Natural Language Tool Kit)’i anlamaya çalışıp örnekler üzerinden kullanmaya çalışacağız.
Ön Hazırlık
Python 3+ (Release-En güncel sürümü)
Python IDE(Terminalden veya istediğiniz herhangi bir IDE’yi kullanabilirsiniz..Ben Jupyter Notebook’u tercih ettim..)
NLTK(Natural Language Tool Kit) Nedir ?
Python programlama dili ile geliştirilen ve geliştirilmekte olan yaklaşık olarak 120.000 satır kod, 70’e yakın derlem(corpus) ve çok sayıda altbirimlerden oluşan open source bir araç www.nltk.org adresinden indirilerek kurulum yapılabilir.Python 2.5 ya da 2.6 sürümleri için geliştirilen bu araç Python3+ ve üzerini de desteklemektedir.Nltk içinde yazılan modüller, matplotlip içerisinde grafik, şablon çıkarmak için sınıflar, numpy içinde ise sayısal hesaplama sınıfları bulunmaktadır. Bunlar kurulduktan sonra veri olarak, derlemleri, etiketleri, ağaç yapılarının içinde bulunduğu nltk_data indirilip kurulmalıdır.
Opsiyonel olarak pip install <paket-adı> ile de terminal aracılığıyla python için geliştirilen kütüphaneleri doğrudan doğruya indirip import edebilirsiniz…Aşağıda Pip ile ilgili ufak bir açıklama yapmış olacağım…
Pip(Preferred Installer Program) Nedir ?
PyPi paketlerini basit ve anlaşılır bir komutla kurmanıza, yeniden yüklemenize ve kaldırmanıza izin veren üçüncü parti python paketlerinin kurulması için kullanılan bir script’dir.(İnternetten Windows,Linux,macOs için kurulumlarına göz atabilirsiniz..)
Aşağıda Python3+ ve Pip3’nin önceden kurulup NLTK kütüphanesi ve dizinlerinin terminal aracılığı ile nasıl indirileceğini gösteren bir snapshot paylaşıyorum.
pip3 install nltk ile beraber kaynak url’deki paketleri çekebiliyoruz herhangi bir version belirtmeksizin pip3 install sizin için istediğiniz paketlerin/kaynakların en güncel halini(Release) indirecektir.
Şimdi Jupyter Notebook üzerinden NLTK entegrasyonu ve kullanımına göz atacağız:
In [1] NLTK modülünü indirdikten sonra, jupyter notebook’a “import nltk” ile python interpreter’ına nltk modülünü yüklüyoruz.
In [2] Yüklediğimiz modülün NLTK olduğuna emin olabilmek için “nltk” yazıp kontrol edilmesini sağlayabiliriz(Opsiyonel!)
In [3] NLTP modülündeki örneklem tweet’leri kullanabilmek adına “nltk.download(‘twitter_samples’)” yazıp satırı koşturduğumuzda işlemin sonucu boolean olarak size geri dönecektir..
Son satıra yazmış olduğumuz komut ile Python yorumlayıcısından(interpreter) tweetleri local’imize indirip saklamış oluyoruz…Örnekler indirildikten sonra, kullanıma hazır olacaktır
Negatif ve pozitif tweet’leri oluşturacağımız model ile Sentiment analysis ‘da eğitmek için kullanacağız..Duyguları olmayan(non-sentiment) tweetler’i modelimizi test etmek için kullanmış olacağız.
NOT: Kendi veri kümenizi kullanmak isterseniz, Twitter API’sini kullanarak belirli bir zaman diliminden, kullanıcıdan veya hashtag’lerden tweet’ler toplayıp analiz edebiliriz (Bir önceki yazımda Twitter’ın API hakkındaki tutumu ile alakalı açıklama yapmaya çalışmıştım…)
İkinci Adım: Verilerin Belirlenmesi
Orijinal biçimdeki dil bir makine tarafından doğru bir şekilde işlenemez, dolayısıyla da makinenin daha kolay anlaşılmasını sağlamak amacıyla dili işlememiz gerekmekte…
Verileri anlamlandırmanın ilk kısmı, token adı verilen bir işlem ile daha küçük bölümlere ayırmaktır.
Token, metinde birim olarak işlev gören bir karakter dizisidir.Tokenları nasıl oluşturduğunuza bağlı olarak, kelimeler, ifadeler veya #hashtag’ler bağlantılar ve buna ek olarak tek tek karakterlerden de oluşabilir.Dili token’lara bölmenin temel bir yolu, metni boşluk ve noktalama işaretine göre bölmekten geçmekte…
Örnekteki modeli eğitmek ve test etmek için çeşitli tweetler içeren NLTK’dan üç veri kümesini şu şekilde içe aktarmış olacağız:
positive_tweets = twitter_samples.strings(‘positive_tweets.json’)negative_tweets = twitter_samples.strings(‘negative_tweets.json’)text = twitter_samples.strings(‘tweets.20150430–223406.json’)
NLTK’da bir token kullanmadan önce, ek olarak bir kaynak indirmemiz gerekmekte…İndireceğimiz kaynağımızın ismi ‘Punkt’…Punkt modülü, kelimeleri ve cümleleri tokenleştirmemize yardımcı olan önceden eğitilmiş bir modeldir.Örnek vermek gerekirse: bu model bir adın bir dönem içerebileceğini bilmekte(“S.Daityari”) gibi ve bu dönemin bir cümledeki varlığı mutlaka sona ermemekte.
nltk.download(‘punkt’)
Bu işlem ile Punkt’ı indirmiş oluyoruz..Ve yeni bir satırda postive_tweets.json veri kümesini belirleyen bir nesne oluşturmak için şu satırı ekliyoruz :
tweet_tokens = twitter_samples.tokenized(‘positive_tweets.json')
NOT: NLTK, .tokenized() yöntemiyle beraber tweetler için varsıyılan(default) bir method sağlamakta!
.tokenized() methodunu çalışırken görmek için [17]’inci satırdaki gibi yazıp çalıştırdığımızda positive_tweets.json veri kümesinden tek bir tweet’i tokenleştirecektir.
Bir sonraki yazımda Veri Normalizasyonu ile alakalı ve serinin devamı niteliğinde bir yazı paylaşamaya çalışacağım…
Takipte Kalın!