Duygu Analizi ve Kelime İşleme

Eren İLERİ

2024-12-12

Giriş

Bu doküman, Airbnb yorumları üzerinde kelime analizi ve duygu analizi işlemlerini gerçekleştirmek üzere hazırlanmıştır. Aşağıdaki adımlar, veri temizleme, kelime bulutu oluşturma ve duygu analizi işlemlerini kapsar.


0. Kütüphanelerin Yüklenmesi

Gerekli kütüphanelerin kurulumu ve yüklenmesi:

library(tm)
library(tidyr)
library(tidytext)
library(wordcloud2)
library(syuzhet)
library(ggplot2)
library(sentimentr)
library(dplyr)
library(stringr)
library(pander)
  1. Veri Temizleme İşlemleri Yorumları temizlemek ve kelimeleri tokenize etmek için:
 comments <- read.csv(choose.files())  # CSV dosyasını yükler

# Stopword listesini yükler ve veri çerçevesine dönüştürür
stoplist <- read.csv(choose.files())  
stoplist <- data.frame(word = stoplist)  

# Yorumları küçük harfe çevirir
comments$comment <- tolower(comments$comment)  

# Sayıları kaldırır
comments$comment <- removeNumbers(comments$comment)  

# Noktalama işaretlerini kaldırır
comments$comment <- str_replace_all(comments$comment, "[[:punct:]]", "")  

# Yorumları kelimelere ayırır
tokenized_comment <- comments %>%
  unnest_tokens(word, comment)  

# Stopword'leri çıkarır
tokenized_comment <- tokenized_comment %>%
  anti_join(stoplist)  
  1. Kelime Bulutu Oluşturma Kelime tekrarlarını analiz edip görselleştirme:
word_repitition <- tokenized_comment %>%
  count(word, sort = TRUE) %>%  # Kelimeleri sayar ve sıralar
  slice_head(n = 100)           # İlk 100 kelimeyi seçer

wordcloud2(word_repitition, size = 1, color = "random-dark", backgroundColor = "white")  
# Kelime bulutu oluşturur
  1. Duygu Analizi: Cümle Polaritesi Kelime polaritelerini hesaplama ve görselleştirme:
polarite <- sentiment(word_repitition$word)
polarite_stats <- cbind(word_repitition, polarite[, c(4)])

# Polarite istatistiklerini görselleştirme
ggplot(polarite_stats, aes(x = n, y = sentiment)) +
  geom_point(color = "blue") +
  geom_hline(yintercept = mean(polarite_stats$sentiment), color = "red", size = 1) +
  labs(y = "Duygu Skoru", x = "Kelime Sayısı") +
  theme_minimal()

  1. Duygu Skorlarının Histogramı Duygu skorlarının dağılımını görselleştirme:
polarite_stats %>%
  ggplot(aes(x = sentiment)) +
  geom_histogram(binwidth = 0.1, aes(fill = ..x..)) +
  scale_fill_gradient(low = "orange", high = "red") +
  ylab("Cümle Sayısı") +
  xlab("Duygu Skoru") +
  xlim(-1, 1) +
  theme_minimal()

  1. Bing ve NRC Duygu Analizi Bing Duygu Analiz
 # Yorumlardaki kelimelerin duygu skorlarını analiz eder (olumlu/olumsuz olarak etiketler).
sentiment_analysis <- tokenized_comment %>%
inner_join(get_sentiments("bing"), by = "word")
                                  
 # Duygu skorlarının özetini çıkarır (olumlu/olumsuz kelime sayısı ve oranlarını hesaplar).
sentiment_summary <- sentiment_analysis %>%
count(sentiment) %>%  # Her duygu türünün (sentiment) frekansını hesaplar.
 mutate(oran = round(n / sum(n) * 100, 2)) %>%  # Frekansları yüzde oranına çevirir.
arrange(desc(oran))  # Oranları büyükten küçüğe sıralar.
                                  
# Özet sonuçları tablo olarak görüntüler.
pander(sentiment_summary)
sentiment n oran
positive 300 81.08
negative 70 18.92

NRC Duygu Analizi

 # Kelimeleri NRC duygu sözlüğüyle eşleştirir (duygusal kategorilere ayırır).
nrc <- tokenized_comment %>%
inner_join(get_sentiments("nrc"), by = "word")
                    
# Her duygunun toplamını ve yüzdelik oranını hesaplar.
nrc_summary <- nrc %>%
 group_by(sentiment) %>%
 # Duygu kategorilerine göre gruplar.
 summarise(toplam = n()) %>% 
 # Her kategorideki toplam kelime sayısını hesaplar.
 mutate(oran = round(toplam / sum(toplam) * 100, 2)) %>%
 # Her kategorinin yüzdesini bulur.
 arrange(desc(oran))  # Oranlara göre sıralar (büyükten küçüğe).
# Sonuçları tablo olarak gösterir.
pander(nrc_summary)
sentiment toplam oran
positive 300 33.86
trust 156 17.61
joy 109 12.3
anticipation 89 10.05
negative 70 7.9
sadness 60 6.77
surprise 30 3.39
disgust 29 3.27
anger 22 2.48
fear 21 2.37
  1. NRC Duygu Görselleştirme
# Kelimeleri duygulara göre gruplar ve en sık geçen 5 kelimeyi seçer.
nrc %>%
  group_by(sentiment) %>% 
  count(word, sort = TRUE) %>%  # Kelimelerin frekansını hesaplar ve sıralar.
  top_n(5) %>%  # Her duygudan en sık geçen 5 kelimeyi seçer.
  ggplot(aes(reorder(word, n), n, fill = sentiment)) +  # Frekansa göre sıralayıp grafik oluşturur.
  geom_bar(stat = "identity", show.legend = FALSE) +  # Çubuk grafik çizer, efsane eklemez.
  facet_wrap(~sentiment, scales = "free_y", ncol = 5) +  # Her duygu için ayrı grafik oluşturur.
  labs(y = "Frekans", x = NULL) +  # Ekseni etiketler (X eksenine etiket koymaz).
  coord_flip() +  # Çubukları yatay olarak çevirir.
  theme_minimal()  # Grafik temasını sade bir yapıya çevirir.