Twitter Verileri Üzerinde Duygu Analizi (Sentiment Analysis)

Helin Karadağ
6 min readJul 22, 2023

--

Günümüzde sosyal medya platformları, kişilerin fikirlerini, düşüncelerini ve duygularını paylaşmaları için popüler bir ortam. Bu platformlarda paylaşılan milyonlarca tweet, kullanıcıların görüşlerini anlamak ve toplumun genel duygusal durumunu belirlemek için değerli bir kaynak olabilir. Bu projede, Türkçe tweetler üzerinde duygu analizi yaparak, kullanıcıların duygusal tepkilerini anlamak ve değerli bilgiler elde etmek hedeflenmektedir.

Projenin Amacı

  • Twitter verilerini toplayarak duygu analizi için bir veri seti oluşturmak.
  • Türkçe tweetlerin duygusal durumunu analiz etmek ve duygu polaritesini belirlemek.
  • Duygu analizi sonuçlarını görselleştirmek ve anlamlı bilgiler elde etmek.
  • Elde edilen sonuçları raporlamak ve sunmak.

Kullanılan Yöntemler

  • Veri ön işleme adımlarıyla tweetlerin temizlenmesi ve düzenlenmesi.
  • TextBlob kütüphanesi ile duygu analizi yapılması.
  • Elde edilen sonuçların bir veri çerçevesinde depolanması ve analiz için kullanılması.
  • Görselleştirme araçları ile duygu analizi sonuçlarının kelime bulutları veya grafiklerle görselleştirilmesi.

Bu projenin amacı, verilen Türkçe tweetlerin duygu analizini yaparak ve her bir tweet için duygu polaritesi, duygu özneliği ve duygu değerini (Pozitif, Negatif veya Notr) içeren bir result_df veri çerçevesi oluşturmaktır. Bu veri çerçevesini daha sonra çeşitli analizler, raporlar veya görselleştirmeler için kallanmaktır.

Duygu Analizi İçin Gerekli Kütüphanelerin Yüklenmesi

# Veri manipülasyonu ve analizi
import pandas as pd
# Doğal dil işleme için metin analizi
from textblob import TextBlob
# Metin tabanlı kelime bulutu oluşturma
from wordcloud import WordCloud
# Doğal dil işleme için dil modeli
from nltk.corpus import stopwords
# Veri görselleştirme için
import matplotlib.pyplot as plt
import re

Tweet Verilerinin Yüklenmesi

tweets = pd.read_excel("twitter_lists.xlsx")
#tweets.head()
tweets.shape

------------

(149, 1)
tweets.columns=['origin']
tweets['origin']

------------

0 @TuranHancerli Sayın Başkanım Tahtakale mahall...
1 @TuranHancerli Yeşilken mahallesi imarı bir an...
2 @TuranHancerli sayın başkan daha toplantıda mo...
3 @TuranHancerli sayın başkan toplantinizi takip...
4 @TuranHancerli @cakman4 Açıklamalarınız için ç...
...
144 @avcilarbel Merhaba, Avcılar da kentsel dönüşü...
145 @avcilarbel gümüş pala asker sokaktaki bu ağaç...
146 Sizlerin düzgün atmadığı çöpler, bellerin eğil...
147 Avcılar belediyesi ve zabıtanın bu kadar umurs...
148 @TuranHancerli Avcılar her geçen gün güzelleşi...
Name: origin, Length: 149, dtype: object

Tweetleri Temizleme ve Düzenleme İşlemleri

Metinler genellikle çeşitli gürültü içerir, örneğin URL’ler, kullanıcı adları, hashtag’ler, sayılar, noktalama işaretleri vb. Bu unsurlar, metindeki anlamı etkilemeyen ve analiz sürecini karmaşıklaştıran öğelerdir. Temizleme işlemleri, bu gürültüyü azaltmaya yardımcı olur.

Bu analizde yapılan temizleme ve düzenleme işlemleri:

  • URL’ler kaldırıldı.
  • Kullanıcı adları kaldırıldı.
  • Hashtag’ler kaldırıldı.
  • Sayılar kaldırıldı.
  • Noktalama işaretleri kaldırıldı.
  • Birden fazla boşluk tek bir boşluk ile değiştirildi.
# Tweetleri temizleme ve düzenleme işlemleri için yardımcı fonksiyonlar
def preprocess_tweet(tweet):
# URL'leri kaldırma
tweet = re.sub(r"http\S+|www\S+|https\S+", "", tweet, flags=re.MULTILINE)
# Kullanıcı adlarını kaldırma
tweet = re.sub(r"\@\w+", "", tweet)
# Hashtag'leri kaldırma
tweet = re.sub(r"\#\w+", "", tweet)
# Sayıları kaldırma
tweet = re.sub(r"\d+", "", tweet)
# Noktalama işaretlerini kaldırma
tweet = re.sub(r"[^\w\s]", "", tweet)
# Birden fazla boşluğu tek bir boşlukla değiştirme
tweet = re.sub(r"\s+", " ", tweet).strip()
return tweet
# Temizlenmiş tweetleri cleaned_tweets değişkenine atıyoruz
cleaned_tweets = [preprocess_tweet(tweet) for tweet in tweets['origin']]
# Pandas DataFrame oluşturuyoruz
cleaned_df = pd.DataFrame({'cleaned': cleaned_tweets}
# Varsa boş satırlar kaldırılıyor
cleaned_df.dropna(inplace=True)
# DataFrame'deki boş değer olup-olmadığı kontrol ediliyoruz
cleaned_df.isnull().sum()

--------------

cleaned 0
dtype: int64
cleaned_df

Türkçe Tweetlerin İngilizceye Çevrilmesi

TextBlob, doğal dil işleme işlemleri için kullanılan bir kütüphanedir. Özellikle duygu analizi gibi bazı NLP görevleri, İngilizce metin üzerinde daha iyi performans gösterebilir. Bunun nedeni, TextBlob’un duygu analizi yaparken İngilizce dil kaynaklarını kullanması ve bu kaynakların İngilizce metinlere daha iyi uyarlanmış olmasıdır.

Türkçe metni İngilizceye çevirmenin temel amacı, TextBlob’un duygu analizi yaparken daha iyi sonuçlar vermesini sağlamaktır. İngilizceye çevrilen metin, TextBlob’un duygusal ifadeleri ve kelime anlamlarını daha iyi anlamasına yardımcı olabilir.

Ancak, doğrudan Türkçe metin üzerinde de duygu analizi yapabiliriz. TextBlob, Türkçe dil desteğine de sahip olmasına rağmen, İngilizce dil kaynaklarına göre daha sınırlıdır. Bu nedenle, duygu analizinde daha iyi sonuçlar almak için Türkçe metni İngilizceye çevirme yaklaşımı sıklıkla tercih edilir.

Sonuç olarak, TextBlob kullanarak duygu analizi yaparken Türkçe metni İngilizceye çevirmeniz, daha güçlü ve geniş kapsamlı bir duygu analizi gerçekleştirmemize yardımcı olabilir. Ancak, eğer Türkçe dil kaynaklarına dayalı bir duygu analizi yapmak istersek, Türkçe metni doğrudan kullanabiliriz.

#!pip install googletrans==4.0.0-rc1
# Google Translate API'sini içe aktaralım
from googletrans import Translator

def translate_to_english(tweet):
translator = Translator(service_urls=['translate.google.com'])
try:
tweet_en = translator.translate(tweet, src='tr', dest='en')
return tweet_en.text
except Exception as e:
return ''

translated_tweets = [translate_to_english(tweet) for tweet in cleaned_df['cleaned']]
# Pandas DataFrame oluşturuyoruz
translated_df = pd.DataFrame({'translated' : translated_tweets})
# Varsa boş satırları kaldırıyoruz
translated_df.dropna(inplace=True)
translated_df

TextBlob Kütüphanesi ile Duygu Analizi Yapılması

TextBlob tarafından sağlanan sentiment özellikleri kullanılarak duygu polaritesi (pozitif, negatif veya nötr) ve duygu özneliği değeri belirlenir.

columns = ['translated', 'polarity', 'subjectivity', 'value']
result_df = pd.DataFrame(columns=columns)

for i, tweet in enumerate(translated_df['translated']):
if tweet != '':
analysis = TextBlob(tweet)
result = analysis.sentiment
result_df.loc[i, 'translated'] = tweet
if result.polarity > 0:
result_df.loc[i, 'polarity'] = result.polarity
result_df.loc[i, 'subjectivity'] = result.subjectivity
result_df.loc[i, 'value'] = "Pozitif"
elif result.polarity < 0:
result_df.loc[i, 'polarity'] = result.polarity
result_df.loc[i, 'subjectivity'] = result.subjectivity
result_df.loc[i, 'value'] = "Negatif"
else:
result_df.loc[i, 'polarity'] = result.polarity
result_df.loc[i, 'subjectivity'] = result.subjectivity
result_df.loc[i, 'value'] = "Notr"
result_df

Sonuç Değerlerin Grafiksel Olarak Gösterilmesi

Sonuç değerlerinin grafiksel olarak gösterilmesi, aşağıdaki maddelerdeki gibi verilerin daha görsel ve anlaşılır bir şekilde sunulmasını sağlar.

  • Verilerin anlaşılabilirliğini sağlar.
  • Eğilimleri ve desenleri daha belirgin hale getirir.
  • Karar alma süreçlerini hızlandırır.
# DataFrame'i gruplama
grouped_df = result_df.groupby('value').size()

# Pasta grafiği çizimi
grouped_df.plot(kind='pie', autopct='%1.1f%%')

# Grafiği gösterme
plt.axis('equal') # Daire şeklinde görüntülemek için
plt.show()

Duygu analizi sonucu çıkan grafiği şu şekilde yorumlayabiliriz :

%34,9 nötr: Tweetlerin belirli bir kısmı nötr duyguya sahip. Bu, tweette ne olumlu ne de olumsuz yoğun bir duygu bulunmadığını gösterir.

%14,8 negatif: Tweetlerin az bir kısmı olumsuz duygular içeriyor. Tweetteki olumsuz ifadelerin varlığı, duygunun olumsuz olduğunu gösterir.

%50,3: Tweetlerin büyük kısmı pozitif ve olumlu duygulardan oluşuyor. Tweetteki pozitif ifadelerin varlığı, duygunun olumlu olduğunu gösterir.

Kelime Bulutu Oluşturmak

Kelime bulutu, bir metindeki kelimelerin frekansını ve önemini görsel olarak temsil eden bir grafik veya resimlerdir. Genellikle metindeki en sık kullanılan kelimeleri vurgulamak ve metnin ana konularını veya temalarını görsel olarak göstermek için kullanılır.

# Türkçe stopwords listesini yüklüyoruz
stop_words = set(stopwords.words('turkish'))

# Stopwords Listesini Yeni kelimeler ekliyoruz
new_stop_words = ['bu', 'ya', 'ki', 'mi', 'bir']
stop_words.update(new_stop_words)

# Kelimeleri birleştiriyoruz
text = " ".join(cleaned_tweets)

# Kelime bulutunu oluşturuyoruz
wordcloud = WordCloud(width=800, height=400, background_color="white", stopwords=stop_words).generate(text)

# Kelime bulutunu görselleştiriyoruz
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()

Kelime bulutu, metindeki kelimelerin sıklığını görselleştirerek metindeki önemli kelimeleri belirlemeye ve analiz etmeye yardımcı olur. Bu kelime bulutunda çıkan “Avcılar”, “Başkanım”, “Teşekkürler”, “Lütfen” ve “Güzel” kelimeleri, verilen metinde daha sık geçen ve belirgin olarak öne çıkan kelimeler olarak değerlendirilebilir.

Sonuç olarak bu projede Twitter verileri üzerinden duygu analizi gerçekleştirdik ve kullanıcıların genel duygu durumlarını Python ve gerekli kütüphaneleri kullanarak inceledik, görselleştirdik. Görselleştirme, duygu analizi gibi projelerde önemli bir rol oynar, verileri daha anlaşılır hale getirir, iletişimi hızlandırır, karar vermeyi kolaylaştırır.

--

--