Twitter Madenciliği
Buğra AYAN
Ankara 2019
İçindekiler Tablosu
Önsöz ……………………………………………………………………………………………………………………………………. 3
Geliştirici Hesabının Açılması ……………………………………………………………………………………………………. 4
Python ile Twitter Bağlantısı ……………………………………………………………………………………………………. 4
Zaman Akışından Tweet Çekilmesi ……………………………………………………………………………………………. 5
Kullanıcı Bilgilerinin Alınması ……………………………………………………………………………………………………. 6
Tweet Paylaşımı ……………………………………………………………………………………………………………………… 7
Kapsamlı Profil Analizi …………………………………………………………………………………………………………….. 8
Kullanıcının Zaman Akışını Alma ……………………………………………………………………………………………… 10
Kullanıcı Tweetlerinin Tabloda Gösterilmesi …………………………………………………………………………. 11
Tweetlere Baştan ve Sondan Bakalım ………………………………………………………………………………….. 13
Tweetleri Favori Sayısına Göre Sıralama ………………………………………………………………………………. 14
Tweetleri RT Sayısına Göre Sıralama ……………………………………………………………………………………. 14
Tweetleri Cihaz Kullanımına Göre Sıralama ………………………………………………………………………….. 16
Favorilerin Grafiksel Gösterimi ……………………………………………………………………………………………. 17
RT Sayılarına Göre Grafiksel Gösterim …………………………………………………………………………………. 17
Saatlerine Göre Paylaşımların Gösterimleri ………………………………………………………………………….. 19
Günlere Göre Tweet Dağılımı ……………………………………………………………………………………………… 21
Takipçi & Takip Edilen Analizi …………………………………………………………………………………………………. 23
Takip Edilen Kişilerin Analizi ……………………………………………………………………………………………….. 26
Takip Edilen Kişilerin Konumlara Göre Gösterimi ………………………………………………………………….. 27
Takip Edilen Kişilerin Kayıt Tarihlerine Göre Gösterimi …………………………………………………………… 29
Hashtag Analizi …………………………………………………………………………………………………………………….. 30
Trendlerin Alınması …………………………………………………………………………………………………………… 30
Türkiye Trendlerinin Alınması ……………………………………………………………………………………………… 31
İstenen Etikete Gönderilen Tweetlerin Alınması ……………………………………………………………………. 33
Etikete Katılanlar İçinde En Yüksek Takipçilerin Bulunması …………………………………………………….. 35
Etikete Katılanlar İçinde En Yüksek RT Alanların Bulunması ……………………………………………………. 35
Metin Madenciliği ………………………………………………………………………………………………………………… 36
Kelime Bulutu Oluşturulması ………………………………………………………………………………………………. 39
Duygu Analizi Uygulaması ……………………………………………………………………………………………………… 40
TextBlob Kullanımı …………………………………………………………………………………………………………….. 40
Vader Kullanımı ………………………………………………………………………………………………………………… 45
Önsöz
Bu çalışmada sosyal medya uzmanlarının sıklıkla ihtiyaç duyduğu Twitter madenciliği konusuna giriş yapılmıştır. Kitabın anlaşılması için Python bilgisi gerekmektedir. Python konusunda ücretsiz olarak yayınladığım “Herkes İçin Python Programlama” kitabından faydalanabilirsiniz.
Çalışmanın geliştirilme süreci devam etmektedir. Gördüğünüz hataları bildirmek ve kitabın kaynak kodlarını almak için https://www.linkedin.com/in/bugraayan/ üzerinden iletişim kurabilirsiniz.
Bu eseri üç şarta sadık kalarak kopyalayabilirsiniz.
İlki, eserin tüm kopyalarında eserin ilk sahibinin belirtilmesidir.
İkincisi, eserin hiçbir kopyası veya eserden üretilmiş yeni eserlerin hiçbirisinin ticari
ortamda kullanılmamasıdır.
Üçüncüsü, esere dokunulmaması ve özgünlüğünün korunmasıdır.
Geliştirici Hesabının Açılması
Twitter’da uygulama geliştirmek için bir geliştirici hesabı açılması gerekmektedir. 2018 yılının öncesinde bu işlem daha basitken sonrasında bazı süreçlere bağlandı. Bunu yapmak için ilk olarak https://developer.twitter.com adresine başvurulması ve başvurunun onaylanması gerekiyor. Video anlatım https://www.youtube.com/watch?v=M_gGUqhCJoU adresinde yer almaktadır. Önemli olan noktalardan biri rastgele bilgiler girmemek ve olabildiğince doğru bir şekilde formları doldurmaktır.
Python ile Twitter Bağlantısı
Python programlama dili ile bağlantı yapmak için Tweepy kütüphanesi kullanılır. Bu kütüphane Twitter programlama arayüzüne Python programlama dili aracılığıyla kolayca ulaşmayı sağlar. Bağlantıyı yapmak için developer.twitter.com üzerinden oluşturulan uygulamada verilen 4 anahtar değeri kullanılır.
İlk olarak kütüphaneyi içe aktaralım.
import tweepy
Ardından Tweepy kütüphanesinin bağlantı fonksiyonu olan OAuthHandler içerisine bu değerleri girelim.
baglantim = tweepy.OAuthHandler(consumer_key, consumer_secret)
baglantim.set_access_token(access_token, access_token_secret)
Bu değerler girildikten sonra tweepy.API(auth) diyerek bağlantıyı yapalım.
api = tweepy.API(baglantim)
Artık “api” bizim Tweepy kütüphanesini kullandığımız değişken. Bu değişkenin parametreleri ile tweet çekme, tweet atma, trendleri alma gibi bir çok işlemi yapabileceğiz.
Zaman Akışından Tweet Çekilmesi
Tweepy kendi dökümantasyonunda verilen kurulum sonrası örnek bir kullanım aşağıdaki şekildedir.
tweetler = api.home_timeline()
for tweet in tweetler:
print(tweet.text)
Yukarıdaki kod ile api.home_timeline() metodunu kullanıyoruz. Bu metod haber akışından tweetleri almayı sağlıyor. Haber akışından gelen tweetleri, “tweetler” isimli bir değişkene atıyoruz. Ardından for döngüsü kullanarak bu Tweetleri ekrana yazdırıyoruz. Fakat Tweet verisinin içerisinde sadece yazı değil, o tweetin atıldığı cihazdan , paylaşıldığı konuma kadar bir çok bilgi bulunuyor. Bu sebeple tweet.text diyerek sadece içerisindeki metni alıyoruz.
Burada home_timeline() metodu için özel bir parametre girmedik. Dolayısıyla varsayılan değerlerde bir işlem yaptı. Buna göre belirli sayıda, yaklaşık 20 tane, tweet çekti.
Kullanıcı Bilgilerinin Alınması
Benzer şekilde hemen kurulum sonrası yapabileceğimiz bir başka pratik işlem ise bir kullanıcı ile ilgili bilgileri almak. Tweepy bunun için get_user() metodunu kullanıyor. Örneğin; kullanici = api.get_user(‘bugraayan’) diyerek “bugraayan” kullanıcısı ile ilgili bilgileri alabiliriz. Ardından print(kullanici) dediğimizde sonuç ekranda yazacaktır.
Fakat yukarıda görüldüğü gibi bize json formatında bir çok istemediğimiz bilgiyi de barındıran bir sonuç döndü.
Buradan istediğimiz parametreleri kullanici.PARAMETRE dizilimi ile alıyoruz. Örneğin kullancının biyografisini, konumu ve takipçi sayısını alalım.
Benzer şekilde; hesabın doğrulanma durumunu, zaman dilimini, kullandığı liste sayısını, profil resmini, profil arkaplan resmini vs. de alabiliyoruz.
Kurulum sonrası için son örneğimizi ise, Tweepy kullanarak Tweet gönderme ile ilgili verelim. Bunun için update_status() metodunu kullanıyoruz. Metod içine göndermek istediğimiz Tweet’i giriyoruz.
Tweet Paylaşımı
api.update_status(“Test”) şeklinde kodumuzu çalıştıralım.
Tweet sorunsuz paylaşıldıktan sonra yukarıdaki gibi zaman akışı JSON olarak geri dönecektir. Şimdi Twitter’daki görüntüye bakalım.
Görüldüğü gibi Tweetimiz paylaşıldı.
Kurulum işlemimizin ardından 3 örnek ile Tweepy’nin nasıl pratik olarak kullanıcılacağını gördük. Şimdi daha detaylı işlemler için bir sonraki bölüme geçelim.
Kapsamlı Profil Analizi
Bu bölümde bir kullanıcıyı detaylı olarak analiz etmeyi öğreneceğiz. İlk olarak get_user() metoduyla kullanıcıyı alalım.
Kullanici = api.get_user(“bugraayan”) diyerek kullanıcı bilgilerini aldık. Ardından dir(kullanici) diyerek içinde bulunan bütün metodları listeledik.
Kullanıcının Zaman Akışını Alma
Kullanıcının temel bilgilerini okuduk. Şimdi Tweetlerine yoğunlaşalım. Bunun için user_timeline() metodunu kullanıyoruz.
tweetler = api.user_timeline(id = “bugraayan”) diyerek “bugraayan” kullanıcısı için tweetleri alıyoruz. Fakat bu sonuç yine json verisi olarak gelir. Çünkü bir Tweet sadece içerdiği metinden ibaret değildir. Tweet içerisinde metnin dışında atıldığı tarih, atılırken kullanılan zaman dilimi, bir kullanıcıya atıf içerip içermediği, RT barındırıp barındırmadığı gibi bir çok bilgi vardır.
İçerisinden text kısmını almak için .text parametresini kullanıyoruz. Gelen Tweetler birden fazla olduğu için bunları bir for döngüsü içerisinde ekrana yazdırıyoruz.
tweets = api.user_timeline(id = “bugraayan”)
Kullanıcı Tweetlerinin Tabloda Gösterilmesi
Tweetleri aldık fakat bu tweetler üzerine çeşitli araştırmalar yapmak için tablo yapısı gibi bir yapıda bu kayıtları saklamamız lazım. Burada yardımımıza Pandas kütüphanesi yetişiyor. Pandas veritipi olan dataframe değişkeni içinde Tweetleri saklayacağız. Öncelikle Tweet’in hangi özelliklerini tablomuza yazacağımızı seçiyoruz. İlk olarak esas olan text kısmını alıyoruz.
df[“metin”] = [tweet.text for tweet in tweetler]
Bunun dışında Tweet’in atıldığı kaynak, RT sayısı, Fav sayısı, atılma zamanı ve id değişkenlerini de alalım.
df[“olusturulma_zamani”] = [tweet.created_at for tweet in tweetler]
df[“fav_sayisi”] = [tweet.favorite_count for tweet in tweetler]
df[“rt_sayisi”] = [tweet.retweet_count for tweet in tweetler]
df[“kaynak”] = [tweet.source for tweet in tweetler]
df[“id”] = [tweet.id for tweet in tweetler]
Bu kodları bir fonksiyon içerisine koyalım.
Görüldüğü gibi tablo şeklinde Tweetleri elde ettik.
Şimdi ise kullanıcının Tweetleri aldıktan sonra onları sıralayarak en çok beğeni alan , en çok RT alan paylaşımları bulacağız.
İlk olarak incelemek istediğimiz hesabın kullanıcı adı ve incelemek istediğimiz Tweet sayısını parametre olarak girdiğimiz user_timeline() metodunu kullanıyoruz.
tweetler = api.user_timeline(id = “bugraayan”, count = 300)
Bu veriyi aldıktan sonra tablo şeklinde göstermek için yukarıdaki kullandığımız tabloya çevirme fonksiyonunu kullanıyoruz.
df = profil_analizi(tweetler)
200 adet Tweeti aldık.
Tweetlere Baştan ve Sondan Bakalım
Şimdi Tweetlerin en üstten ve en alttan 5’er tanesine bakalım.
Tweetleri Favori Sayısına Göre Sıralama
Verimizin düzgün olarak alındığını gördük. Şimdi ise bu Tweetler içerisinde en çok beğeni alan, en çok RT alan paylaşımları bulalım. Bunun için Pandas fonksiyonu sort fonksiyonunu kullanıyoruz.
Tweetleri RT Sayısına Göre Sıralama
Şimdi benzer şekilde rt_sayisine göre bir sıralama yapalım.
Şimdi ise kaynaklara göre sıralayalım.
Görüldüğü gibi sıralama yapıldığında alfabetik bir sıralama gibi okuyarak ilk olarak Twitter for Android leri sıralıyor.
Bu tabloda 6 farklı değişken olduğu için karmaşık bir görüntü olabiliyor. İçlerinden sadece Tweetleri ve favori sayısını almak için head(5) yerine [[“İSTEDİĞİMİZ SÜTUN İSİMLERİ”]].iloc[0:İSTEDİĞİMİZ TWEET SAYISI] şeklinde alıyoruz.
Örneğin Tweetler ve favori sayılarının ilk 10 tanesini almak için aşağıdaki kodu kullanıyoruz.
df.sort_values(“fav_sayisi”, ascending = False)[[“metin”,”fav_sayisi”]].iloc[0:10]
Benzer şekilde rt sayısına göre de sıralama yapabiliyoruz.
df.sort_values(“rt_sayisi”, ascending = False)[[“metin”,”rt_sayisi”]].iloc[0:10]
Tweetleri Cihaz Kullanımına Göre Sıralama
Şimdi ise daha farklı bir çalışma yapalım. En çok RT alan Tweetlerin hangi cihazlardan paylaşıldığını görelim.
Görüldüğü gibi ağırlıklı olarak Android sonucu çıktı. Tabi bu hesabın farklı cihaz kullanım oranlarıyla da alakalı olacaktır.
Favorilerin Grafiksel Gösterimi
Şimdi favori alma sonuçlarımızı ekrana çizmeye çalışalım. Çizim aşamasında seaborn ve matplotlib kütüphanelerinden faydalanıyoruz.
İlk olarak kütüphaneleri içe aktaralım.
import seaborn as sns
import matplotlib.pyplot as plt
ardından seaborn içindeki distplot fonksiyonunu kullanarak çizim yapalım.
RT Sayılarına Göre Grafiksel Gösterim
Şimdi rt sayılarının dağılımına bakalım.
Buradaki kde parametresi grafiğin üzerine çizim işlemi görüyor. Eğer True yaparsak aşağıdaki gibi bir sonuç alıyoruz.
Şimdi rt sayılarına bakalım. Bu sefer 0 ile 100 retweet alan tweetlere odaklanalım.
Saatlerine Göre Paylaşımların Gösterimleri
Şimdi paylaşımların saatlerine odaklanalım. Burada strftime(“%H”) ifadesini kullanıyoruz. Bu ifadeyi bir lambda fonksiyonu içinde tanımlayalım.
lambda tweet: tweet.strftime(“%H”)
Yukarıdaki kodumuz şu anlama geliyor. Her Tweet’in içindeki saat parametresini al. Saatten kastımız 14.05 gibi bir ifade değil 14 gibi 15 gibi dakika içermeyen kısım.
Ardından da dataframemiz için apply fonksiyonuyla saatleri yeni bir sütuna yazalım.
df[“tweet_saati”] = df[“olusturulma_zamani”].apply(lambda tweet: tweet.strftime(“%H”))
df[“tweet_saati”] = pd.to_numeric(df[“tweet_saati”]) ile bu işlemi yapıyoruz. Ardından da yine distplot metodu ile sonuçları ekrana yazdırıyoruz.
sns.distplot(df[“tweet_saati”], kde = False, color =”green”);
Görüldüğü üzere Tweetlerin yoğunlaşması 15.00 ile 20.00 arasında oluyor. Sabah saatlerinde ise çok seyrek Tweet paylaşımı oluyor.
Benzer şekilde günlere göre atılan tweetleri de analiz edebiliriz. Gün isimlerini Dataframe’in kendi metodlarından dt.weekday_name ile alabiliyoruz.
df[“gunler”] = df[“olusturulma_zamani”].dt.weekday_name
Ardından bu gün isimlerini Türkçe’ye çevirmek için replace fonksiyonunu kullanıyoruz. gun_degistir ismindeki değişkenimizi map metoduyla gönderiyoruz.
gun_degistir = {‘Monday’:’Pazartesi’, ‘Tuesday’: ‘Salı’, ‘Wednesday’: ‘Çarşamba’,
‘Thursday’: ‘Perşembe’, ‘Friday’:’Cuma’,
‘Saturday’:’Cumartesi’, ‘Sunday’: ‘Pazar’}
df[‘gunler’] = df[‘gunler’].map(gun_degistir)
Şimdi tablomuzun son sütunu olarak günler kısmının eklendiğini görebiliriz.
Günlere Göre Tweet Dağılımı
Şimdi Tweetlerin atıldığı günler üzerinden bir grafik çalışması yapacağız fakat hangi günün kaç kere geçtiğinin sayısına ihtiyacımız var. Öncelikle groupby fonksiyonu ile bu sütunu gruplayacağız. Ardından .count ile bir sayma işlemi yapacağız.
gun_frekansi = df.groupby(“gunler”).count()[“id”]
Görüldüğü gibi artık günlerin geçme frekanslarını bulduk. Şimdi grafik olarak gösterelim. Burada çizgi gösterimi plot.bar ile kullanıyoruz.
Şimdi ise Tweet atılan kaynaklara bakalım. Kaynak_frekanslari değişkenini tanımlıyoruz. Bu değişken “kaynak” sütununa göre gruplanmış ve sayılmış verileri gösteriyor.
kaynak_frekanslari = df.groupby(“kaynak”).count()[“id”]
Ardından yine plot.bar diyerek ekrana yazdırma işlemi yapıyoruz.
kaynak_frekanslari.plot.bar(x = “kaynak”, y = “id”)
Sonuçlara göre Twitlerin ağırlıklı bir kısmı Android cihazından, kalanlar ise Web tarayıcısı ile gönderilmiş. Iphone veya başka bir cihaz hiç kullanılmadığı için grafikte de çıkmıyor. Peki sayısal olarak durumlar nasıl ? Bunu öğrenmek için kaynak_frekanslari değişkenini ekrana yazdırıyoruz.
187 adet Android cihazdan, 13 adet ise Web tarayıcısından paylaşım yapılmış.
Takipçi & Takip Edilen Analizi
Takipçi analizine tweetlerin ardından takipçiler ve takip edilenler ile devam ediyoruz. Yine ilk olarak get_user() metoduyla kullanıcı bilgilerini alıyoruz.
kullanici = api.get_user(id = “bugraayan”)
Sonuçları ekrana yazdırdığımızda bir json verisi döndüğünü görüyoruz.
Bu json içerisinden friends bölümünü ekrana yazdıracağız. Friends tanımı Twitter apisi ve Tweepy içinde takip_edilenler için kullanılıyor. Bunun için basit bir for döngüsü kullanıyoruz.
for takip_edilen in kullanici.friends():
print(takip_edilen.name)
Sonuçlara bakalım. Name ile ekranda görünen isimleri aldık.
Eğer name yerine description deseydik biyografileri elde ediyoruz.
Tweetler bölümünde tweetleri bir dataframe içerisine alıp çeşitli işlemler yapmıştık. Şimdi arkadaşlar için de benzer bir uygulama yapacağız. Yine pandas kütüphanesini kullanıyoruz ve bir dataframe içerisinde bilgileri tutuyoruz.
İlk önce user.friends() ve user.followers() için iki değişken tanımlıyoruz.
Artık takip_edilen ve takipci değişkenleriyle bu verileri elde edeceğiz.
Şimdi pandas kütüphanesiyle dataframe nesnemizin için değişkenlerimizi aktaralım. Bunun için kişiler isminde, tek parametre alan, bir fonksiyon kullanıyoruz.
Takip Edilen Kişilerin Analizi
İlk olarak takip edilen kişileri analiz edelim.
Sonuçlarımızı inceleyelim.
Görüldüğü gibi id, kayit_tarihi , ekran_ismi , konum , takipci_sayisi, tweet_sayisi, takip_edilen_sayisi , begeni_sayisi içeren bir dataframe elde ettik. Tıpkı Tweetlerde olduğu gibi takipçi ve takip_edilen kişileri istediğimiz bir sütuna göre sıralayabiliyoruz. Örneğin aşağıda takipçi sayısına göre takip edilen kişilerin sıralndığı tabloyu görüyoruz.
Benzer şekilde takipçileri de takip edilme büyüklüklerine göre sıralayabiliyoruz.
Öncelikle tablom = kisiler(takipci) diyerek tablonun içerisine takip edilenleri değil takipçileri gönderiyoruz. Ardından yine sort_values metodu ile sıralama yapıyoruz.
Takip Edilen Kişilerin Konumlara Göre Gösterimi
Şimdi takip edilen kişileri konumlarına göre gruplayalım ve bunu çizgi grafik olarak yazdıralım.
Sonuçlarda 11 olarak gözüken kısmın konum bilgisinin boş olmasının nedeni, bunun konum girmeyenlere dair bir bilgi olması. Çizdirme işlemi için bar.plot kullanıyoruz.
konum_frekans.plot.bar(x = “konum”, y = “id”)
Bir kişi mail adresini konum kısmına yazdığı için grafikte gözüküyor. Eğer burada bir önişleme yaparsak gerek boş kısmı gerek bu tarz hatalı kullanımları temizleyip grafiğimizi daha doğru oluşturabiliriz.
Takip Edilen Kişilerin Kayıt Tarihlerine Göre Gösterimi
Şimdi takip ettiğimiz kişilerin Twitter’a hangi yıl kayıt oldukları üzerine bir araştırma yapalım.
Yukarıda sırasıyla kayit_tarihi sütunundan yıl bilgisini %Y ifadesi ile aldık. Ardından bunu bir değişkene atadık. Bu keyfi bir işlem. Sonrasında bir değişken dönüşümü yaptık ve distplot metoduyla ekrana yazdırdık.
Görülen ağırlıklı olarak 2009,2010 ve 2011 yılında kayıt olan kişilerin takip edildiği. Aynı zamanda eski hesapların takipi yeni hesaplara göre daha yüksek.
Hashtag Analizi
Bu bölümde Twitter’in popüler araçlarından #hashtag ler üzerine analizler yapacağız.
Tweepy kütüphanesi api.trends_available() ibaresiyle trendleri almamızı sağlıyor.
İlk denememizi yapalım.
Trendlerin Alınması
api.trends_available()
Görüldüğü gibi dünya trendleri ile başlayan ve devam eden uzun bir json dosyası dönderiyor.Bu dosyayının içerisinde bir bölgenin ismi, şehir veya ülke gibi tipi, woeid isimli özel numarası ve ülke kodu yer alıyor. Biz ülke kodları isimli parametre almayan bir fonksiyon ile trend listesi oluşan yerlerin isimlerini ve numarasını alıyoruz.
ulke_kodlari() diyerek fonksiyonumuzu çağırıyoruz. Ve aşağıdaki şekilde yerler ile numaraları liste şeklinde karşımıza geliyor.
Bu listeyi herhangi bri dataframe e aktarıp her ihtiyacımız olduğunda kullanabiliriz. Şimdilik içinden ihtiyacımız olan numarayı alıp devam edelim.
Örneğin listemizde Türkiye için 23424969 numarası verilmiş. Bu Türkiye trendlerini okumak için kullanacağımız numara. Bu işlemde trends_place() metodunu kullanıyoruz. Parametre olarak id= 23424969 parametresini gönderiyoruz.
Türkiye Trendlerinin Alınması
Turkiye_trendleri = api.trends_place(id = 23424969)
Yukarıda görüldüğü gibi bir json dosyası olarak Türkiye’deki trendleri öğrendik. Json kütüphanemizi içe aktarıyoruz ve json.dumps işlemi ile 1 sekmelendirme yaparak tekrar trendleri yazdırıyoruz.
Daha okunaklı bir sonuç oldu. Şimdi basit bir for döngüsüyle içerideki başlıkları alabiliriz. Dikkat edersek başlıklar için Json dosyası içinde name değeri kullanılmış. Biz de bu şekilde çağırıyoruz.
Burada Twitter’da görünenden çok daha fazla trende ulaşabiliyoruz. Bu bazen çok faydalı olabilir. Alt sıralardan yükselmeye başlayan bir etiketi ilk görüp erkenden konuşmaya dahil olabilir, daha çok etkileşim alabilirsiniz.
Şimdi hashtagler üzerinden içerik alıp bunları analiz etme kısmına geçelim.
Bunun için .search metodunu kullanıyoruz. Bu metod bir çok farklı parametre alabiliyor. Örneğin tweetlerin atılmaya başladığı tarihten, atıldığı konuma , dile ve sayısına kadar bir çok parametre belirtilebiliyor. Hashtag analiz ederken normal aramadan farklı olarak sadece aranacak sorgu başına # işareti ekliyoruz.
İstenen Etikete Gönderilen Tweetlerin Alınması
Şimdi #bilişim etiketine Türkçe olarak atılan 1000 Tweet’i en son atılanlar kısmından alalım.
Sonuçlarımızı inceleyelim.
Görüldüğü gibi bir json verisi de içeren sonuç döndü.
Şimdi bunu dataframe içine aktaralım.
Aktarma işlemini tamamladık. Tablomuza göz atalım. Önceden bilişim ile ilgili 1000 adet sonucu alıp sonuclar değişkenine aktarmıştık.
df = etiket_analizi(sonuclar) diyerek tablomuzu görüntüleyelim.
Etikete Katılanlar İçinde En Yüksek Takipçilerin Bulunması
Yukarıdaki gibi sonuçlarımız oluştu. Şimdi bu etikete tweet atılarak katılan kişiler içerisinde en çok takipçisi olan 10 kişiyi bulalım.
df.sort_values(“kullanici_takipci_sayisi”, ascending = False)[[“ekran_ismi”,”kullanici_takipci_sayisi”]].iloc[0:10]
Kodunu kullanıyoruz. Sonuçlar aşağıdaki gibi oluştu.
Etikete Katılanlar İçinde En Yüksek RT Alanların Bulunması
Şimdi bu Tweetlerden en çok RT aldığını bulmaya çalışalım.
df.sort_values(“rt_sayisi”, ascending = False)[[“ekran_ismi”,”rt_sayisi”]].iloc[0:10] kodunu kullanıyoruz.
Metin Madenciliği
Bu bölümde Twitter üzerinde metin madenciliği işlemleri yapacağız. Metin madenciliğinde veriyi temin etmenin ardından ilk aşama önişlemedir.
Bu kapsamda ilk olarak tüm Tweetlerin tamamını küçük harfe çevirelim. Bunun için her Tweet’i önce boşlukları kullanarak kelimelere bölüp, ardından da .lower() metoduyla küçük harfe çevrilmiş hallerini birleştireceğiz.
df[‘metin’] = df[‘metin’].apply(lambda x: ” “.join(x.lower() for x in x.split()))
Görüldüğü gibi büyük harfleri küçük harfe çevirdik. Şimdi kelimeleri geçme frekanslarını bulalım.
Aşağıdaki gibi uzun bir listede kelimelerin frekansları geldi.
Bu listeye dikkat edince kolaylıkla görebileceğiz ki en çok kullanılan kelimelerin çoğu, dolgu sözcük diyebileceğimiz stop-words olarak literatüre girmiş tek başına herhangi bir anlamı
olmayan, “ve,ile,daha,yani” gibi kelimeler. Kapsamlı bir metin madenciliği çalışmasında bunları da temizlemek faydalı olacaktır.
Çizim için ilk olarak frekans formülümüzü bir değişkene eşitliyor ardından da plot.bar kullanarak ekrana çizdiriyoruz.
Şimdi çizimi yapalım.
Burada görüldüğü üzere aslında çok fazla kelimenin olduğu durumlarda çizgi grafik kafa karıştırabiliyor. Bunun için Wodcloud adı verilen etiket bulutunu kullanacağız. Öncelikle Wordcloud kütüphanesini pip install wordcloud ile yüklüyoruz. Ayrıca sonuçları resim olarak kaydetmek için de PIL içinden image kütüphanesini yüklüyoruz.
import numpy as np
import pandas as pd
from os import path
from PIL import Image
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
import matplotlib.pyplot as plt
Kütüphanelerimizi içe aktardıktan sonra yapmamız gereken tüm tweetleri tek bir metnin içerisine aktarmak. Bunun için .join metodunu kullanıyoruz.
Kelime Bulutu Oluşturulması
Gördüğünüz gibi artık tek bir metnin içerisinde tüm Tweeet içeriği var. Kelime bulutumuzu oluşturup gösterelim.
Gördülüğü üzere veri seti az olduğu ve stopwords temizliği yapılmadığı için doğrudan bazı isimler ve anlamsız keliemeler ön plana çıktı.
Duygu Analizi Uygulaması
Şimdi başka bir basit duygu analizi uygulaması yapalım. Bu uygulamada TextBlob isimli bir kütüphaneden yararlanacağız. Bu kütüphane çeşitli doğal dil işleme tekniklerini içinde barındırıyor.
TextBlob Kullanımı
Önce from textblob import TextBlob ifadesiyle kütüphaneyi içe aktaralım. Ardından bir fonksiyon yazıyoruz. Bu fonksiyonda her tweet için bir sentiment skor hesaplanıyor. Eğer skor 0’dan büyükse pozitif, 0’dan küçükse negatif, 0’a eşitse nötr olarak tabloya ekleniyor.
Sonuçları ekrana yazdırırken duygu_sinif ve sentiment_skoru olarak iki değişken eklendiğini görebiliyoruz.
Dilin Türkçe olması, bilişim konusunun daha teknik yorumlar içermesi sonuçların tamamının Nötr gelmesine sebep oldu. Fakat İngilizce’de çok daha başarılı sonuçlar elde edilebiliyor.
Şimdi İngilizce için başka bir örnek deneyelim ve konuyu da tekrar etmiş olalım. İlk olarak aramamızı yapıyor ve Tweetleri temin ediyoruz.
Cocacola etiketine gelen İngilizce yorumları alalım. Ve önceden tanımladığımız etiket_analizi fonksiyonuyla dataframe içine atalım.
Şimdi önişleme yapalım. Bütün harfleri küçük harfe çevirelim, noktalama işaretlerinden kurtulalım ve sayıları da silelim.
Görüldüğü gibi Tweetler temizlenmeye başladı. Şimdi ise dolgu sözcüklerden yani stopwords lerden arınalım. Bunun için nltk isimli kütüphaneyi kullanıyoruz. Bu kütüphane içerisinde, geliştiricilerin çoğu tarafından tercih edilen, bir dolgu-sözcük listesi barındırıyor. Biz ingilizce için olanı seçiyoruz. Dataframe için apply metodunu uygularken de tüm satırları kelimelere bölüyor ve sadece dolgu_sozcukler listesi içinde olmayanları tekrar ekle diyoruz.
Dolgu sözcük işlemimiz tamamlandı.Şimdi kök bulma yöntemi olan lemmatize işlemini yapalım.
Ardından da rt ifadesini temizleyelim.
df[‘metin’] = df[‘metin’].str.replace(‘rt’,”) bunun için yeterli oluyor. Son halimiz aşağıdaki şekilde oluşmuş durumda.
Şimdi daha önce kullandığımız duygu_skoru fonksiyonuyla bir skorlama yapalım.
duygu_skoru(df) diyoruz.
Yukarıdaki tabloda görüldüğü gibi hem küsüratlı bir sentiment_skoru hem de bazı ifadeler Pozitif bazıları Nötr olan sonuçlar elde ettik. Daha şık bir görüntü olması için sonuçları çizgi grafik ile inceleyelim.
Sonuçlara göre Pozitif ve Nötr sonuçlar ortaya çıktı. Pozitif, nötr den biraz daha fazla. Eğer biz sentiment_skoru na göre Pozitif, Nötr, Negatif sınırlarını değiştirseydik daha da farklı bir tablo ortaya çıkabilirdi.
Vader Kullanımı
Textblob’a benzer şekilde kullanılabilen bir başka Python kütüphanesi de Vader’dir. Bu kütüphane ile cümlelerin olumlu mu, nötr mü yoksa olumsuz mu olduğunu görebiliriz.
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzeranalyser = SentimentIntensityAnalyzer()
diyerek kütüphanemizi ekleyip, sınıflandırıcımızı oluşturuyoruz.
def sentiment_analyzer_scores(sentence):
score = analyser.polarity_scores(sentence)
print(“{:-<40} {}”.format(sentence, str(score)))
ile analiz ettiğimiz fonksiyonumuzu tanımlıyoruz.
sentiment_analyzer_scores(“CÜMLE BURAYA GELECEK.”)
ardından CÜMLE BURAYA GELECEK kısmına cümleyi yazıp analiz skorunu öğreniyoruz. Maalesef İngilizce için henüz destek veriyor.
Örnek bir sonuç:
{‘neg’: 0.0, ‘neu’: 0.326, ‘pos’: 0.674, ‘compound’: 0.7351}
Şeklinde olabiliyor. Bu da negatiflik barındırmadığı, pozitif olma ihtimalinin de nötr olma ihtimalinden yüksek olduğu olarak yorumlanabilir.
Güncelleme çalışmaları devam etmektedir.
Son güncelleme: 16 Temmuz 2019
Görüş , öneri , düzeltmelerinizi bugra.ayan@yahoo.com adresine veya Linkedin üzerinden Buğra AYAN profiline gönderebilirsiniz.