R'de Duygu Analizi
Olumlu ve olumsuz tonu ölçmek için belirteçleri duygu sözlükleriyle birleştirin.
R'de Duygu Analizi, CoddyKit'te ücretsiz bir R Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, R Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. R Academy kursu toplamda 4 dersten oluşur.
Duygu Analizine Genel Bakış
Duygu analizi, metne duygusal değer atar. tidytext yaklaşımı, tek tek kelimeleri bir duygu sözlüğündeki karşılıklarıyla eşleştirir ve puanları toplulaştırır. Üç yerleşik sözlük kullanılabilir: AFINN (sayısal puanlar), Bing (olumlu/olumsuz) ve NRC (duygu kategorileri).
library(tidytext)
# Available sentiment lexicons
# AFINN: -5 to +5 numeric score
# Bing: binary positive/negative
# NRC: emotion categories (joy, fear, anger, ...)
# Preview AFINN
afinn_sample <- get_sentiments('afinn')
cat('AFINN rows:', nrow(afinn_sample), '\n')
cat('Score range:', range(afinn_sample$value), '\n')
print(head(afinn_sample, 5))get_sentiments('afinn')
AFINN sözlüğü, 2.477 İngilizce kelimeye −5 (çok olumsuz) ile +5 (çok olumlu) arasında tam sayı puanları atar. Finn Årup Nielsen tarafından derlenmiştir ve sosyal medya ile inceleme metinlerinde iyi sonuç verir.
library(tidytext)
library(dplyr)
afinn <- get_sentiments('afinn')
# Most positive and most negative words
cat('Most positive words:\n')
print(afinn |> slice_max(value, n = 5))
cat('\nMost negative words:\n')
print(afinn |> slice_min(value, n = 5))
# Score distribution
cat('\nScore distribution:\n')
print(table(afinn$value))get_sentiments('bing')
Bing sözlüğü (Bing Liu ve diğerleri), 6.786 kelimeyi olumlu veya olumsuz olarak sınıflandırır. AFINN'den daha büyüktür ve basit kutupluluğun yeterli olduğu ürün incelemeleri ile müşteri geri bildirimleri için uygundur.
library(tidytext)
library(dplyr)
bing <- get_sentiments('bing')
cat('Bing lexicon size:', nrow(bing), '\n')
cat('Positive words:', sum(bing$sentiment == 'positive'), '\n')
cat('Negative words:', sum(bing$sentiment == 'negative'), '\n')
# Sample positive and negative words
cat('\nSample positive:', head(bing$word[bing$sentiment == 'positive'], 8), '\n')
cat('Sample negative:', head(bing$word[bing$sentiment == 'negative'], 8), '\n')inner_join: Sözcükleri Puanlama
inner_join(tokens, afinn, by = 'word') yalnızca AFINN sözlüğünde bulunan token'ları tutar ve bunların puanlarını ekler. Sözlükte bulunmayan sözcükler sessizce çıkarılır; bu durum hem bir güçlü yön (bilinen duygu sözcüklerine odaklanır) hem de bir sınırlamadır.
library(tidytext)
library(dplyr)
reviews <- tibble::tibble(
review_id = 1:3,
text = c(
'The product is excellent and outstanding quality',
'Terrible experience, broken and disappointing',
'Good value but slow delivery, acceptable overall'
)
)
scored <- reviews |>
unnest_tokens(word, text) |>
inner_join(get_sentiments('afinn'), by = 'word')
cat('Scored words:\n')
print(scored[, c('review_id', 'word', 'value')])Belge Başına Net Duygu
group_by(document) |> summarise(sentiment = sum(value)) ile belge başına AFINN puanlarını toplayarak net bir duygu puanı elde edebilirsiniz. Pozitif toplamlar genel olarak olumlu duyguya, negatif toplamlar ise olumsuz duyguya işaret eder.
library(tidytext)
library(dplyr)
reviews <- tibble::tibble(
review_id = 1:5,
text = c(
'excellent outstanding perfect love best amazing',
'terrible broken horrible awful waste money',
'good acceptable okay decent average',
'brilliant fantastic outstanding love recommend',
'poor bad disappointing slow useless'
)
)
net_sentiment <- reviews |>
unnest_tokens(word, text) |>
inner_join(get_sentiments('afinn'), by = 'word') |>
group_by(review_id) |>
summarise(
sentiment = sum(value),
word_count = n()
) |>
mutate(polarity = ifelse(sentiment > 0, 'positive', 'negative'))
print(net_sentiment)Bing Duygusu: Olumlu ve Olumsuz Sayıları
Bing sözlüğüyle belge başına olumlu ve olumsuz sözcük sayılarını karşılaştırın. Net kutupluluk puanı için sentiment = positive_n - negative_n hesaplayabilir veya yapıyı görmek için her iki sayıyı gruplanmış çubuklar olarak görselleştirebilirsiniz.
library(tidytext)
library(dplyr)
corpus <- tibble::tibble(
chapter = 1:4,
text = c(
'the hero was brave courageous strong and victorious in battle',
'disaster struck terrible losses failure defeat mourning grief',
'love joy happiness beautiful peaceful wonderful morning',
'evil darkness corrupt wicked terrible pain suffering fear'
)
)
bing_sentiment <- corpus |>
unnest_tokens(word, text) |>
inner_join(get_sentiments('bing'), by = 'word') |>
count(chapter, sentiment) |>
tidyr::pivot_wider(names_from = sentiment, values_from = n, values_fill = 0) |>
mutate(net = positive - negative)
print(bing_sentiment)Bölüm veya Kısma Göre Duygu
Bir anlatı akışı boyunca duyguyu izlemek için bölüm ya da kayan pencere başına net duyguyu hesaplayın. Bu, duygusal yapıyı ortaya çıkarır: yükselen olaylar, doruk ve çözüm. Akışı görselleştirmek için ggplot2 ile geom_line() veya geom_bar() kullanın.
library(tidytext)
library(dplyr)
library(ggplot2)
# Simulate a 10-chapter story arc
set.seed(42)
chapters <- tibble::tibble(
chapter = 1:10,
text = c(
'peaceful beautiful joy love happy wonderful',
'good friends happy carefree enjoyable fun',
'worried anxious trouble fear uncertain dark',
'danger terrible threat awful pain suffering',
'fear horror disaster terrible devastation loss',
'fight battle struggle hard difficult challenge',
'hope courage determination brave strong resist',
'triumph victory success celebrate joy love',
'relief peace gratitude wonderful blessed happy',
'love joy peace beautiful grateful wonderful'
)
)
arc <- chapters |>
unnest_tokens(word, text) |>
inner_join(get_sentiments('afinn'), by = 'word') |>
group_by(chapter) |>
summarise(net_sentiment = sum(value))
ggplot(arc, aes(chapter, net_sentiment)) +
geom_line(color = 'steelblue', linewidth = 1.2) +
geom_hline(yintercept = 0, linetype = 'dashed') +
labs(x = 'Chapter', y = 'Net Sentiment', title = 'Story Sentiment Arc') +
theme_minimal()NRC Sözlüğü: Duygu Kategorileri
NRC sözlüğü (Saif Mohammad ve Peter Turney), 13.901 sözcüğü sekiz duyguya (öfke, beklenti, tiksinti, korku, neşe, üzüntü, şaşkınlık, güven) ve ayrıca olumlu/olumsuz kategorilerine ayırır. Duyguya göre filter(sentiment == 'joy') ile filtreleme yapın.
library(tidytext)
library(dplyr)
nrc <- get_sentiments('nrc')
cat('NRC size:', nrow(nrc), '\n')
cat('Emotions:', paste(unique(nrc$sentiment), collapse = ', '), '\n')
# Words associated with 'joy'
joy_words <- nrc |> filter(sentiment == 'joy')
cat('\nJoy words:', nrow(joy_words), '\n')
cat('Sample:', head(joy_words$word, 10), '\n')
# Count words per emotion
nrc |>
count(sentiment, sort = TRUE) |>
print()NRC'yi Bir Derleme Uygulama
Her duyguyu ayrı ayrı puanlamak için token'lara ayrılmış metni NRC ile birleştirin. Her belgede hangi duyguların baskın olduğunu görmek için count(doc_id, sentiment) kullanarak belge ve duygu başına toplulaştırma yapın.
library(tidytext)
library(dplyr)
docs <- tibble::tibble(
doc_id = c(1, 1, 2, 2, 3, 3),
text = c(
'wonderful joyful happy love peace',
'excited surprise anticipation trust',
'fear anger terrible hate disgust',
'dark horrible awful suffering pain',
'curious wonder discovery learning',
'hope trust anticipation future growth'
)
)
nrc_scores <- docs |>
unnest_tokens(word, text) |>
inner_join(get_sentiments('nrc'), by = 'word') |>
filter(!sentiment %in% c('positive', 'negative')) |> # keep only emotions
count(doc_id, sentiment, sort = TRUE)
cat('Emotion counts per document:\n')
print(nrc_scores)Kelime Bulutu Kavramı
Kelime bulutu, sözcük sıklıklarını metin boyutunu sayıyla orantılı olarak ayarlayarak görselleştirir. wordcloud veya wordcloud2 paketleri, sözcük/sıklık veri çerçevesinden kelime bulutları oluşturur. Duyguya göre renklendirilmiş bir bulut için Bing sözlüğünü kullanarak sözcükleri duyguya göre renklendirin.
library(tidytext)
library(dplyr)
# Prepare word frequencies coloured by Bing sentiment
corpus_text <- tibble::tibble(
text = c(
'excellent performance amazing results love beautiful',
'terrible failure poor broken horrible waste',
'brilliant outstanding success happy wonderful joy',
'awful disappointing bad slow useless frustrating'
)
)
word_freq <- corpus_text |>
unnest_tokens(word, text) |>
count(word, sort = TRUE) |>
left_join(get_sentiments('bing'), by = 'word') |>
mutate(
sentiment = replace(sentiment, is.na(sentiment), 'neutral'),
colour = case_when(
sentiment == 'positive' ~ '#2196F3',
sentiment == 'negative' ~ '#F44336',
TRUE ~ '#9E9E9E'
)
)
print(word_freq)
# In practice: wordcloud2(word_freq[, c('word','n')], color = word_freq$colour)Sözlük Tabanlı Duygu Analizinin Sınırlamaları
Sözlük tabanlı duygu analizinin bilinen başarısızlık durumları vardır: olumsuzluk ("iyi değil" olumlu olarak puanlanır), alay ("harika, bir hata daha"), alan uyumsuzluğu (argo kullanımda "sick" olumlu olabilir) ve sözlükte bulunmayan sözcükler. Sonuçları yorumlarken bu sınırlamaları göz önünde bulundurun.
library(tidytext)
library(dplyr)
# Negation problem
neg_examples <- tibble::tibble(
text = c(
'not good at all', # negative, but 'good' scores +3
'not bad', # positive, but 'bad' scores -3
'sick beats bro' # slang positive, 'sick' is negative in AFINN
)
)
scored <- neg_examples |>
unnest_tokens(word, text) |>
inner_join(get_sentiments('afinn'), by = 'word')
cat('Lexicon scores (naive - ignores negation):\n')
print(scored[, c('word', 'value')])
cat('\nNote: "not" is a stop word - the negation is lost!\n')Hızlı Kontrol
Duygu puanlaması için inner_join(tokens, afinn, by = 'word') kullanıyorsunuz. Token'larınızda AFINN sözlüğünde bulunmayan sözcüklere ne olur?
Özet: Duygu Analizi
Temel çıkarımlar:
- Üç temel sözlük: AFINN (−5 ile +5 arasında puanlar), Bing (olumlu/olumsuz), NRC (8 duygu)
get_sentiments('afinn')/'bing'/'nrc', sözlüğü tibble olarak getiririnner_join(tokens, lexicon, by = 'word')yalnızca eşleşen sözcükleri puanlar (eşleşmeyenler çıkarılır)- Net duygu =
group_by(doc) |> summarise(sentiment = sum(value)) - Bing: belge veya kısım başına
positive - negativesözcük sayılarını karşılaştırın - NRC: korku, neşe, öfke vb. duyguları ayırmak için duygu adına göre filtreleyin
- Temel sınırlama: sözlük tabanlı yöntemler olumsuzluğu, alayı veya alana özgü argoyu ele almaz
library(tidytext)
library(dplyr)
tibble::tibble(text = 'excellent amazing love joy beautiful happy') |>
unnest_tokens(word, text) |>
inner_join(get_sentiments('afinn'), by = 'word') |>
summarise(net_sentiment = sum(value)) |>
print()Sıkça Sorulan Sorular
“R'de Duygu Analizi” dersi ücretsiz mi?
Evet — “R'de Duygu Analizi” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve R Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. R Academy kursu toplamda 4 dersten oluşur.
“R'de Duygu Analizi” dersinde ne öğreneceğim?
Olumlu ve olumsuz tonu ölçmek için belirteçleri duygu sözlükleriyle birleştirin. R Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
R Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te R Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“R'de Duygu Analizi” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu R Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her R Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Belirteçleştirme ve Yaygın Sözcükleri Kaldırma
- TF-IDF ve Terim Sıklığı Analizi
- R'de Duygu Analizi
- LDA ile Konu Modelleme