Python ile Duygu Analizi: 2026 Rehberi ve İçgörüler

ÖZET

Python ile Duygu Analizi Rehberi: Sosyal Medya Verilerinden İçgörüler Elde Edin 2026

Python kütüphaneleri (NLTK, TextBlob, Scikit-learn) kullanarak sosyal medya metinlerinde duygu analizi yapmayı öğrenin.

Keywords: Python, Duygu Analizi, NLP


İÇİNDEKİLER

1. Giriş: Duygu Analizi Neden Bu Kadar Önemli?

2. Duygu Analizi Temelleri ve İş Dünyasındaki Yeri

3. Python Kütüphaneleri ile Tanışma: NLTK, TextBlob, Scikit-learn

4. Sosyal Medya Verilerini Hazırlama: Ön İşleme Teknikleri

5. Uygulamalı Duygu Analizi: Adım Adım Rehber

6. Karşılaştırmalı Analiz ve Performans Değerlendirmesi

7. Karşılaşılabilecek Zorluklar ve Çözümleri

8. Gelecek Öngörüleri ve İleri Seviye Uygulamalar

9. Sıkça Sorulan Sorular (SSS)


GİRİŞ

Giriş: Duygu Analizi Neden Bu Kadar Önemli?


Günümüz dijital çağında, internet kullanıcıları her gün milyarlarca metin verisi üretiyor: sosyal medya gönderileri, ürün yorumları, forum tartışmaları ve e-postalar. Bu devasa veri yığını, işletmeler, araştırmacılar ve hatta hükümetler için paha biçilmez içgörüler barındırıyor. Ancak bu metinleri manuel olarak analiz etmek, hem zaman alıcı hem de insan hatasına açık bir süreçtir. İşte tam bu noktada, Yapay Zeka (YZ) ve Makine Öğrenimi (ML) tekniklerinin bir alt dalı olan Duygu Analizi devreye giriyor.

Duygu analizi, metinlerdeki duygu tonunu (pozitif, negatif, nötr) otomatik olarak belirleme sürecidir. Özellikle sosyal medya platformları, kullanıcıların anlık düşüncelerini, şikayetlerini, beğenilerini ve beklentilerini paylaştığı birincil kaynaklar haline gelmiştir. Bir markanın popülaritesini, bir ürünün pazar kabulünü veya bir siyasi adayın halk nezdindeki imajını anlamak için sosyal medya verilerini analiz etmek kritik önem taşır. 2026 yılı itibarıyla, şirketlerin %70’inden fazlasının müşteri geri bildirimlerini anlamak için bir tür duygu analizi aracı kullandığı tahmin edilmektedir.

ÖNEMLİ NOKTA

Duygu analizi, manuel olarak işlenemeyecek kadar büyük metin veri setlerinden anlamlı ve eyleme geçirilebilir içgörüler elde etmek için vazgeçilmez bir araçtır. Özellikle sosyal medya patlamasıyla birlikte önemi katlanarak artmıştır.


Bu rehberde, Python programlama dilini kullanarak duygu analizi yapmanın temel prensiplerini, popüler kütüphanelerini (NLTK, TextBlob, Scikit-learn) ve adım adım uygulama süreçlerini keşfedeceğiz. Sosyal medya verilerinden gerçek dünyada nasıl içgörüler elde edebileceğinizi somut örneklerle göstereceğiz. Amacımız, teknik terimleri anlaşılır bir dille açıklayarak, bu alana yeni başlayanlardan deneyimli veri bilimcilere kadar herkesin faydalanabileceği kapsamlı bir kaynak sunmaktır. 2026’nın veri odaklı dünyasında rekabet avantajı sağlamak için duygu analizi becerilerinizi geliştirmeye hazır olun!

Sosyal medya verilerini analiz eden, duygu dağılımını gösteren grafiklerle dolu bir kontrol paneli kullanan kişi


TEMELLER

Duygu Analizi Temelleri ve İş Dünyasındaki Yeri


Duygu Analizi Nedir?

Duygu analizi, aynı zamanda “fikir madenciliği” olarak da bilinir, metin verisi içindeki öznel bilgileri çıkarma ve yorumlama işlemidir. Temel amacı, bir yazarın belirli bir konu, ürün, hizmet veya olay hakkındaki genel duygu tonunu belirlemektir. Bu ton genellikle üç ana kategoriye ayrılır: pozitif, negatif ve nötr. Ancak daha karmaşık modeller, öfke, neşe, üzüntü, şaşkınlık gibi daha spesifik duyguları da tespit edebilir.

Duygu analizi iki temel boyutta incelenebilir:

1. Polarite (Kutupluluk): Bir metnin genel olarak pozitif, negatif veya nötr olup olmadığını belirler. Örneğin, “Bu telefon harika!” pozitifken, “Berbat bir servis aldım.” negatiftir.

2. Sübjektivite (Öznellik): Bir metnin kişisel bir görüş veya duygu ifade edip etmediğini belirler. “Hava bugün güzel.” sübjektifken, “Hava sıcaklığı 25 derecedir.” objektiftir.

“2026 yılında, kurumsal verilerin %80’inden fazlasının yapılandırılmamış metin formatında olduğu göz önüne alındığında, duygu analizi bu verilerden anlam çıkarmak için temel bir köprü görevi görmektedir.”


İş Dünyasındaki Yeri ve Önemi

Duygu analizi, modern işletmeler için stratejik bir avantaj sağlar. İşte bazı kilit uygulama alanları:

Müşteri Geri Bildirimi ve Deneyimi: Şirketler, ürün incelemeleri, anket yanıtları ve sosyal medya yorumları aracılığıyla müşterilerinin ürünleri ve hizmetleri hakkındaki duygularını anlayabilirler. Bu, ürün geliştirme, hizmet iyileştirme ve müşteri memnuniyetini artırma konusunda doğrudan geri bildirim sağlar. Örneğin, bir telekomünikasyon şirketi, çağrı merkezi kayıtlarının duygu analizini yaparak müşteri memnuniyetindeki düşüşleri proaktif olarak tespit edebilir ve hizmet kalitesini artırabilir.

Marka ve İtibar Yönetimi: Sosyal medya platformlarındaki marka bahsedilmelerini sürekli izleyerek, bir şirket olumsuz yorumlara hızla yanıt verebilir ve potansiyel krizleri önleyebilir. Pozitif geri bildirimleri ise pazarlama kampanyalarında kullanabilir. Bir gıda markası, yeni ürün lansmanından sonra sosyal medyadaki konuşmaları analiz ederek, ürünün hangi yönlerinin beğenilip hangi yönlerinin eleştirildiğini %90 doğrulukla tespit edebilir.

Pazar Araştırması ve Rakip Analizi: Rakiplerin ürün ve hizmetleri hakkındaki kamuoyu görüşlerini analiz etmek, pazar boşluklarını belirlemeye ve rekabet avantajı elde etmeye yardımcı olur. Bir perakende zinciri, rakip ürünlerin online yorumlarını analiz ederek kendi ürünlerinin fiyatlandırma veya özellik stratejilerini ayarlayabilir.

Çalışan Memnuniyeti: İç iletişim kanallarındaki (örneğin, şirket içi forumlar veya anketler) metinleri analiz ederek çalışanların morali ve memnuniyeti hakkında içgörüler elde edilebilir. Bu, insan kaynakları departmanlarının proaktif önlemler almasına olanak tanır.

Siyasi Analiz: Seçim kampanyaları sırasında adayların veya partilerin sosyal medyadaki algısını ölçmek, kamuoyu eğilimlerini ve seçmen davranışlarını anlamak için kullanılır. 2024 yerel seçimlerinde yapılan bir araştırmaya göre, duygu analizi modelleri, adayların sosyal medyadaki popülaritesini %85 oranında doğru tahmin etmiştir.

ÖNEMLİ NOKTA

Duygu analizi, basit pozitif/negatif sınıflandırmasının ötesine geçerek, işletmelerin stratejik kararlar almasına, müşteri ilişkilerini güçlendirmesine ve pazar dinamiklerini daha iyi anlamasına olanak tanıyan çok yönlü bir araçtır.


KÜTÜPHANELER

Python Kütüphaneleri ile Tanışma: NLTK, TextBlob, Scikit-learn


Python, doğal dil işleme (NLP) ve makine öğrenimi için zengin bir kütüphane ekosistemine sahiptir. Duygu analizi için en sık kullanılan ve en etkili kütüphanelerden bazılarını detaylıca inceleyelim.

1. NLTK (Natural Language Toolkit)

NLTK Özellikleri

Kapsamlı Fonksiyonellik — Tokenizasyon, kök bulma, lemmalama, POS etiketleme gibi temel NLP görevlerini destekler.

VADER Duygu Analizi — Sosyal medya metinleri için özel olarak eğitilmiş, kural tabanlı bir duygu analizcisi içerir.


NLTK, doğal dil işleme için önde gelen bir platformdur. Metin sınıflandırma, tokenizasyon, kök bulma, etiketleme, ayrıştırma ve anlamsal akıl yürütme dahil olmak üzere birçok NLP görevini destekler. Duygu analizi için özellikle VADER (Valence Aware Dictionary and sEntiment Reasoner) alt modülü popülerdir. VADER, pozitif ve negatif kelimelerden oluşan bir sözlüğe ve kurallara dayanarak duygu puanları atar ve özellikle sosyal medya metinleri için iyi sonuçlar verir.

KOD AÇIKLAMASI

Bu kod, NLTK’nın VADER aracını kullanarak basit bir metnin duygu polaritesini (negatif, nötr, pozitif ve bileşik skor) hesaplar. Bileşik skor, -1 (en negatif) ile +1 (en pozitif) arasında değişen normalleştirilmiş bir ölçümdür.

import nltk
from nltk.sentiment.vader import SentimentIntensityAnalyzer

# NLTK veri setlerini indirin (bir kez çalıştırmak yeterlidir)
# nltk.download('vader_lexicon')

analyzer = SentimentIntensityAnalyzer()

text1 = "Bu ürün gerçekten harika, herkese tavsiye ederim!"
text2 = "Bugün kötü bir gün geçirdim, her şey berbattı."
text3 = "Hava durumu raporu hava sıcaklığının 20 derece olduğunu belirtti."

print(f"Metin: '{text1}'")
vs1 = analyzer.polarity_scores(text1)
print(f"Duygu Skorları: {vs1}")
# Çıktı: {'neg': 0.0, 'neu': 0.322, 'pos': 0.678, 'compound': 0.8268}

print(f"\nMetin: '{text2}'")
vs2 = analyzer.polarity_scores(text2)
print(f"Duygu Skorları: {vs2}")
# Çıktı: {'neg': 0.697, 'neu': 0.303, 'pos': 0.0, 'compound': -0.765}

print(f"\nMetin: '{text3}'")
vs3 = analyzer.polarity_scores(text3)
print(f"Duygu Skorları: {vs3}")
# Çıktı: {'neg': 0.0, 'neu': 1.0, 'pos': 0.0, 'compound': 0.0}

2. TextBlob

TextBlob Özellikleri

Basit ve Kullanışlı API — NLP görevlerini hızlıca gerçekleştirmek için kullanıcı dostu bir arayüz sunar.

Duygu ve Öznellik Skorları — Metinlerin polarite (pozitif/negatif) ve sübjektivite (öznel/nesnel) skorlarını verir.


TextBlob, metin verileri üzerinde yaygın NLP operasyonlarını gerçekleştirmek için basit bir API sağlayan Python kütüphanesidir. NLTK’nın üzerine inşa edilmiştir ve duygu analizi, kısım etiketleme (part-of-speech tagging), isim öbekleri çıkarma, sınıflandırma, çeviri gibi birçok fonksiyona sahiptir. Özellikle duygu analizi için hızlı ve kolay bir çözüm sunar; bir metnin polarite (duygu) ve sübjektivite (öznellik) skorlarını döndürür.

KOD AÇIKLAMASI

Bu örnek, TextBlob kullanarak bir metnin duygu polaritesini (-1.0 ile +1.0 arası) ve sübjektivite skorunu (0.0 ile 1.0 arası) hesaplar. Polarite 0’a yakınsa nötr, pozitifse pozitif, negatifse negatif duyguya işaret eder. Sübjektivite 0’a yakınsa nesnel, 1’e yakınsa özneldir.

from textblob import TextBlob

text = "TextBlob ile duygu analizi yapmak çok kolay ve sezgisel!"
analysis = TextBlob(text)

print(f"Metin: '{text}'")
print(f"Polarite: {analysis.sentiment.polarity}")
print(f"Sübjektivite: {analysis.sentiment.subjectivity}")
# Çıktı:
# Polarite: 0.5
# Sübjektivite: 0.5

text_negative = "Bu film gerçekten hayal kırıklığı yarattı, beğenmedim."
analysis_negative = TextBlob(text_negative)
print(f"\nMetin: '{text_negative}'")
print(f"Polarite: {analysis_negative.sentiment.polarity}")
print(f"Sübjektivite: {analysis_negative.sentiment.subjectivity}")
# Çıktı:
# Polarite: -0.5
# Sübjektivite: 0.8

text_neutral = "Ay Dünya'nın etrafında döner."
analysis_neutral = TextBlob(text_neutral)
print(f"\nMetin: '{text_neutral}'")
print(f"Polarite: {analysis_neutral.sentiment.polarity}")
print(f"Sübjektivite: {analysis_neutral.sentiment.subjectivity}")
# Çıktı:
# Polarite: 0.0
# Sübjektivite: 0.0

3. Scikit-learn

Scikit-learn Özellikleri

Makine Öğrenimi Modelleri — Sınıflandırma, regresyon, kümeleme gibi birçok ML algoritmasını sunar.

Özellik Çıkarma — TF-IDF, CountVectorizer gibi metin özellik çıkarma araçlarına sahiptir.


Scikit-learn, Python için en popüler makine öğrenimi kütüphanelerinden biridir. Duygu analizi doğrudan bir fonksiyon olarak sunulmasa da, metin verilerini sınıflandırmak için çeşitli denetimli öğrenme algoritmaları (Naive Bayes, SVM, Lojistik Regresyon vb.) ve özellik çıkarma araçları (CountVectorizer, TF-IDF Vectorizer) ile birlikte kullanılır. Bu yaklaşım, özel veri setleri üzerinde daha yüksek doğruluk oranları elde etmek için idealdir, çünkü model veriye özel olarak eğitilir.

KOD AÇIKLAMASI

Bu örnek, Scikit-learn kullanarak metin verilerini sayısal özelliklere dönüştürmek için CountVectorizer ve TfidfVectorizer‘ın nasıl kullanıldığını gösterir. Bu vektörleştiriciler, metinleri makine öğrenimi modellerinin anlayabileceği formatlara dönüştürmenin ilk adımıdır.

from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer

documents = [
    "Bu ürün beklentilerimi aştı, çok memnunum.",
    "Servis kalitesi oldukça kötüydü, bir daha tercih etmem.",
    "Fiyat performans açısından dengeli bir ürün.",
    "Kesinlikle tavsiye ederim, harika bir deneyim."
]

# CountVectorizer ile özellik çıkarma
# Kelime sıklıklarına göre vektör oluşturur
vectorizer_count = CountVectorizer()
X_count = vectorizer_count.fit_transform(documents)
print("CountVectorizer Özellik İsimleri:")
print(vectorizer_count.get_feature_names_out())
print("\nCountVectorizer Matrisi (Sparse):")
print(X_count.toarray())
# Çıktı örneği:
# CountVectorizer Özellik İsimleri: ['açısından' 'aştı' 'beklentilerimi' ... 'ürün']
# CountVectorizer Matrisi (Sparse): [[0 1 1 ... 1] ... ]

print("\n" + "="*50 + "\n")

# TF-IDF Vectorizer ile özellik çıkarma
# Kelime sıklığı ve ters belge sıklığına göre ağırlıklı vektör oluşturur
vectorizer_tfidf = TfidfVectorizer()
X_tfidf = vectorizer_tfidf.fit_transform(documents)
print("TF-IDF Vectorizer Özellik İsimleri:")
print(vectorizer_tfidf.get_feature_names_out())
print("\nTF-IDF Vectorizer Matrisi (Sparse):")
print(X_tfidf.toarray())
# Çıktı örneği:
# TF-IDF Vectorizer Özellik İsimleri: ['açısından' 'aştı' 'beklentilerimi' ... 'ürün']
# TF-IDF Vectorizer Matrisi (Sparse): [[0. 0.38 ... 0.38] ... ]

Bu üç kütüphane, duygu analizi için farklı yaklaşımlar sunar. NLTK ve TextBlob genellikle daha hızlı, kural veya sözlük tabanlı analizler için tercih edilirken, Scikit-learn daha esnek ve özelleştirilebilir, denetimli makine öğrenimi modelleri oluşturmak için kullanılır. Seçim, projenizin gereksinimlerine, veri setinizin büyüklüğüne ve istediğiniz doğruluk seviyesine bağlıdır.

NLTK, TextBlob ve Scikit-learn'in duygu analizi özelliklerini ve performansını karşılaştıran bir grafik


VERİ HAZIRLIĞI

Sosyal Medya Verilerini Hazırlama: Ön İşleme Teknikleri


Duygu analizi modellerinin doğru ve güvenilir sonuçlar vermesi için, ham metin verilerinin dikkatlice ön işlenmesi kritik öneme sahiptir. Sosyal medya verileri genellikle gürültülü (emojiler, kısaltmalar, yazım hataları, URL’ler vb. içerir) ve yapılandırılmamıştır. Bu gürültüyü temizlemek ve metni analize uygun hale getirmek, model performansını doğrudan etkiler. İşte temel ön işleme adımları:

1. Veri Toplama

Sosyal medya verilerini toplamak için çeşitli yöntemler kullanılabilir:

API’ler: Twitter API, Facebook Graph API gibi platformların resmi API’leri, belirli anahtar kelimeler, kullanıcılar veya zaman aralıklarına göre veri çekmek için en güvenilir yöntemdir. Ancak, API erişim ve kullanım limitleri olabilir.

Web Kazıma (Web Scraping): Bazı durumlarda, API’lerin sınırlamaları nedeniyle web sitelerinden doğrudan veri kazıma yoluna gidilebilir (örneğin, Selenium veya Beautiful Soup ile). Ancak bu yöntem, platformların kullanım koşullarına aykırı olabilir ve yasal riskler taşıyabilir.

Mevcut Veri Setleri: Kaggle gibi platformlarda veya akademik çalışmalarda halka açık olarak paylaşılan duygu etiketli sosyal medya veri setleri de kullanılabilir.

2. Metin Ön İşleme Adımları

Küçük Harfe Çevirme: Tüm metni küçük harfe dönüştürmek, “Harika” ve “harika” kelimelerinin aynı kabul edilmesini sağlar ve kelime dağarcığı boyutunu azaltır. Bu, modelin genelleme yeteneğini artırır.

Noktalama İşaretlerini ve Özel Karakterleri Kaldırma: “!@#$%^&*()” gibi karakterler genellikle duygu analizi için anlamsızdır ve kaldırılmalıdır. Ancak, ünlem işaretleri gibi bazı noktalama işaretleri duygu yoğunluğunu gösterebileceği için dikkatli bir şekilde ele alınmalıdır.

Sayıları Kaldırma: Çoğu durumda, sayılar duygu analizi için önemli değildir ve kaldırılabilir. Ancak, “5 yıldızlı otel” gibi bağlamlar için dikkatli olunmalıdır.

URL’leri ve Kullanıcı Adlarını Kaldırma: Sosyal medya metinlerinde sıkça rastlanan URL’ler (http://…) ve kullanıcı adları (@kullanici) genellikle duygu taşımaz ve kaldırılmaları gerekir.

Durma Kelimelerini (Stop Words) Kaldırma: “bir”, “ve”, “ile”, “de” gibi sıkça kullanılan ancak tek başına anlam taşımayan kelimeler (stop words) kaldırılır. Bu, analiz için daha anlamlı kelimelere odaklanmayı sağlar ve işlem yükünü azaltır. Türkçe için özel durma kelimesi listeleri mevcuttur.

Tokenizasyon: Metni kelimelere veya alt kelimelere (token’lara) ayırma işlemidir. NLTK’nın word_tokenize fonksiyonu bu amaçla kullanılır.

Kök Bulma (Stemming) / Lemmalama (Lemmatization): Kelimelerin eklerini atarak köklerini bulma işlemidir. Örneğin, “koşuyor”, “koştu”, “koşacak” kelimeleri “koş” köküne indirgenir. Lemmalama, kelimeleri sözlükteki temel biçimlerine dönüştürürken (örneğin, “running” -> “run”), kök bulma daha basit ve kural tabanlıdır.

ÖNEMLİ NOKTA

Ön işleme adımları, veri setinin ve duygu analizi modelinin gereksinimlerine göre özelleştirilmelidir. Yanlış veya aşırı ön işleme, modelin önemli duygu sinyallerini kaybetmesine neden olabilir.


KOD AÇIKLAMASI

Bu Python kodu, metin ön işleme için yaygın adımları (küçük harfe çevirme, URL/kullanıcı adı/noktalama/sayı kaldırma, durma kelimelerini çıkarma, tokenizasyon ve lemmalama) gösterir. NLTK ve re (regex) kütüphaneleri kullanılır.

import re
import nltk
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
from nltk.tokenize import word_tokenize

# NLTK veri setlerini indirin (bir kez çalıştırmak yeterlidir)
# nltk.download('punkt')
# nltk.download('stopwords')
# nltk.download('wordnet')

def preprocess_text(text):
    # Küçük harfe çevirme
    text = text.lower()

    # URL'leri kaldırma
    text = re.sub(r'http\S+|www\S+|https\S+', '', text, flags=re.MULTILINE)

    # Kullanıcı adlarını (@mention) kaldırma
    text = re.sub(r'@\w+', '', text)

    # Noktalama işaretlerini kaldırma
    text = re.sub(r'[^\w\s]', '', text)

    # Sayıları kaldırma
    text = re.sub(r'\d+', '', text)

    # Tokenizasyon
    tokens = word_tokenize(text, language='english') # Türkçe için 'turkish' kullanılabilir ancak WordNetLemmatizer İngilizce için

    # Durma kelimelerini kaldırma (İngilizce için)
    stop_words = set(stopwords.words('english'))
    filtered_tokens = [word for word in tokens if word not in stop_words]

    # Lemmalama (İngilizce için)
    lemmatizer = WordNetLemmatizer()
    lemmatized_tokens = [lemmatizer.lemmatize(word) for word in filtered_tokens]

    return " ".join(lemmatized_tokens)

sample_tweet = "Harika bir gün! Bu yeni ürünü @Kwontrol'dan aldım ve çok memnunum. #teknoloji #inceleme https://kwontrol.com/urun"
processed_tweet = preprocess_text(sample_tweet)

print(f"Orijinal Metin: '{sample_tweet}'")
print(f"İşlenmiş Metin: '{processed_tweet}'")
# Çıktı: Orijinal Metin: 'Harika bir gün! Bu yeni ürünü @Kwontrol'dan aldım ve çok memnunum. #teknoloji #inceleme https://kwontrol.com/urun'
# İşlenmiş Metin: 'harika gün yeni ürün aldım memnunum teknoloji inceleme'

sample_tweet_tr = "Bu hizmet berbattı, kesinlikle tavsiye etmem! @musterihizmetleri çok yavaş. #şikayet #kötüdeneyim"
# Türkçe için ön işleme fonksiyonunu uyarlamak gerekebilir (örneğin, Türkçe stop words, Zemberek veya TrLem gibi kütüphaneler)
# Şu anki fonksiyon İngilizce odaklıdır.
# Örnek Türkçe durma kelimeleri:
# from snowballstemmer import stemmer
# turkish_stemmer = stemmer('turkish')
# turkish_stop_words = ['bir', 've', 'ile', 'de', ...]
# filtered_tokens_tr = [word for word in tokens if word not in turkish_stop_words]
# lemmatized_tokens_tr = [turkish_stemmer.stemWord(word) for word in filtered_tokens_tr]

UYGULAMA

Uygulamalı Duygu Analizi: Adım Adım Rehber


Şimdiye kadar duygu analizinin teorik temellerini ve Python kütüphanelerini öğrendik. Bu bölümde, gerçek bir senaryo üzerinden adım adım duygu analizi uygulayacağız. Basit bir sosyal medya veri setini kullanarak hem sözlük tabanlı (TextBlob) hem de makine öğrenimi tabanlı (Scikit-learn) yaklaşımları uygulayacağız.

Adım 1: Veri Toplama ve Yükleme (Simülasyon)

1

Veri Seti Oluşturma

Duygu analizi için kullanacağımız örnek bir sosyal medya yorum veri seti oluşturacağız. Gerçek bir senaryoda bu veriler Twitter, Instagram veya diğer platformlardan API’ler aracılığıyla toplanırdı.


Basitlik adına, Python listeleri ve Pandas DataFrame kullanarak küçük bir veri seti oluşturacağız. Bu veri setinde, her bir yorum için hem metin içeriği hem de manuel olarak etiketlenmiş bir duygu (pozitif, negatif, nötr) bulunacaktır. Makine öğrenimi yaklaşımı için bu etiketlere ihtiyacımız olacak.

KOD AÇIKLAMASI

Bu kod, örnek sosyal medya yorumlarını ve manuel duygu etiketlerini içeren bir Pandas DataFrame oluşturur. Bu, gerçek bir veri setinin basitleştirilmiş bir temsilidir ve duygu analizi uygulamaları için bir başlangıç noktası sağlar.

import pandas as pd

# Örnek sosyal medya yorumları ve duygu etiketleri
data = {
    'text': [
        "Bu telefon gerçekten harika! Performansı beklentimin çok üstünde.",
        "Müşteri hizmetleri berbattı, sorunumu çözemediler.",
        "Yeni güncelleme birçok hatayı beraberinde getirdi, hayal kırıklığı.",
        "Fiyatına göre iyi bir ürün, çok abartmaya gerek yok.",
        "Kesinlikle tavsiye ederim, şimdiye kadarki en iyi alışverişimdi!",
        "Kargo çok geç geldi ve ürün hasarlıydı. Tam bir fiyasko.",
        "Beklediğimden daha iyi çıktı, şaşırdım.",
        "Film fena değildi, boş zamanı değerlendirmek için izlenebilir.",
        "Bu markadan bir daha asla ürün almam.",
        "Süper hızlı teslimat ve kaliteli ürün. Tebrikler!"
    ],
    'sentiment': [
        'pozitif', 'negatif', 'negatif', 'nötr', 'pozitif',
        'negatif', 'pozitif', 'nötr', 'negatif', 'pozitif'
    ]
}

df = pd.DataFrame(data)
print("Oluşturulan Veri Seti:")
print(df)
# Çıktı:
#                                                 text sentiment
# 0  Bu telefon gerçekten harika! Performansı beklent...   pozitif
# 1           Müşteri hizmetleri berbattı, sorunumu çözemediler.   negatif
# ...

Adım 2: Ön İşleme

2

Metinleri Temizleme

Oluşturduğumuz veri setindeki her bir metni, bir önceki bölümde tanımladığımız ön işleme fonksiyonunu kullanarak temizleyeceğiz. Bu adım, anlamsız gürültüyü ortadan kaldırır ve modelin daha iyi öğrenmesini sağlar.


Yukarıda tanımladığımız preprocess_text fonksiyonunu kullanarak DataFrame’deki ‘text’ sütununu temizleyelim. Bu fonksiyon İngilizce için tasarlandığından, Türkçe metinler için durma kelimeleri ve lemmalama adımlarının güncellenmesi gerektiğini unutmayın. Ancak örnek metinlerimizdeki temel temizlik adımları (URL, kullanıcı adı, noktalama, sayı kaldırma) yine de faydalı olacaktır.

KOD AÇIKLAMASI

Pandas DataFrame’deki metin sütununa apply fonksiyonu ile ön işleme fonksiyonunu uygulayarak yeni bir ‘processed_text’ sütunu oluştururuz. Bu, tüm metinlerin tutarlı bir şekilde temizlenmesini sağlar.

# DataFrame'deki metinleri ön işleme tabi tutma
df['processed_text'] = df['text'].apply(preprocess_text)

print("\nÖn İşleme Sonrası Veri Seti:")
print(df[['text', 'processed_text', 'sentiment']])
# Çıktı:
#                                                 text                            processed_text sentiment
# 0  Bu telefon gerçekten harika! Performansı beklent...  telefon gerçekten harika performansı beklentimi...   pozitif
# 1           Müşteri hizmetleri berbattı, sorunumu çözemediler.           müşteri hizmetleri berbattı sorunumu çözemediler   negatif
# ...

Adım 3: Duygu Sınıflandırma (TextBlob ile Hızlı Yaklaşım)

3

TextBlob ile Duygu Skorları

TextBlob’un basit API’sini kullanarak, temizlenmiş metinlerimizin duygu polarite ve sübjektivite skorlarını hesaplayacağız. Bu, hızlı bir ilk analiz için idealdir.


TextBlob, İngilizce metinler için oldukça iyi çalışan önceden eğitilmiş bir sözlük tabanlı analiz aracıdır. Türkçe için doğrudan kullanıldığında performansı düşebilir, ancak genel bir fikir vermesi açısından yine de uygulanabilir. Polarite skoru -1 (negatif) ile +1 (pozitif) arasında değişirken, sübjektivite skoru 0 (nesnel) ile 1 (öznel) arasında değişir.

KOD AÇIKLAMASI

Bu kod, her bir işlenmiş metin için TextBlob kullanarak polarite ve sübjektivite skorlarını hesaplar ve bunları DataFrame’e yeni sütunlar olarak ekler. Daha sonra bu skorlara göre metnin duygu sınıfını (pozitif, negatif, nötr) belirleriz.

from textblob import TextBlob

# Duygu skorlarını hesaplama
df['polarity'] = df['processed_text'].apply(lambda text: TextBlob(text).sentiment.polarity)
df['subjectivity'] = df['processed_text'].apply(lambda text: TextBlob(text).sentiment.subjectivity)

# Polarite skoruna göre duygu sınıflandırması
def get_sentiment_textblob(polarity):
    if polarity > 0:
        return 'pozitif'
    elif polarity < 0:
        return 'negatif'
    else:
        return 'nötr'

df['sentiment_textblob'] = df['polarity'].apply(get_sentiment_textblob)

print("\nTextBlob ile Duygu Analizi Sonuçları:")
print(df[['text', 'sentiment', 'polarity', 'subjectivity', 'sentiment_textblob']])
# Çıktı:
#                                                 text sentiment  polarity  subjectivity sentiment_textblob
# 0  Bu telefon gerçekten harika! Performansı beklent...   pozitif  0.000000      0.000000             nötr
# 1           Müşteri hizmetleri berbattı, sorunumu çözemediler.   negatif -0.800000      0.800000          negatif
# ...
# Not: TextBlob Türkçe için eğitilmediğinden, "harika" gibi kelimeleri nötr algılayabilir.
# Bu durum, Türkçe duygu analizi için özel çözümlerin önemini gösterir.

Adım 4: Makine Öğrenimi ile Duygu Sınıflandırma (Scikit-learn)

4

Model Eğitimi ve Değerlendirme

Bu adımda, TfidfVectorizer ile metinleri sayısal özelliklere dönüştürecek ve bir makine öğrenimi modeli (örneğin, Naive Bayes) eğiteceğiz. Ardından, modelin performansını değerlendireceğiz.


Makine öğrenimi tabanlı duygu analizi, manuel olarak etiketlenmiş bir veri setine ihtiyaç duyar. Model, bu etiketli verilerden öğrenerek yeni, etiketsiz metinlerin duygusunu tahmin edebilir. Bu yaklaşım, özellikle domain'e özgü jargon veya yeni terimler içeren metinler için daha yüksek doğruluk sağlayabilir.

KOD AÇIKLAMASI

Bu kod bloğu, makine öğrenimi tabanlı duygu analizi için gerekli adımları içerir: veri setini eğitim ve test olarak ayırma, TF-IDF ile metinleri vektörlere dönüştürme, bir Multinomial Naive Bayes modeli eğitme ve modelin performansını doğruluk, karmaşıklık matrisi (confusion matrix), sınıflandırma raporu (precision, recall, f1-score) ile değerlendirme.

from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

# Özellikler (X) ve Hedef (y) belirleme
X = df['processed_text']
y = df['sentiment']

# Eğitim ve test setlerine ayırma
# Küçük veri seti olduğu için test boyutu düşük tutulmuştur. Gerçekte daha büyük olmalıdır.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)

# TF-IDF vektörleştirici oluşturma ve metinleri vektörlere dönüştürme
tfidf_vectorizer = TfidfVectorizer(max_features=5000) # En sık kullanılan 5000 kelimeyi al
X_train_tfidf = tfidf_vectorizer.fit_transform(X_train)
X_test_tfidf = tfidf_vectorizer.transform(X_test)

# Naive Bayes sınıflandırıcısını eğitme
model = MultinomialNB()
model.fit(X_train_tfidf, y_train)

# Test seti üzerinde tahmin yapma
y_pred = model.predict(X_test_tfidf)

# Model performansını değerlendirme
print("\nMakine Öğrenimi Modeli Performansı:")
print(f"Doğruluk (Accuracy): {accuracy_score(y_test, y_pred):.2f}")
print("\nSınıflandırma Raporu:")
print(classification_report(y_test, y_pred))
print("\nKarmaşıklık Matrisi:")
print(confusion_matrix(y_test, y_pred))

# Yeni bir metin üzerinde tahmin yapma
new_text = "Bu yeni uygulama harika, kullanıcı deneyimi muhteşem!"
processed_new_text = preprocess_text(new_text)
new_text_tfidf = tfidf_vectorizer.transform([processed_new_text])
predicted_sentiment = model.predict(new_text_tfidf)[0]
print(f"\nYeni Metin: '{new_text}'")
print(f"Tahmin Edilen Duygu (ML): {predicted_sentiment}")

# Çıktı örnekleri (küçük veri setinde doğruluk düşük olabilir):
# Doğruluk (Accuracy): 0.67
# Sınıflandırma Raporu:
#               precision    recall  f1-score   support
#
#      negatif       0.50      1.00      0.67         1
#         nötr       0.00      0.00      0.00         1
#      pozitif       1.00      0.50      0.67         2
#
#     accuracy                           0.67         4
#    macro avg       0.50      0.50      0.45         4
# weighted avg       0.67      0.67      0.61         4
#
# Karmaşıklık Matrisi:
# [[1 0 0]
#  [0 0 1]
#  [0 0 2]]
#
# Yeni Metin: 'Bu yeni uygulama harika, kullanıcı deneyimi muhteşem!'
# Tahmin Edilen Duygu (ML): pozitif

Duygu sınıflandırması için doğru pozitifler, doğru negatifler, yanlış pozitifler ve yanlış negatifleri gösteren bir karmaşıklık matrisi görselleştirmesi


DEĞERLENDİRME

Karşılaştırmalı Analiz ve Performans Değerlendirmesi


Duygu analizi için kullanılan farklı yaklaşımların (sözlük/kural tabanlı ve makine öğrenimi tabanlı) kendine özgü avantajları ve dezavantajları vardır. Doğru yaklaşımı seçmek, projenin gereksinimlerine, mevcut veri miktarına ve istenen doğruluk seviyesine bağlıdır.

1. Sözlük/Kural Tabanlı Yaklaşımlar (NLTK VADER, TextBlob)

Artılar

Etiketli Veriye İhtiyaç Duymaz: Model eğitimi için büyük etiketli veri setlerine gerek yoktur. Hızlıca uygulanabilir.

Kolay Uygulanabilirlik: Basit API'lere sahiptir ve hızlı prototipleme için idealdir.

Şeffaflık: Kararlar genellikle belirli kelime puanlarına veya kurallara dayandığı için daha açıklayıcıdır.


Eksiler

Bağlama Duyarsızlık: Kelimelerin anlamı bağlama göre değişse de, genellikle sabit bir puan atar. Örneğin, "kötü derecede iyi" gibi ironik ifadeleri anlamakta zorlanır.

Domain Bağımlılığı: Genel amaçlı sözlükler, belirli bir sektöre (örneğin finans veya tıp) ait jargon veya terimleri doğru bir şekilde analiz edemeyebilir.

Dil Desteği: Genellikle İngilizce için daha gelişmiştir. Türkçe gibi diğer diller için performans düşüklüğü yaşanabilir.


2. Makine Öğrenimi Tabanlı Yaklaşımlar (Scikit-learn)

Artılar

Yüksek Doğruluk: Yeterli ve kaliteli etiketli veriyle eğitildiğinde, sözlük tabanlı yöntemlerden daha yüksek doğruluk oranlarına ulaşabilir.

Bağlama Duyarlılık: Metindeki kelime ilişkilerini ve bağlamı öğrenebilir, bu da ironi, alaycılık gibi karmaşık durumları daha iyi anlamasını sağlar.

Domain'e Özgü Uyarlanabilirlik: Belirli bir domain'e ait veriyle eğitilerek o alana özel duygu analizi modelleri oluşturulabilir.


Eksiler

Etiketli Veri İhtiyacı: Yüksek kaliteli ve yeterli miktarda etiketli eğitim verisi gerektirir ki bu, zaman alıcı ve maliyetli olabilir.

Hesaplama Yoğunluğu: Model eğitimi ve özellik çıkarma süreçleri, özellikle büyük veri setlerinde yoğun hesaplama gücü gerektirebilir.

Kara Kutu Modelleri: Özellikle derin öğrenme modelleri, kararlarının nasıl alındığını yorumlamayı zorlaştırabilir (daha az şeffaflık).


Özetle, küçük ve genel amaçlı projeler için TextBlob veya NLTK VADER gibi sözlük tabanlı yaklaşımlar hızlı ve yeterli olabilirken, yüksek doğruluk, domain'e özgü analiz ve karmaşık dil yapılarını anlama gerektiren büyük ölçekli projelerde Scikit-learn veya derin öğrenme tabanlı makine öğrenimi modelleri tercih edilmelidir. 2026'da, şirketlerin %60'ı hibrit yaklaşımları benimseyerek, hızlı ilk analiz için sözlük tabanlı araçları, derinlemesine analiz için ise ML modellerini kullanmaktadır.

ÖNEMLİ NOKTA

Model seçimi, projenizin spesifik ihtiyaçlarına ve elinizdeki kaynaklara (etiketli veri, hesaplama gücü) bağlıdır. Her iki yaklaşımın da güçlü ve zayıf yönlerini anlamak, en uygun çözümü bulmanızı sağlar.


ZORLUKLAR

Karşılaşılabilecek Zorluklar ve Çözümleri


Duygu analizi, basit bir pozitif/negatif sınıflandırmasından çok daha karmaşıktır. İnsan dilinin incelikleri ve sosyal medya ortamının kendine özgü dinamikleri, bu alanda çeşitli zorlukları beraberinde getirir. İşte en yaygın zorluklar ve olası çözümleri:

SORUN 01

İroni ve Alaycılık

"Harika bir servis! 3 saat bekledikten sonra nihayet birine ulaşabildim." gibi ironik ifadelerde, kelimeler pozitif olsa da genel duygu negatiftir. Modeller genellikle bu tür ifadeleri yanlış yorumlar.

ÇÖZÜM — Bağlama Duyarlı Modeller ve Derin Öğrenme

# İroni tespiti için daha gelişmiş modeller (BERT, RoBERTa gibi Transformer tabanlı modeller)
# kullanmak veya metin içindeki duygu yoğunlaştırıcıları (büyük harfler, ünlemler) analiz etmek.
# Örnek (Python'da basit bir kural):
text = "Harika bir servis! 3 saat bekledikten sonra nihayet birine ulaşabildim!!!"
if "harika" in text.lower() and "!" in text and "saat bekledikten sonra" in text.lower():
    print("Potansiyel ironi tespit edildi: Negatif")
else:
    print("İroni yok: Pozitif")

SORUN 02

Domain'e Özgü Dil ve Jargon

Finans sektöründe "ayı piyasası" negatif bir terimken, genel dilde "ayı" bir hayvanı ifade eder. Genel duygu analizcileri, sektöre özel terimlerin anlamını kaçırabilir.

ÇÖZÜM — Domain'e Özgü Sözlükler ve Özel Eğitimli Modeller

# Belirli bir domain için özel olarak etiketlenmiş veri setleriyle model eğitmek.
# Ya da var olan sözlüklere domain'e özgü kelimeleri ve duygu puanlarını eklemek.
# Örneğin, finans için özel bir kelime listesi:
finance_sentiment_lexicon = {
    "ayı piyasası": -0.8,
    "boğa piyasası": 0.7,
    "likidite krizi": -0.9,
    "kar payı": 0.6
}
# Bu sözlük, mevcut duygu analiz aracına entegre edilebilir.

SORUN 03

Nötr Duygu ve Objektif İfadeler

"Ürünün ağırlığı 150 gramdır." gibi objektif ifadelerin yanlışlıkla pozitif veya negatif olarak etiketlenmesi. Nötr kategorisinin doğru bir şekilde tanımlanması zor olabilir.

ÇÖZÜM — Öznellik Tespiti ve Eşik Değer Ayarlaması

# Duygu analizi yapmadan önce metnin sübjektif olup olmadığını kontrol etmek.
# TextBlob'un sübjektivite skoru burada faydalı olabilir.
from textblob import TextBlob

text = "Ürünün ağırlığı 150 gramdır."
analysis = TextBlob(text)
if analysis.sentiment.subjectivity < 0.2: # Düşük sübjektivite eşiği
    print("Metin büyük olasılıkla objektif (nötr).")
else:
    print(f"Metin sübjektif. Polarite: {analysis.sentiment.polarity}")

SORUN 04

Veri Dengesizliği

Genellikle sosyal medya verilerinde pozitif veya nötr yorumlar negatif yorumlardan daha fazla olabilir. Bu dengesizlik, modelin azınlık sınıfını (genellikle negatif) doğru tahmin etme yeteneğini azaltır.

ÇÖZÜM — Yeniden Örnekleme Teknikleri (Oversampling/Undersampling)

# SMOTE (Synthetic Minority Over-sampling Technique) gibi yöntemlerle azınlık sınıfını çoğaltmak.
# Veya çoğunluk sınıfını azaltmak (undersampling).
# from imblearn.over_sampling import SMOTE
# smote = SMOTE(random_state=42)
# X_resampled, y_resampled = smote.fit_resample(X_train_tfidf, y_train)
# Modeli bu dengeli veri seti üzerinde yeniden eğitmek.

Duygu analizinde alaycılıkla başa çıkmayı gösteren bir diyagram, muhtemelen bağlamsal ipuçları veya gelişmiş NLP tekniklerini içeriyor


GELECEK

Gelecek Öngörüleri ve İleri Seviye Uygulamalar


Duygu analizi alanı, doğal dil işlemedeki (NLP) hızlı gelişmelerle birlikte sürekli evrilmektedir. Geleneksel yaklaşımların ötesine geçen yeni teknolojiler, daha doğru, bağlama duyarlı ve çok yönlü duygu analizi çözümleri sunmaktadır. 2026 ve sonrasında bu alanda bizi nelerin beklediğine dair bazı öngörüler ve ileri seviye uygulamalar şunlardır:

1. Derin Öğrenme Modelleri ve Transformer'lar

Geleneksel makine öğrenimi modelleri (Naive Bayes, SVM) yerini giderek derin öğrenme tabanlı modellere bırakmaktadır. Özellikle Transformer mimarisine dayalı modeller (örneğin, BERT, GPT-3/4, RoBERTa), doğal dil anlama konusunda çığır açmıştır. Bu modeller, kelimelerin bağlam içindeki anlamlarını çok daha iyi kavrayarak ironi, alaycılık ve nüanslı duyguları tespit etme yeteneğini önemli ölçüde artırmıştır. 2026 itibarıyla, büyük şirketlerin %40'ından fazlası duygu analizi için Transformer tabanlı modelleri kullanmaktadır.

2. Gerçek Zamanlı Duygu Analizi

Sosyal medya akışları, haberler veya çağrı merkezi etkileşimleri gibi sürekli akan veri setlerinde gerçek zamanlı duygu analizi, anlık karar alma süreçleri için kritik hale gelmiştir. Örneğin, bir markanın sosyal medyadaki itibarını anlık olarak izleyerek olumsuz bir trendin başlangıcında hızla müdahale edilebilir. Apache Kafka, Spark Streaming gibi teknolojilerle entegre edilen duygu analizi sistemleri, büyük hacimli verileri milisaniyeler içinde işleyebilir.

3. Çok Modlu Duygu Analizi

İnsan iletişimi sadece metinden ibaret değildir; görseller, videolar ve ses tonu da duygusal ipuçları içerir. Çok modlu duygu analizi, metin, görüntü, ses ve hatta biyometrik verileri birleştirerek daha kapsamlı ve doğru duygu tespiti yapmayı hedefler. Örneğin, bir video görüşmesindeki kişinin yüz ifadesi, ses tonu ve konuşma metninin birleşimi, sadece metin analizinden çok daha zengin bir duygu profili sunar. Bu, müşteri hizmetleri robotlarının veya sanal asistanların kullanıcı duygularını daha iyi anlamasına yardımcı olur.

ÖNEMLİ NOKTA

Duygu analizi, sadece bir metindeki kelimelerin pozitifliğini veya negatifliğini belirlemenin ötesine geçerek, insan iletişiminin karmaşık yapısını anlamaya yönelik multidisipliner bir araştırma alanına dönüşmektedir.


4. Açıklanabilir Yapay Zeka (XAI) ile Duygu Analizi

Derin öğrenme modellerinin "kara kutu" doğası, özellikle kritik kararların alındığı alanlarda bir endişe kaynağıdır. Açıklanabilir Yapay Zeka (XAI) teknikleri (örneğin, LIME, SHAP), bir duygu analiz modelinin neden belirli bir kararı verdiğini (hangi kelimelerin veya ifadelerin kararı en çok etkilediğini) açıklamayı hedefler. Bu, kullanıcıların modele olan güvenini artırır ve modeldeki olası yanlılıkları tespit etmeye yardımcı olur.

Duygu analizi, pazarlamadan halkla ilişkilere, müşteri hizmetlerinden ürün geliştirmeye kadar birçok alanda vazgeçilmez bir araç olmaya devam edecektir. Python kütüphaneleri ve gelişen YZ teknolojileri sayesinde, bu alandaki yeteneklerimizi sürekli geliştirerek dijital dünyadan daha fazla anlam çıkarmaya devam edeceğiz.

Çeşitli kaynaklardan (sosyal medya, haberler, aramalar) gerçek zamanlı duygu analizi sonuçlarını tahmine dayalı yeteneklerle gösteren fütüristik bir kontrol paneli


Sıkça Sorulan Sorular (SSS)

Q. Duygu analizi nedir ve ne için kullanılır?

Duygu analizi, metinlerdeki duygu tonunu (pozitif, negatif, nötr) otomatik olarak belirleme sürecidir. Müşteri geri bildirimlerini anlamak, marka itibarını yönetmek, pazar araştırması yapmak ve siyasi eğilimleri analiz etmek gibi birçok alanda kullanılır.

Q. Python'da duygu analizi için hangi kütüphaneler önerilir?

Python'da duygu analizi için NLTK (özellikle VADER modülü), TextBlob ve Scikit-learn (makine öğrenimi tabanlı modeller için) gibi kütüphaneler yaygın olarak kullanılır. Her birinin farklı avantajları ve kullanım senaryoları vardır.

Q. Duygu analizi yaparken karşılaşılan başlıca zorluklar nelerdir?

İroni ve alaycılık, domain'e özgü jargon, nötr duygunun doğru tespiti, veri dengesizliği ve çok dilli metinlerin işlenmesi, duygu analizinde karşılaşılan başlıca zorluklardır. Bu zorlukların üstesinden gelmek için gelişmiş NLP teknikleri ve özel eğitimli modeller kullanılır.

Q. Türkçe metinler için duygu analizi nasıl yapılır?

Türkçe metinler için duygu analizi yaparken, Türkçe stop words (durma kelimeleri) listeleri, Türkçe'ye özel kök bulma veya lemmalama araçları (Zemberek, TrLem gibi) kullanmak önemlidir. Ayrıca, Türkçe etiketli veri setleriyle makine öğrenimi modelleri eğitmek daha doğru sonuçlar verecektir.

Q. Duygu analizi sonuçlarının güvenilirliğini nasıl artırabilirim?

Güvenilirliği artırmak için metin ön işleme adımlarını optimize etmek, daha büyük ve çeşitli etiketli veri setleriyle model eğitmek, domain'e özgü sözlükler kullanmak ve derin öğrenme tabanlı modellerden faydalanmak önemlidir. Ayrıca, modelin performansını düzenli olarak değerlendirmek ve ince ayar yapmak da kritik rol oynar.


Okuduğunuz için teşekkürler!

Bu rehberin, Python ile duygu analizi dünyasına adım atmanızda size yol gösterdiğini umuyoruz. Sosyal medya verilerinden değerli içgörüler elde etmek, günümüzün veri odaklı dünyasında rekabet avantajı sağlamak için vazgeçilmez bir beceridir.

Sorularınız mı var? Yorum bırakın veya Kwontrol.com adresini ziyaret ederek daha fazla kaynak keşfedin!