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.
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)
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)
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
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()
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()
# 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 |
# 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.