Prince’in, The Artist’ın hayatı ve zamanlarında duygusal bir yolculuğa çıkın. Üç bölümlük bir eğitim serisinin İki-A kısmında, R ile duygu analizini kullanarak The Artist’ın kariyeri ve toplumsal etkisine ışık tutacağız. Üç eğitim şu konuları kapsar:
Prince’in, sahnede, 9/11’i gerçekleşmeden üç yıl önce öngördüğünü biliyor muydunuz? Kendi ölümünü de öngörmüş olabilir. Bu gerçekten mümkün mü? Sözlerini inceleyip kendi akıl yürütmenizle bir yargıda bulunmak ilginç olmaz mı? 21 Nisan 1985’te "Sometimes It Snows In April"ı kaydetti. Tam 31 yıl sonra, 21 Nisan 2016’da hayatını kaybetti. Bu şarkının duygu analizindeki kelime seçimlerine bir bakın:
"Sometimes It Snows In April" Duygu Analizi
Bu, Öngörüsel Analitik’e yeni bir anlam katıyor!
Yapı
Her bir kod parçasını, genellikle öznel nitelikte bir içgörü izler. İsterseniz, kendi varsayımlarınızı yaparak bölümler arasında özgürce gezinin! Aşağıdaki giriş bölümünü okumanızı öneririm; ancak doğrudan koda atlamak isterseniz buraya tıklayın. Sözlüklerin (lexicon) arkasındaki kavramı zaten anlıyorsanız, doğrudan ayrıntılı analiz bölümüne giderek hızlı ilerleyebilirsiniz.
Giriş
Üçlüler: Üç Bölümlük Özet
Az önce iki kedi yavrusu ve bir köpek sahiplendim, artık üçlüler halinde düşünüyorum. Ayrıca, üç kuralı, üçlü gelen şeylerin doğası gereği daha komik, daha tatmin edici veya diğerlerine göre daha etkili olduğunu öne süren bir yazım ilkesidir — bu yüzden bunu üç parçaya böldüm... Birinci Bölüm’de, efsanevi sanatçı Prince’in yüzlerce şarkı sözünden oluşan bir veri kümesini kullanarak metin madenciliği ve keşifsel analize giriş yaptınız. İkinci Bölüm’de, NLP ile duygu analizi (İki-A) ve konu modellemesine (İki-B) odaklanacaksınız. Üçüncü Bölüm ise, bir şarkının hangi on yılda yayımlandığını belirlemenin mümkün olup olmadığı ya da daha ilginci, sözlerine dayanarak Billboard listelerine girip girmeyeceğini tahmin etmek gibi soruları ele alan ek öngörüsel analitik görevleriyle tamamlanacak. Bu eğitimler boyunca, aşağıdaki görselde kırmızıyla vurgulanan farklı makine öğrenimi algoritmalarını kullanacaksınız.
burada sunulan görselden uyarlanmıştır. Modelleme ve makine öğrenimi tekniklerinin farklı yönlerinin, yukarıda gösterildiği gibi tek bir kutuya sığması gerekmediğine dikkat edin. Bu sadece neyle karşılaşacağınızı kavramanıza yardımcı olmak içindir.
Ayrılmak Zordur
Evet, sadece üç bölüme söz verdiğim doğru, ancak İkinci Bölüm’ü İki-A (Duygu Analizi) ve İki-B (Konu Modellemesi - yakında) olarak böldüm; böylece dört ayrı eğitim ortaya çıktı. Duygu analizinin arkasındaki sürece ilişkin birçok harika makale ve kurs var; bu nedenle İki-A’nın amacı yalnızca kod yazmak değil, analizden içgörüler çıkarmaya odaklanmaktır. Örnek olarak Prince’in şarkı sözlerini kullanacaksınız, fakat adımları kendi favori sanatçınıza da uygulayabilirsiniz. Tüm eğitim serisi boyunca yolculuğunuz, NLP ve makine öğrenimi tekniklerine giriş yaparken, söz analiziyle sunulan fırsatlar hakkında sizde bir merak duygusu uyandırmayı umuyor.
Önkoşullar
Bu eğitim serisinin İki-A kısmı, tidy veriye temel düzeyde aşinalık gerektirir — özellikle dplyr (veri dönüştürme), ggplot2 (görselleştirme) ve %>%boru operatörü (ilk olarak magrittr paketinden). Kodu derli toplu ve yeniden kullanılabilir tutmak için, %>% operatörünün sıklıkla adımları birleştirmek için kullanıldığını göreceksiniz.
Bu eğitim aynı zamanda bir vaka çalışması olduğundan, yaygın kullanılan grafik ve çizelgelerin ötesinde yoğun bir görselleştirme içerir. Sonuç olarak, bir diğer önkoşul da kendi ortamınıza yeni paketler kurabilmektir. İçgörü elde etmeye odaklanmak için, kendi veri kümenizde yeniden kullanılmak üzere tasarlanmış kodlar ekledim; ancak ayrıntılı açıklama, sizin tarafınızdan daha fazla araştırma gerektirecektir. Her paket için destekleyici bağlantılar verilecektir. Böylece uygulamalarına odaklanırken yeni araçlarla tanışmış olacaksınız.
İpucu: eğitim serisine temel oluşturmak ve Prince’in sözlerindeki yoğun ve çeşitli kelime dağarcığına dair içgörü kazanmak için önce Birinci Bölüm’ü okuyun.
Duygu Analizine Genel Bakış
Yöntemler: Duygu analizi, içeriğin görüşünü ve öznelliğini belirlemeyi amaçlayan bir metin madenciliği türüdür. Şarkı sözlerine uygulandığında, sonuçlar yalnızca sanatçının tutumlarını temsil etmekle kalmaz, aynı zamanda yaygın kültürel etkileri de ortaya çıkarabilir. Duygu analizinde kullanılan farklı yöntemler vardır; bilinen bir veri kümesini eğitmek, kurallarla kendi sınıflandırıcılarınızı oluşturmak ve önceden tanımlanmış sözcük sözlüklerini (lexicon) kullanmak gibi. Bu eğitimde sözlük tabanlı yaklaşımı kullanacaksınız; ancak diğer yöntemleri ve bunların getiri-götürülerini de araştırmanızı öneririm.
Düzeyler: Nasıl ki duygu analizi için farklı yöntemler varsa, metne bağlı olarak farklı analiz düzeyleri de vardır. Bu düzeyler genellikle belge, cümle ve kelime olarak tanımlanır. Şarkı sözlerinde belge, on yıla, yıla, liste düzeyine veya şarkıya göre duygu olarak tanımlanabilir. Cümle düzeyi şarkı sözlerinde genellikle seçenek değildir; çünkü noktalama, uyak ve kalıplardan uzaklaştırabilir. Kelime düzeyi analiz, ayrıntılı bilgileri ortaya çıkarır ve konu modellemesi gibi daha ileri uygulamalar için temel bilgi olarak kullanılabilir.
Sorularınızı Hazırlayın!
Her veri bilimi projesinin keşfedilecek bir soru seti olmalıdır. Bu eğitim boyunca aklınızda bulundurmanız için birkaç soru: Şarkı sözlerinde ifade edilen ruh halini belirleyecek bir program yazmak mümkün mü? Önceden tanımlanmış sözlükler yeterli mi? Ne kadar veri hazırlığı gerekli? Sonuçlarınızı gerçek hayattaki olaylarla ilişkilendirebilir misiniz? Duygu zaman içinde değişiyor mu? Hit şarkılar, listeye girmemiş şarkılara göre daha pozitif mi yoksa daha negatif mi? Prince’in 9/11’i öngördüğü söylenen yılda sözlerinde hangi kelimeler öne çıkıyor? Kendi ölümünü öngördü mü?
İpucu: söz analizi, konuşmalardan veya kitaplardan çok farklı ve genellikle daha karmaşıktır; içgörü elde etmeyi zorlaştırır. Bu nedenle tüm varsayımlar konusunda temkinli olun! Bu eğitimde yanıtlardan çok soru soracağım; dolayısıyla kare paralelkenarın dışına çıkmaya hazırlıklı olun!
Hazırlık Çalışması
Kütüphaneler ve Fonksiyonlar
Prince’in şarkı sözlerini analiz etmeye başlamak için aşağıdaki kütüphaneleri yükleyin. İlk bakışta göz korkutucu görünebilirler; ancak çoğu yalnızca grafik ve çizelgeler içindir. Görselleştirmelerin sık kullanımını göz önüne alarak tutarlılık için standart bir renk şeması tanımlamak daha iyidir. Belirli ANSI renk kodlarını kullanarak bir liste oluşturdum. ggplot2’nin theme() fonksiyonu, tek tek grafiklerin özelleştirilmesine olanak tanır; bu yüzden varsayılan ayarları değiştirecek kendi fonksiyonunuzu, theme_lyrics() de oluşturacaksınız. knitr paketi, R ile dinamik rapor üretimi için bir motordur. kableExtra ve formattable ile birlikte kullanarak renkli, çekici metin tabloları oluşturun. Yine bu kütüphanelerin çıktılarını standartlaştırmak için my_kable_styling() adlı kendi fonksiyonunuzu oluşturun. Diğer paketleri kullanıldıkça anacağım.
library(dplyr)#Data manipulation (also included in the tidyverse package)
library(tidytext)#Text mining
library(tidyr)#Spread, separate, unite, text mining (also included in the tidyverse package)
library(widyr)#Use for pairwise correlation#Visualizations!
library(ggplot2)#Visualizations (also included in the tidyverse package)
library(ggrepel)#`geom_label_repel`
library(gridExtra)#`grid.arrange()` for multi-graphs
library(knitr)#Create nicely formatted output tables
library(kableExtra)#Create nicely formatted output tables
library(formattable)#For the color_tile function
library(circlize)#Visualizations - chord diagram
library(memery)#Memes - images with plots
library(magick)#Memes - images with plots (image_read)
library(yarrr)#Pirate plot
library(radarchart)#Visualizations
library(igraph)#ngram network diagrams
library(ggraph)#ngram network diagrams#Define some colors to use throughout
my_colors <- c("#E69F00","#56B4E9","#009E73","#CC79A7","#D55E00","#D65E00")#Customize ggplot2's default theme settings#This tutorial doesn't actually pass any parameters, but you may use it again in future tutorials so it's nice to have the options
theme_lyrics <-function(aticks = element_blank(),
pgminor = element_blank(),
lt = element_blank(),
lp ="none"){
theme(plot.title = element_text(hjust =0.5),#Center the title
axis.ticks = aticks,#Set axis ticks to on or off
panel.grid.minor = pgminor,#Turn the minor grid lines on or off
legend.title = lt,#Turn the legend title on or off
legend.position = lp)#Turn the legend on or off}#Customize the text tables for consistency using HTML formatting
my_kable_styling <-function(dat, caption){
kable(dat,"html", escape =FALSE, caption = caption)%>%
kable_styling(bootstrap_options = c("striped","condensed","bordered"),
full_width =FALSE)}Altyapı:
Sushi Verisi
Her zaman olduğu gibi, ham veriyi bir veri çerçevesine okuyarak başlayacaksınız. Birinci Bölüm’de, orijinal veri kümesinde bazı düzenlemeler yapmıştınız: kısaltmaları açma, kaçış dizilerini kaldırma ve metni küçük harfe çevirme gibi. Bu temiz veri kümesini bu eğitimde kullanmak üzere bir CSV dosyasına kaydetmiştiniz. read.csv() ile prince_data’yı oluşturun ve sözlerin karakter dizileri olarak kalmasını istediğinizden, stringsAsFactors = FALSE ayarını yapmayı unutmayın. Satır numaralarına ihtiyacınız olmadığından, row.names = 1 olarak ayarlayın.
Not: tibble adlı modern bir veri çerçevesine read_csv() ile okursanız bu parametrelerden kaçınabilirsiniz; ancak Birinci Bölüm ile tutarlılık için burada read.csv() kullanılmıştır.
prince_data’nın 824 şarkı ve 10 sütundan oluşan bir veri çerçevesi olduğunu görebilirsiniz. Bu, bir kaydın kelimenin tam anlamıyla bir şarkı olduğu anlamına gelir!
Tertemiz Eğlence: prince_tidy
İşte kalan birkaç veri düzenleme adımı:
İstenmeyen kelimeleri kaldırın (gereksiz kelimelerin elle oluşturulmuş listesi)
Durak kelimeleri kaldırın ("and", "the", "a", "of" vb. aşırı yaygın kelimeler)
Üç karakterden kısa kelimeleri kaldırın (müzikte sıklıkla fonetik etki için kullanılır)
Şarkı sözlerini tek tek kelimelere ayırın
Ham verinizi tidy formata dönüştürmek için, tidytext’ten unnest_tokens() kullanarak şarkı sözlerini kelime başına bir satır olacak şekilde bölüp prince_tidy’yi oluşturun. Ardından kalan temizlik adımları için dplyr’den anti_join() ve filter() kullanabilirsiniz. (Ayrıntılı açıklama için Birinci Bölüm’e bakın.)
#Created in the first tutorial
undesirable_words <- c("prince","chorus","repeat","lyrics","theres","bridge","fe0f","yeah","baby","alright","wanna","gonna","chorus","verse","whoa","gotta","make","miscellaneous","2","4","ooh","uurh","pheromone","poompoom","3121","matic"," ai "," ca "," la ","hey"," na "," da "," uh "," tin "," ll","transcription","repeats","la","da","uh","ah")#Create tidy text format: Unnested, Unsummarized, -Undesirables, Stop and Short words
prince_tidy <- prince_data %>%
unnest_tokens(word, lyrics)%>%#Break the lyrics into individual words
filter(!word %in% undesirable_words)%>%#Remove undesirables
filter(!nchar(word)<3)%>%#Words like "ah" or "oo" used in music
anti_join(stop_words)#Data provided by the tidytext packageAltyapı:
glimpse(prince_tidy)#From `dplyr`, better than `str()`.Altyapı:
Yeni veri kümeniz prince_tidy artık, geldiği şarkıyla birlikte satır başına bir kelime olacak şekilde tokenleştirilmiş formdadır. Artık 76116 kelime ve 10 sütundan oluşan bir veri çerçeveniz var.
Betimsel İstatistikler
Birinci Bölüm’ü okumadıysanız, tam veri kümesine dair birkaç özet grafiğe hızlıca bakmanız gerekebilir. Bunu ggplot2, circlize ve yarrr paketlerinden yaratıcı grafikler ile yapacaksınız.
Tertemiz: Şarkı Başına Kelime Sayısı
Bir korsan, her şey düzenli, derli toplu ve temiz olduğunda shipshape derdi. O halde burada, zaman içinde sözlerin söz dağarcığına, yani başka bir deyişle, leksik çeşitliliğe dair ilginç bir görünüm var. Bir korsan grafiği, kelime sayısı gibi sürekli bir bağımlı değişkeni, on yıl gibi kategorik bir bağımsız değişkenin fonksiyonu olarak görselleştirmenin gelişmiş bir yoludur. Bu, ham veri noktalarını, betimsel ve çıkarımsal istatistikleri tek bir etkili grafikte birleştirir. yarrr paketindeki pirateplot() hakkında daha fazla ayrıntı için şu harika bloga göz atın.
word_summary veri çerçevesini oluşturarak şarkı başına farklı kelime sayısını hesaplayın. Sözler ne kadar çeşitliyse, kelime dağarcığı o kadar geniştir. Veriye bu şekilde bakmak, sizi kelime düzeyi analizine hazırlar. Yayın tarihi olmayan şarkılar için on yıl alanını "NONE" değeriyle sıfırlayın ve select() kullanarak bu alanları daha okunaklı etiketlerle yeniden adlandırın.
word_summary <- prince_tidy %>%
mutate(decade = ifelse(is.na(decade),"NONE", decade))%>%
group_by(decade, song)%>%
mutate(word_count = n_distinct(word))%>%
select(song, Released = decade, Charted = charted, word_count)%>%
distinct()%>%#To obtain one record per song
ungroup()
pirateplot(formula = word_count ~ Released + Charted,#Formula
data = word_summary,#Data frame
xlab =NULL, ylab ="Song Distinct Word Count",#Axis labels
main ="Lexical Diversity Per Decade",#Plot title
pal ="google",#Color scheme
point.o =.2,#Points
avg.line.o =1,#Turn on the Average/Mean line
theme =0,#Theme
point.pch =16,#Point `pch` type
point.cex =1.5,#Point size
jitter.val =.1,#Turn on jitter to see the songs better
cex.lab =.9, cex.names =.7)#Axis label sizeAltyapı:
Bu korsan grafikteki her renkli daire bir şarkıyı temsil eder. "NONE" değeriyle yer alan yoğun kırmızı alan, veri kümesindeki çok sayıda şarkının yayın tarihinin olmadığını gösterir. Erken on yıllarda şarkı başına benzersiz kelime sayısında hafif bir artış eğilimi vardır: düz yatay çizgi, o on yılın ortalama kelime sayısını gösterir. Bu, zaman içindeki duyguyu analiz etmeye başladığınızda bilmeniz gereken önemli bir noktadır. Prince’in kariyeri boyunca kelimeler daha da aydınlatıcı hale gelir.
Yalnızca yüzeyine değindiğiniz için, korsan grafiklerini daha ayrıntılı biçimde keşfetmenizi öneririm!
Tüm Yıl Boyunca: Yıla Göre Şarkı Sayısı
Dairesel grafikler, birkaç kategori arasındaki karmaşık (ya da basit!) ilişkileri görselleştirmenin benzersiz bir yoludur. (Hem de albümler eskiden yuvarlaktı!). Aşağıdaki grafik, ggplot2’den coord_polar() kullanılarak oluşturulmuş, yıllara göre göreli şarkı sayısını gösteren basit bir dairesel çubuk grafiğidir. Bu kadar basit bir grafik için çokça kod gerekiyor; ama kesinlikle değer. Benzer bir örnek R Graph Gallery’de daha ayrıntılı olarak burada bulunabilir. Korsan grafiklerinde olduğu gibi, bu da dairesel grafiklerle neler yapabileceğinize bir giriş niteliğinde.
Yıla Göre Şarkı Sayısı
songs_year <- prince_data %>%
select(song, year)%>%
group_by(year)%>%
summarise(song_count = n())
id <- seq_len(nrow(songs_year))
songs_year <- cbind(songs_year, id)
label_data = songs_year
number_of_bar = nrow(label_data)#Calculate the ANGLE of the labels
angle =90-360*(label_data$id -0.5)/ number_of_bar #Center things
label_data$hjust <- ifelse(angle <-90,1,0)#Align label
label_data$angle <- ifelse(angle <-90, angle +180, angle)#Flip angle
ggplot(songs_year, aes(x = as.factor(id), y = song_count))+
geom_bar(stat ="identity", fill = alpha("purple",0.7))+
geom_text(data = label_data, aes(x = id, y = song_count +10, label = year, hjust = hjust), color ="black", alpha =0.6, size =3, angle = label_data$angle, inherit.aes =FALSE)+
coord_polar(start =0)+
ylim(-20,150)+#Size of the circle
theme_minimal()+
theme(axis.text = element_blank(),
axis.title = element_blank(),
panel.grid = element_blank(),
plot.margin = unit(rep(-4,4),"in"),
plot.title = element_text(margin = margin(t =10, b =-10)))Altyapı:
Tam tepedeki boşluğu görüyor musunuz? Bu, korsan grafikte belirlediğiniz yüzlerce yayın tarihi olmayan şarkının bir göstergesidir. Liste dışı şarkı sayısı bu kadar büyükken, bunlar dahil edilseydi grafik kullanışlı olmazdı. Eksik yıllar, o yıllarda hiç şarkı yayımlanmadığını gösterir. En üretken yıllar 1996 ve 1998’dir.
Nedenini öğrenmek ister misiniz? Okumaya devam edin!
Akorlar: On Yıla Göre Listeye Giren Şarkılar
Aşağıdaki grafik, bir şarkının yayımlandığı on yıl ile Billboard listelerine girip girmediği arasındaki ilişkiyi gösterir. Müzikal bir analiz için chordDiagram() kullanmak pek tabii yerinde oldu! Bu grafiksel araç, Zuguang Gu’nun güzel circlize paketindendir. Grafik iki kategoriye ayrılmıştır: liste başarısı (üst) ve on yıl (alt). İki kategori geniş boşluklarla ayrılır; değerler arasında daha küçük boşluklar bulunur. Aşağıdaki koddaki üst düzey açıklamalar, daha fazla ayrıntı ile burada desteklenebilir.
decade_chart <- prince_data %>%
filter(decade !="NA")%>%#Remove songs without release dates
count(decade, charted)#Get SONG count per chart level per decade. Order determines top or bottom.
circos.clear()#Very important - Reset the circular layout parameters!
grid.col = c("1970s"= my_colors[1],"1980s"= my_colors[2],"1990s"= my_colors[3],"2000s"= my_colors[4],"2010s"= my_colors[5],"Charted"="grey","Uncharted"="grey")#assign chord colors# Set the global parameters for the circular layout. Specifically the gap size
circos.par(gap.after = c(rep(5, length(unique(decade_chart[[1]]))-1),15,
rep(5, length(unique(decade_chart[[2]]))-1),15))
chordDiagram(decade_chart, grid.col = grid.col, transparency =.2)
title("Relationship Between Chart and Decade")Altyapı:
Yukarıdaki dairesel grafik ilk bakışta karmaşık görünse de, on yıl ve liste düzeyine göre şarkı sayılarını güzelce gösterir. Prince, 1970’lerde kariyerine az sayıda yayınla başlamış ve bazıları listeye girmiştir. 1980’leri 1990’larla karşılaştırırsanız, 1990’larda daha fazla şarkı yayımlandığını; ancak 1980’lerde daha çok şarkının listeye girdiğini görürsünüz. 2000’lerde ticari olarak başarılı az sayıda şarkı vardır ve 2010’larda hit şarkı yoktur.
Sözlükler ve Sözler
Bu bölümde şunları yapacaksınız:
Duygu sözlüklerini ve kelime sayılarını keşfedin
Sözlerdeki kaç kelimenin sözlüklerde bulunduğunu belirleyin
Belirli kelimelere ve kelime biçimlerine bakın
Ek veri düzenlemesini değerlendirin
Duygu Sözlüklerini Keşfedin
tidytext paketi, sentiments adlı ve birkaç farklı sözlük sağlayan bir veri kümesi içerir. Bu sözlükler, sözcüklere atanmış duygu kategorisi veya değeri olan kelime sözlükleridir. tidytext üç genel amaçlı sözlük sunar:
AFINN: kelimelere -5 ile 5 arasında puan atar; negatif puanlar olumsuz duyguya, pozitif puanlar olumlu duyguya işaret eder
Bing: kelimeleri olumlu ve olumsuz kategorilerine ayırır
NRC: kelimeleri şu on kategoriden birine veya birkaçına atar: positive, negative, anger, anticipation, disgust, fear, joy, sadness, surprise ve trust
Sözlükleri incelemek için new_sentiments adlı bir veri çerçevesi oluşturun. Bir finans sözlüğünü filtreleyin, AFINN sözlüğü için sayısal puanı positive veya negativee çevirerek ikili (diğer adıyla polar) bir duygu alanı oluşturun ve her sözlük için farklı kelime sayısını tutan bir alan ekleyin.
new_sentiments, farklı duygu kategorilerini tek bir sütunda tutar; bu nedenle, her sözlük ve kategoriye göre kelime sayılarını daha iyi görmek için tidyr’den spread() ile bu kategorileri ayrı alanlara döndürün. Daha önce oluşturduğunuz my_kable_styling() fonksiyonunda knitr ve kableExtra paketlerinden yararlanın. formattable’dan color_tile() ve color_bar() ile tablonuza renk ekleyerek güzel biçimlendirilmiş bir tablo oluşturun. Tablonuzu yazdırın ve sözlükler arasındaki farkları inceleyin.
Yukarıdaki tablo, her sözlüğün boyutu ve yapısı hakkında fikir verir.
Eşleşme Noktası
Hangi sözlüğün şarkı sözlerine daha uygun olduğunu belirlemek için, hem sözlükte hem de sözlerde ortak olan kelimelerin eşleşme oranına bakmak isteyeceksiniz. Hatırlatma: prince_tidy’de toplam 76116 kelime ve 7851 farklı kelime vardır.
Peki bu kelimelerin kaçı sözlüklerde yer alıyor?
prince_tidy ile new_sentiments arasında bir inner_join() yapın ve ardından sözlüğe göre gruplayın. NRC sözlüğünde 10 farklı kategori vardır ve bir kelime birden fazla kategoride yer alabilir: örneğin hem negatif hem de hüzünlü olabilir. Bu nedenle, sözlük başına farklı kelime sayısını elde etmek için summarise() içinde n_distinct() kullanmak isteyeceksiniz.
prince_tidy %>%
mutate(words_in_lyrics = n_distinct(word))%>%
inner_join(new_sentiments)%>%
group_by(lexicon, words_in_lyrics, words_in_lexicon)%>%
summarise(lex_match_words = n_distinct(word))%>%
ungroup()%>%
mutate(total_match_words = sum(lex_match_words),#Not used but good to have
match_ratio = lex_match_words / words_in_lyrics)%>%
select(lexicon, lex_match_words, words_in_lyrics, match_ratio)%>%
mutate(lex_match_words = color_bar("lightpink")(lex_match_words),
lexicon = color_tile("lightgreen","lightgreen")(lexicon))%>%
my_kable_styling(caption ="Lyrics Found In Lexicons")Altyapı:
Sözlüklerde Bulunan Şarkı Sözleri
lexicon
lex_match_words
words_in_lyrics
match_ratio
AFINN
770
7851
0.0980767
bing
1185
7851
0.1509362
nrc
1678
7851
0.2137307
NRC sözlüğü, AFINN veya Bing’e göre sözlerden daha fazla farklı kelime içeriyor. Eşleşme oranlarının toplamının düşük olduğuna dikkat edin. Hiçbir sözlük tüm kelimeleri kapsayamaz ve kapsamalı da değildir. Pek çok kelime nötr kabul edilir ve ilişkili bir duyguya sahip olmayabilir. Örneğin, 2000 genellikle nötr bir kelimedir ve bu nedenle sözlüklerde bulunmaz. Ancak hatırlarsanız, o yıl uçakların gökten düşeceği ve bilgisayarların duracağı öngörülmüştü. Yani şarkıda var olan bir korku vardır; fakat tipik sözlükler kullanılarak yapılan duygu analizinde yakalanmaz.
Bir kelimenin sözlükte görünmemesinin birkaç nedeni şunlardır:
Her kelimenin bir duygusu yoktur.
Sözlükler başka metin türleri için oluşturulmuştur; şarkı sözleri için değil.
Kelimenin gerçek biçimi görünmeyebilir. Örneğin, strong yer alabilir; ancak strongly yer almayabilir. Veride daha fazla temizlik gerekebilir! (Buna ileride değinilecektir.)
Sözümü Doğrulamayın, Kendiniz Bakın
Prince’in sözlerinden duygu üzerinde etkisi var gibi görünen bazı belirli kelimelere bakın. Hepsi tüm sözlüklerde var mı?
Controversy ve dark, NRC ve Bing’de yer alır; ancak gangster yalnızca Bing’de bulunur. Race ise hiç görünmez ve Prince’in sözlerinde kritik bir konudur. Fakat kolayca bir duyguya bağlanabilir mi? AFINN’in çok daha küçük olduğunu ve bu kelimelerden sadece birine sahip olduğunu unutmayın.
Kelime Biçimleri
Şimdi daha karmaşık bir örneğe bakalım. Cinsellik, Prince’in müziğinde yaygın bir temadır. Önceden tanımlanmış sözlüklere dayalı duygu analizi, bir kelimenin farklı biçimlerinden nasıl etkilenir? Örneğin, sözlerde kök kelime sexe yapılan tüm göndermeler şunlar. Bunları Bing ve NRC ile karşılaştırın ve nerelerde eşleşme olduğuna bakın.
my_word_list <- prince_data %>%
unnest_tokens(word, lyrics)%>%
filter(grepl("sex", word))%>%#Use `grepl()` to find the substring `"sex"`
count(word)%>%
select(myword = word, n)%>%#Rename word
arrange(desc(n))
new_sentiments %>%#Right join gets all words in `my_word_list` to show nulls
right_join(my_word_list, by = c("word"="myword"))%>%
filter(word %in% my_word_list$myword)%>%
mutate(word = color_tile("lightblue","lightblue")(word),
instances = color_tile("lightpink","lightpink")(n),
lexicon = color_tile("lightgreen","lightgreen")(lexicon))%>%
select(-score,-n)%>%#Remove these fields
my_kable_styling(caption ="Dependency on Word Form")Altyapı:
Kelime Biçimine Bağımlılık
word
sentiment
lexicon
words_in_lexicon
instances
sexy
positive
bing
6785
220
sexy
positive
AFINN
2476
220
sex
anticipation
nrc
6468
185
sex
joy
nrc
6468
185
sex
positive
nrc
6468
185
sex
trust
nrc
6468
185
superfunkycalifragisexy
NA
NA
NA
19
lovesexy
NA
NA
NA
16
sexual
NA
NA
NA
11
sexuality
NA
NA
NA
11
sexiness
NA
NA
NA
2
sexually
NA
NA
NA
2
sexe
NA
NA
NA
1
sexed
NA
NA
NA
1
sexier
NA
NA
NA
1
superfunkycalifraagisexy
NA
NA
NA
1
superfunkycalifragisexi
NA
NA
NA
1
Prince’in sexy kelimesini sık kullandığına dikkat edin; ancak NRC’de bu biçimiyle yer almıyor. Sex NRC’de var fakat Bing’de yok. Peki kelimelerin gövde ya da köklerine bakılsa yardımcı olur mu? Ne zor bir durum! Metniniz kök kelimenin geçmiş zamanını, çoğulunu veya zarfını içerebilir; ancak bunlar hiçbir sözlükte yer almayabilir. Bununla nasıl başa çıkarsınız?
Daha Fazla Veri Hazırlığı?
Biraz daha veri hazırlığı adımına ihtiyaç duyabilirsiniz. Duygu analizi yapmadan önce değerlendirilmesi gereken üç teknik şunlardır:
Gövdeleme (stemming): ortak köke ulaşmak için genel olarak ekleri kaldırma
Lemmatizasyon: çekimli (bazen türetilmiş) kelimeleri kök, temel veya gövde forma indirgeme
Kelime değiştirme: kelimeleri daha sık kullanılan eşanlamlılarla değiştirme
Duygu analizinde gelişmiş bir kavram, eşanlamlı (anlamsal olarak benzer eş) ve hipernim (ortak üst kavram) değiştirmedir. Bunlar, sözde geçen ilgili kelimeden daha sık kullanılan ve aslında bir sözlükte olan kelimelerdir; böylece daha yüksek eşleşme yüzdesi sağlar. Bu eğitimde ek veri hazırlığına değinmek için yeterli alan yok; ancak kesinlikle düşünmeye değer!
Görev: sözlükler ve nasıl oluşturuldukları hakkında biraz araştırma yapın. Müzik sözlerine daha uygun olan hâlihazırda mevcut bir sözlük var mı? Gerçekten ilginizi çekiyorsa, kendi sözlüğünüzü oluşturmanın neleri gerektireceğini düşünün. Sınıflandırıcı tabanlı duygu analizi ile sözlük tabanlı duygu analizi arasındaki fark nedir?
Ayrıntılı Analiz
Artık veri kümesi ve sözlükler hakkında temel bir anlayışa sahip olduğunuza göre, analiz için bunları birleştirerek bilgiyi uygulayabilirsiniz. Atacağınız üst düzey adımlar şunlardır:
Sözlüğe özgü veri kümeleri oluşturun
Tüm şarkılardaki polar duyguyu inceleyin
Duygunun zaman içindeki değişimini inceleyin
Sonuçlarınızı Prince’in hayatındaki belirli olaylara karşı doğrulayın
Şarkı düzeyi duyguyu çalışın
Kelime çiftlerinin duyguyu nasıl etkilediğini gözden geçirin
Duygu Veri Kümeleri Oluşturun
Her çağrıda sözlüğün adını geçirerek get_sentiments() fonksiyonuna bir inner_join() yaparak her sözlük için Prince duygu veri kümeleri oluşturarak başlayın. Bu çalışmada ikili duygu için Bing’i, kategorik duygu için NRC’yi kullanın. NRC’de kelimeler Negative/Fear veya Positive/Joy gibi birden fazla kategoride yer alabildiğinden, daha sonra kullanmak üzere positive ve negative kategorilerini içermeyen bir alt küme de oluşturacaksınız.
Sözlerin ayrıntılı analizinde, tüm şarkılar, liste düzeyi, on yıl düzeyi ve kelime düzeyi gibi farklı düzeyleri incelemek isteyeceksiniz. Tüm veri kümesinin NRC duygu analizini grafiğe dökerek başlayın.
(Sırf eğlence olsun diye, grafiklere görsel (meme) eklemek için memery ve magick paketlerini kullandım.)
nrc_plot <- prince_nrc %>%
group_by(sentiment)%>%
summarise(word_count = n())%>%
ungroup()%>%
mutate(sentiment = reorder(sentiment, word_count))%>%#Use `fill = -word_count` to make the larger bars darker
ggplot(aes(sentiment, word_count, fill =-word_count))+
geom_col()+
guides(fill =FALSE)+#Turn off the legend
theme_lyrics()+
labs(x =NULL, y ="Word Count")+
scale_y_continuous(limits = c(0,15000))+#Hard code the axis limit
ggtitle("Prince NRC Sentiment")+
coord_flip()
img <-"prince_background2.jpg"#Load the background image
lab <-""#Turn off the label#Overlay the plot on the image and create the meme file
meme(img, lab,"meme_nrc.jpg", inset = nrc_plot)#Read the file back in and display it!
nrc_meme <- image_read("meme_nrc.jpg")
plot(nrc_meme)Altyapı:
Prince’in sözleri için NRC’nin positivei güçlü biçimde kayırdığı görülüyor. Peki disgust veya anger duygu etiketine sahip tüm kelimeler aynı zamanda negative kategorisinde mi? Buna bakmaya değer olabilir.
Şimdi de Bing genel duygusuna bakın. Bing sözlüğünde Prince’in sözlerinden yer alan 1185 farklı kelimenin kaçı olumlu, kaçı olumsuz?
Bing için, Prince’in müziğinde positive ve negative duygunun eşit göründüğü söylenebilir mi? Veri kümesi çok büyük olduğunda genel duygu birbirini sıfırlıyor olabilir mi? Bunu bilmek zor; fakat parçalar halinde bakıp neler olduğuna bakın.
Akustikte, iki aynı dalganın frekanslarının tam zıt fazda olup birbirini yok etmesine faz iptali denir; örneğin, davulu iki mikrofonla kaydederken sesin bir mikrofona diğerinden daha geç ulaşması gibi. Bu, o frekansta tam bir sessizlikle sonuçlanır! Bu durum, büyük veri kümelerinin duygu analizine nasıl uygulanabilir? Üzerinde düşünün.
Dilbilim Profesörü: "İngilizce'de çift olumsuz olumlu yapar. Rusça’da çift olumsuz hâlâ olumsuzdur. Ancak çift olumlu ile olumsuz yapan hiçbir dil yoktur." Karşı çıkan öğrenci: "Tabii ya, aynen."
Sesi Açın: Liste Düzeyi
Analizinizi Bing sözlüğünü kullanarak liste düzeyine indirip sesini açın. Liste düzeyine göre polar duygunun grafiğini oluşturun. Duyguları sütunlara ayırmak için spread() ve farklı bir bakış açısı için polarity (positive - negative) alanı ile percent_positive alanını ($positive / total sentiment * 100$) oluşturmak için mutate() kullanın. Polarlık grafiği için geom_hline() ile bir yintercept ekleyin. Grafikleri yan yana grid.arrange() ile çizin.
prince_polarity_chart <- prince_bing %>%
count(sentiment, chart_level)%>%
spread(sentiment, n, fill =0)%>%
mutate(polarity = positive - negative,
percent_positive = positive /(positive + negative)*100)#Polarity by chart
plot1 <- prince_polarity_chart %>%
ggplot( aes(chart_level, polarity, fill = chart_level))+
geom_col()+
scale_fill_manual(values = my_colors[3:5])+
geom_hline(yintercept =0, color ="red")+
theme_lyrics()+ theme(plot.title = element_text(size =11))+
xlab(NULL)+ ylab(NULL)+
ggtitle("Polarity By Chart Level")#Percent positive by chart
plot2 <- prince_polarity_chart %>%
ggplot( aes(chart_level, percent_positive, fill = chart_level))+
geom_col()+
scale_fill_manual(values = c(my_colors[3:5]))+
geom_hline(yintercept =0, color ="red")+
theme_lyrics()+ theme(plot.title = element_text(size =11))+
xlab(NULL)+ ylab(NULL)+
ggtitle("Percent Positive By Chart Level")
grid.arrange(plot1, plot2, ncol =2)Altyapı:
Bu, listeye giren şarkıların genellikle olumsuzdan daha çok olumlu olduğunu mu söylüyor? Öyleyse bu, toplumun duymak istediği şey hakkında ne anlatır? Bu varsayımları yapabilir misiniz bilemeyiz. Toplam duyguya göre pozitif duyguya baktığımızda, listeye giren şarkıların biraz daha olumlu olduğu görülüyor. Bu, Bing sözlüğünün kendisinde pozitiften çok negatif kelime olmasına rağmen ilginç.
Kutup Eriyor: So Blue
Duyguyu polar bir bakışla incelediğinize göre, zaman içinde hava durumu gibi değişip değişmediğini görmek isteyebilirsiniz (bilim şakası). Bu kez daha pürüzsüz bir eğri için loess yöntemiyle geom_smooth() ve doğrusal bir eğri için method = lm ile bir başka geom_smooth() kullanın.
prince_polarity_year <- prince_bing %>%
count(sentiment, year)%>%
spread(sentiment, n, fill =0)%>%
mutate(polarity = positive - negative,
percent_positive = positive /(positive + negative)*100)
polarity_over_time <- prince_polarity_year %>%
ggplot(aes(year, polarity, color = ifelse(polarity >=0,my_colors[5],my_colors[4])))+
geom_col()+
geom_smooth(method ="loess", se =FALSE)+
geom_smooth(method ="lm", se =FALSE, aes(color = my_colors[1]))+
theme_lyrics()+ theme(plot.title = element_text(size =11))+
xlab(NULL)+ ylab(NULL)+
ggtitle("Polarity Over Time")
relative_polarity_over_time <- prince_polarity_year %>%
ggplot(aes(year, percent_positive , color = ifelse(polarity >=0,my_colors[5],my_colors[4])))+
geom_col()+
geom_smooth(method ="loess", se =FALSE)+
geom_smooth(method ="lm", se =FALSE, aes(color = my_colors[1]))+
theme_lyrics()+ theme(plot.title = element_text(size =11))+
xlab(NULL)+ ylab(NULL)+
ggtitle("Percent Positive Over Time")
grid.arrange(polarity_over_time, relative_polarity_over_time, ncol =2)Altyapı:
Yukarıdaki ikinci grafikte birkaç aşırılık ayarlandı; ancak genel polarlık eğilimi her iki durumda da negatife gidiyor.
Duygu Yüzüğü
NRC duyguları ile on yıllar arasındaki ilişkileri incelemek için yine chordDiagram() gücünden yararlanacaksınız. Duygu kategorilerinin halkanın üst kısmında, on yılların ise alt kısmında göründüğüne dikkat edin.
Bu, NRC kategorisi başına on yıla göre kelime sayılarını gösterir. Küçük bir grafikte çok şey oluyor; ancak kategoriler ve zaman arasındaki ilişkilere dair tonlarca bilgi sağlar. Bu diyagramlar son derece özelleştirilebilir ve istenildiği kadar basit veya bilgilendirici olabilir.
Gerçek Zamanlı Duygu
DataCamp’te aldığınız harika kurslar sayesinde, bu becerileri gerçek dünyaya uygulamak için muhtemelen sabırsızlanıyorsunuz. Öyleyse şimdi, Prince’in sözlerinizi gerçek bir şeye ve bir zaman dönemine eşleyerek bunu yapın. Ancak bu kadar karmaşık bir konuda basitleştirilmiş bir analiz yaparken şüpheci ve temkinli olun.
Rolling Stone Magazine, Biography.com vb. popüler kaynaklardan derlenen Prince’in hayat olaylarının bir listesini oluşturdum. Veri kümemizde yayın tarihi olan şarkılarla eşleşen oldukça kamusal yılları seçtim. Bu olayları şimdi princeEvents.csv’den içeri okuyun. Ardından prince_bing ve spread()’i kullanarak yıl başına bir polarlık puanı oluşturun. events veri çerçevesiyle birleştirin ve çubuk grafiğinizde renkleri doldurmak için bir duygu alanı oluşturun. Her zamanki gibi, büyük metin etiketleri gösterirken coord_flip() kullanın.
events <- read.csv('princeEvents.csv', stringsAsFactors =FALSE)
year_polarity_bing <- prince_bing %>%
group_by(year, sentiment)%>%
count(year, sentiment)%>%
spread(sentiment, n)%>%
mutate(polarity = positive - negative,
ratio = polarity /(positive + negative))#use polarity ratio in next graph
events %>%#Left join gets event years with no releases
left_join(year_polarity_bing)%>%
filter(event !=" ")%>%#Account for bad data
mutate(event = reorder(event, year),#Sort chart by desc year
sentiment = ifelse(positive > negative,"positive","negative"))%>%
ggplot(aes(event, polarity, fill = sentiment))+
geom_bar(stat ="identity")+
theme_minimal()+ theme(legend.position ="none")+
xlab(NULL)+
ggtitle("Sentiment by Events")+
coord_flip()Altyapı:
İpucu: princeEvents.csv dosyasını burada bulabilirsiniz.
Olayları duyguyla karşılaştırmayı büyüleyici buluyorum. Öznel olsa da, oldukça ilişkili olduklarını gördüm. Evet, olay veri kümesini kendim oluşturdum. Sözlerle eşleşecek şekilde kolayca önyargı katabilirdim. Ancak her yıl için en sık raporlanan olguyu belirlemek üzere birden fazla kaynak kullandım. Bu sonuçlar, Prince’in ne hakkında şarkı söylediğini görmek için kelime düzeyi analizine daha da derinlemesine bakmanız için motivasyon sağlamalı.
The Black Album: 1994 - 1996
1994’te Prince, Afrikalı-Amerikalı dinleyicisini geri kazanma girişimi olarak The Black Album’ü yayımladı. 1994 ve takip eden iki yıl analizde öne çıktığına göre, bu dönem için NRC sözlüğüyle eşleşen en sık kelimelere ggrepel paketinden geom_label_repel() ve geom_point() ile bakabilirsiniz. Bu zor bir grafik; aşağıdaki kodun ayarlarıyla oynamanızı öneririm.
plot_words_94_96 <- prince_nrc %>%
filter(year %in% c("1994","1995","1996"))%>%
group_by(sentiment)%>%
count(word, sort =TRUE)%>%
arrange(desc(n))%>%
slice(seq_len(8))%>%#consider top_n() from dplyr also
ungroup()
plot_words_94_96 %>%#Set `y = 1` to just plot one variable and use word as the label
ggplot(aes(word,1, label = word, fill = sentiment ))+#You want the words, not the points
geom_point(color ="transparent")+#Make sure the labels don't overlap
geom_label_repel(force =1,nudge_y =.5,
direction ="y",
box.padding =0.04,
segment.color ="transparent",
size =3)+
facet_grid(~sentiment)+
theme_lyrics()+
theme(axis.text.y = element_blank(), axis.text.x = element_blank(),
axis.title.x = element_text(size =6),
panel.grid = element_blank(), panel.background = element_blank(),
panel.border = element_rect("lightgray", fill =NA),
strip.text.x = element_text(size =9))+
xlab(NULL)+ ylab(NULL)+
ggtitle("1994 - 1996 NRC Sentiment")+
coord_flip()Altyapı:
Prince, 1994’te Rolling Stone dergisine şöyle demişti,
"Bir adamın hayal kurmasını engellediğinizde o bir köle olur. Benim olduğum yer orasıydı."
Bu nedenle, yüzüne belirgin şekilde yazdığı "slave" kelimesiyle sahneye çıkarak mevcut müzik şirketine yönelik antikurumsal hissini alenen ilan etti. Adını da bir sembole dönüştürdü. Yukarıdaki kelimeler bu olaylarla ne kadar örtüşüyor? Grafikte "slave", "emancipation", "black" ve "change" kelimelerine dikkat edin?
(Unutmayın, bu sadece Prince ile ilgili değil. Bunu herhangi bir metne uygulayabilirsiniz! Örneğin, Başkan Trump’ın görevindeki ilk yılında söylediği en yüksek trust duygu kelimeleri nelerdi?)
Bu Kez Kişisel: 1998
Yukarıdaki Olaylara Göre Duygu grafiği, 1996 ile 1998 arasında Prince’in evlendiğini, iki çocuğunu kaybettiğini ve sahnede 9/11’i öngördüğünün söylendiğini gösteriyordu. (Kendiniz dinlemek için Hollanda’daki 1998 konserine dair YouTube’da arama yapın!) Önceki grafikteki aynı adımları kullanarak, 1998’de her bir NRC kategorisindeki ilk 10 kelimeye bakın.
Kişisel kayıplar ve yaklaşan terör tehdidi göz önüne alındığında, "suicide", "waste", "mad", "hurt" gibi kelimeler ve bu grafikte yer almayan daha birçoğu, yaşanan olayların güçlü bir göstergesidir. Bu kelimeler güçlüdür ve o dönem duygu durumuna gerçek bir içgörü sağlar.
Radarda: Radar Grafikler
Kategoriler arasında duyguyu karşılaştırmanın bir başka harika yolu da, örümcek grafiği olarak da bilinen radar grafiğini kullanmaktır. Bu tür grafikleri radarchart paketiyle oluşturabilirsiniz. Bunlar, hangi değişkenlerin benzer değerlere sahip olduğunu veya her bir değişken için aykırı değerler olup olmadığını görmede kullanışlıdır.
Bu analizi üç farklı düzeye böleceksiniz: yıl, liste ve on yıl. (Yer kazanmak için yalnızca belirli yıllara ait kodları ekleyeceğim.)
positive ve negative duyguları içermeyen prince_nrc_sub veri kümesini kullanın ki diğerleri daha görünür olsun. Bu kez önce yıl başına duyguya göre kelime toplam sayısını ve tüm yılın toplam duygusunu hesaplayacak ve bir yüzde elde edeceksiniz ($yıl başına duygu kelime sayısı / yıl toplamı * 100$).
Özel olarak 1978, 1994, 1995 yıllarını filtreleyin ve select() ile gereksiz alanları kaldırın.
Son olarak, bir satırda her duygu ve her yıl için bir sütun olacak şekilde, yıl ve yüzde değerlerini (anahtar/değer çiftleri) birden çok sütuna spread() ile açmanız gerekir. Ardından etkileşimli bir HTML bileşeni üretmek için chartJSRadar() kullanın. Fareyle üzerine gelindiğinde veri seti etiketlerini göstermek için bir argüman geçirebilirsiniz. (Bilgi: Bazen radarchart, "joy" kelimesinin J ve Y harflerini kırpar ve "iov" gibi görünebilir.)
#Get the count of words per sentiment per year
year_sentiment_nrc <- prince_nrc_sub %>%
group_by(year, sentiment)%>%
count(year, sentiment)%>%
select(year, sentiment, sentiment_year_count = n)#Get the total count of sentiment words per year (not distinct)
total_sentiment_year <- prince_nrc_sub %>%
count(year)%>%
select(year, year_total = n)#Join the two and create a percent field
year_radar_chart <- year_sentiment_nrc %>%
inner_join(total_sentiment_year, by ="year")%>%
mutate(percent = sentiment_year_count / year_total *100)%>%
filter(year %in% c("1978","1994","1995"))%>%
select(-sentiment_year_count,-year_total)%>%
spread(year, percent)%>%
chartJSRadar(showToolTipLabel =TRUE,
main ="NRC Years Radar")Altyapı:
Bu grafikleri karşılaştırmak için yukarı ve aşağı kaydırmanız gerekecek; zira tam boy bırakmak istedim. year gibi daha küçük bir veri kümesiyle, bu tür bir görselleştirme kullanarak her bir duygudaki değişimi daha net görebildiğiniz dikkat çekici. Ayrıca, önceki alıştırmaların aksine yüzde kullanıldığında, tüm grafiklerde en yüksek puanın "joy" olduğuna (özellikle Prince’in kariyerinin başındaki 1978’de) dikkat edebilirsiniz.
Sign O' the Times
Spotify, 140 milyon aktif kullanıcısı için şarkı önerileri oluşturmak üzere makine öğrenimini kullanıyor. Henüz söz içeriğini kullanmıyor. Kullansaydı hayal edin... Şimdi belirli şarkıların ruh hâline daha da derin bakın.
1987’de Prince, "Sign O' the Times" adlı bir şarkı yazdı. Kenneth Partridge’in yazdığı bir Billboard makalesinde şöyle deniyordu:
"Prince, AIDS, çeteler, uyuşturucular, doğal afetler ve hatta Challenger patlaması gibi konuları ele alırken, serinkanlı ve mesafeli davranıyor. 'Sign O' the Times' bir durum güncellemesi, bir eylem çağrısı değil. Onun çözümü sokaklarda yürümek ya da kongre üyenizi aramak değil."
Peki bir makine bu şarkının ruh hâlini nasıl yorumlar? Çok mu duygusal yoksa sadece bilgilendirici mi? Prince’i bir kişi olarak mı yoksa genel olarak toplumu mu temsil ediyor? NRC kategorilerini ggplot2 ile grafiğe dökün.
prince_nrc %>%
filter(song %in%"sign o the times")%>%
group_by(sentiment)%>%
summarise(word_count = n())%>%
ungroup()%>%
mutate(sentiment = reorder(sentiment, word_count))%>%
ggplot(aes(sentiment, word_count, fill =-word_count))+
geom_col()+
guides(fill =FALSE)+
theme_minimal()+ theme_lyrics()+
labs(x =NULL, y ="Word Count")+
ggtitle("Sign O' The Times NRC Sentiment")+
coord_flip()Altyapı:
Yine oldukça öznel olmakla birlikte, sonuçlarınız Partridge’in belirttiği gibi Prince’in "serinkanlı ve mesafeli" davrandığını doğruluyor gibi görünüyor. Bu, anticipation kelimelerinin sadness, fear ve anger gibi duygusal kategorilerden daha baskın olduğunun gözlenmesiyle yorumlanabilir. Bu üç kategorinin duygular, anticipationın ise bir duygu (sentiment) olduğunu söyleyen bir makale var. Billboard yazarı ayrıca şarkının basit bir "durum güncellemesi, neredeyse duygudan yoksun" olduğunu belirtti. Görünüşe göre makine de aynı fikirde. Siz de böyle mi yorumluyorsunuz? Bunun bir R eğitimi olduğunu biliyorum; ancak duygu analizi salt teknik değildir. Yapay zekânın psikolojiyle buluştuğu yer olduğu söylenir.
ggplot2 kullanarak biraz farklı bir grafikle her kategoriye ait kelimelere bakın.
prince_tidy %>%
filter(song %in%'sign o the times')%>%
distinct(word)%>%
inner_join(get_sentiments("nrc"))%>%
ggplot(aes(x = word, fill = sentiment))+
facet_grid(~sentiment)+
geom_bar()+#Create a bar for each word per sentiment
theme_lyrics()+
theme(panel.grid.major.x = element_blank(),
axis.text.x = element_blank())+#Place the words on the y-axis
xlab(NULL)+ ylab(NULL)+
ggtitle("Sign O' The Times Sentiment Words")+
coord_flip()Altyapı:
Bu kelimeleri Billboard makalesinde bahsedilen konularla eşleştirebiliyor musunuz? Bağlantı oldukça açık: Challenger felaketi -> "rocket", AIDS -> "disease", Uyuşturucular -> "crack", Doğal Afetler -> "hurricane", Çeteler -> "gang" vb.
Adeta Partridge, makaleyi yazmadan önce biraz R kodu yazıp bu grafiği oluşturmuş gibi!
Daha Fazla Şarkı
Belirgin başlıklara sahip birkaç şarkı için duygu kategorilerine bakın ve örtüşüyor gibi görünüp görünmediklerine bakın.
NRC duyguları, the future hakkında bir şarkı için yüksek anticipation ve fear, ve controversy hakkında bir şarkı için bunlara ek yüksek trust gösterir. Ağırlıklı olarak sad olan şarkılar da başlıklarıyla örtüşüyor gibi görünüyor.
On Yıla Göre Bigramlar
Şimdiye dek yalnızca unigramlara, yani tek kelimelere baktınız. Ancak "love" sık kullanılan bir kelimeyse, öncesinde ne gelir? Ya sonrasında? Bağlamdan kopuk tek kelimelere bakmak yanıltıcı olabilir. Şimdi bigramlara, yani kelime çiftlerine bakma zamanı.
Uygun bir şekilde, tidytext paketi tek kelimelerin yanı sıra kelime çiftlerini de açma olanağı sunar. Bu durumda unnest_tokens() çağrısında token argümanına ngrams geçeceksiniz. Yalnızca bigramlara (ardışık iki kelime) baktığınızdan n = 2 geçin. Sonuçları prince_bigrams’da saklayın.
tidyr paketi, separate() fonksiyonuyla bigramları tekil kelimelere ayırma olanağı sağlar. Durak kelimeleri ve istenmeyen kelimeleri kaldırmak için bigramları bölmek, istemediklerinizi filtrelemek ve ardından unite() ile kelime çiftlerini yeniden birleştirmek istersiniz. Bu, on yıla göre en yaygın bigramları görselleştirmeyi kolaylaştırır. (Birinci Bölüm’de slice() ve row_number() açıklamasına bakın)
prince_bigrams <- prince_data %>%
unnest_tokens(bigram, lyrics, token ="ngrams", n =2)
bigrams_separated <- prince_bigrams %>%
separate(bigram, c("word1","word2"), sep =" ")
bigrams_filtered <- bigrams_separated %>%
filter(!word1 %in% stop_words$word)%>%
filter(!word2 %in% stop_words$word)%>%
filter(!word1 %in% undesirable_words)%>%
filter(!word2 %in% undesirable_words)#Because there is so much repetition in music, also filter out the cases where the two words are the same
bigram_decade <- bigrams_filtered %>%
filter(word1 != word2)%>%
filter(decade !="NA")%>%
unite(bigram, word1, word2, sep =" ")%>%
inner_join(prince_data)%>%
count(bigram, decade, sort =TRUE)%>%
group_by(decade)%>%
slice(seq_len(7))%>%
ungroup()%>%
arrange(decade, n)%>%
mutate(row = row_number())Altyapı:
bigram_decade %>%
ggplot(aes(row, n, fill = decade))+
geom_col(show.legend =FALSE)+
facet_wrap(~decade, scales ="free_y")+
xlab(NULL)+ ylab(NULL)+
scale_x_continuous(# This handles replacement of row
breaks = bigram_decade$row,# Notice need to reuse data frame
labels = bigram_decade$bigram)+
theme_lyrics()+
theme(panel.grid.major.x = element_blank())+
ggtitle("Bigrams Per Decade")+
coord_flip()Altyapı:
Bigramları kullanarak, ortak ifadelerin seksten, danstan ve romantizmden dine ve (gökkuşağı) çocuklara doğru kaydığını neredeyse görebiliyorsunuz. Bilginize: "rainbow baby" terimi bazen, düşükle bebek kaybettikten sonra başka bir çocuk bekleyen ebeveynler tarafından kullanılır. İlginçtir ki, Prince’in Rainbow Children albümüne ilişkin gerçek bir incelemede buna değinildiğini bulamadım.
Bigramlarla Duygu
Peki bigramlar duyguyu nasıl etkiler? Bu kez AFINN sözlüğünü kullanarak kelime çiftleri üzerinde duygu analizi yapın ve duygu ile ilişkili kelimelerin ne sıklıkla "not" gibi olumsuzlayıcı kelimelerle öncelediğine bakın.
AFINN <- get_sentiments("afinn")
not_words <- bigrams_separated %>%
filter(word1 =="not")%>%
inner_join(AFINN, by = c(word2 ="word"))%>%
count(word2, score, sort =TRUE)%>%
ungroup()
not_words %>%
mutate(contribution = n * score)%>%
arrange(desc(abs(contribution)))%>%
head(20)%>%
mutate(word2 = reorder(word2, contribution))%>%
ggplot(aes(word2, n * score, fill = n * score >0))+
geom_col(show.legend =FALSE)+
theme_lyrics()+
xlab("Words preceded by \"not\"")+
ylab("Sentiment score * Number of Occurrences")+
ggtitle("Polar Sentiment of Words Preceded by Not")+
coord_flip()Altyapı:
Grafiğin ilk satırında care, tek kelimeli analizde "not" göz ardı edildiği için yalancı pozitif duygu alır. Yalancı pozitif bigramlar yalancı negatif bigramları dengeler mi?
Yine yanıtlayamayacağım bir soru; fakat daha fazla keşif için iyi bir konu. İpucu: daha da fazla ardışık kelimeye bakmak için unnest_tokens()’a "trigrams" ve "n = 3" parametrelerini de geçebilirsiniz!
Başka olumsuzlayıcı kelimeler de vardır. Bu kez ggraph ve igraph paketlerini kullanarak bir ağ grafiği oluşturacaksınız. Kelimeleri, merkezlerinde olumsuzlayıcı kelimeler olacak şekilde bağlı düğümlere yerleştireceksiniz. İlk nesneyi graph_from_data_frame() ile tidy veri setinden oluşturun ve sonra ggraph() ile çizin. Ana düğümleri geom_edge_density() çağrısıyla vurgulayabilirsiniz. Benzer bir örneğin daha fazla ayrıntısını Julia Silge ve David Robinson’ın Tidy Text Mining kitabında bulabilirsiniz.
Burada, olumsuzlayıcı kelimelerle ilişkili kelime çiftlerini görüyorsunuz. Analiziniz unigramlara dayanıyorsa ve "alone" olumsuz çıkarsa, yukarıda gördüğünüz "not alone" bigramı ters etki yaratacaktır. Bazı kelimeler birden fazla düğüme geçiş yapar; bunu "never hurt" ve "not hurt" örneklerinde olduğu gibi bu tür görsellerde kolayca görebilirsiniz.
Çiftli Karşılaştırmalar
Artık n-gramlara baktığınıza göre, kelimeler arasındaki korelasyona bakın. Hangi kelimeler en yüksek korelasyona sahip? widyr paketinden pairwise_count() işlevini kullanarak birlikte görülme sayılarını belirleyin. Yani her kelime çiftinin bir şarkıda birlikte göründüğü sayıları sayarsınız. widyr paketi tidy bir veri kümesini alır, görselleştirme ve daha fazla analiz için geçici olarak genişletip tekrar tidy yapıya döndürür.
Basit olması için, Prince’in sözlerinde dört ilginç kelime seçtim.
pwc <- prince_tidy %>%
filter(n()>=20)%>%#High counts
pairwise_count(word, song, sort =TRUE)%>%
filter(item1 %in% c("love","peace","gangster","hate"))%>%
group_by(item1)%>%
slice(seq_len(7))%>%
ungroup()%>%
mutate(row =-row_number())#Descending order
pwc %>%
ggplot(aes(row, n, fill = item1))+
geom_bar(stat ="identity", show.legend =FALSE)+
facet_wrap(~item1, scales ="free")+
scale_x_continuous(#This handles replacement of row
breaks = pwc$row,#Notice need to reuse data frame
labels = pwc$item2)+
theme_lyrics()+ theme(panel.grid.major.x = element_blank())+
xlab(NULL)+ ylab(NULL)+
ggtitle("Pairwise Counts")+
coord_flip()Altyapı:
Bunu çiftli korelasyon ile karşılaştırın. Bu, kelimelerin ayrı ayrı ne sıklıkta göründüğüne göre birlikte ne sıklıkta göründüklerini ifade eder. pairwise_cor() kullanarak, kelimelerin aynı şarkıda görünme sıklığına göre aralarındaki korelasyonu belirleyin.
Sadece bu dört kelimeye dayanarak bile sözlere dair içgörülerin büyüleyici olduğunu düşünüyorum! Bu sonuçlara bakarak bazı temaların belirmeye başladığını görebilirsiniz. Bu da bir sonraki eğitim olan Konu Modellemesi’ne harika bir geçiş sağlar!
Sonuç
Bu eğitimde tidy bir veri kümesi oluşturup, leksik çeşitlilik ve yayın yılına göre şarkı sayısı gibi temel bilgileri analiz ettiniz ve yayın on yılı ile bir şarkının listeye girip girmediği arasındaki ilişkiyi incelediniz. Ardından bazı duygu sözlüklerini ve sözlerle ne kadar iyi eşleştiklerini keşfettiniz. Sonra tüm şarkılarda duygu analizi, zaman içinde duygu, şarkı düzeyi duygu ve bigramların etkisini çalıştınız. Bunu her biri farklı bir bakış açısı sunan çok çeşitli ilginç grafiklerle yaptınız.
O hâlde sözlerdeki ruh hâlini belirleyen bir program yazmak mümkün mü? Evet, mümkün! Sonuçlarınız ne kadar güvenilir? Bu, veri hazırlığı miktarı, sözlük seçimi, analiz yöntemi, kaynak verinin kalitesi vb. geniş bir yelpazeye bağlıdır. Gerçek yaşam olaylarını —kişisel ve toplumsal— karşılaştırmak, herhangi bir sözün ruh hâlini aydınlatabilir. Prince’in polar duygusu zamanla hafifçe azalmış görünse de genel olarak joy öne çıkıyor. Listeye giren şarkılar, girmeyenlere göre daha olumlu görünüyor. 9/11’i ve kendi ölümünü öngördüğüne dair iddialar, sözleriyle ürkütücü biçimde örtüşüyor.
Ancak sözler karmaşıktır ve fazla varsayım sorun çıkarabilir. Sözler hakkında öğrendiklerinizi bir sonraki eğitim olan İkinci Bölüm-B’ye, Konu Modellemesi’ne taşırsanız, temaları ve motifleri ortaya çıkarmada iyi bir yol kat etmiş olacaksınız. Noktalama veya cümle yapısı olmadan görünen sözlerde ne kadar NLP yapılabilir? Prince gerçekten ne hakkında şarkı söylüyordu? Artık ruh hâlini anladığınıza göre, olası konuları araştırmaya daha hazırsınız. Ve son olarak, bir şarkının on yılını veya liste düzeyini tahmin etmek için makine öğrenimi tekniklerini uygulayabilir misiniz? Öğrenmek için sonraki eğitimlerde bana katılın!
Umarım yolculuğunuzdan şimdiye kadar keyif almışsınızdır. İkinci Bölüm-B’de 1999’daki gibi parti yapacağız!
Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
Prince’in, The Artist’ın hayatı ve zamanlarında duygusal bir yolculuğa çıkın. Üç bölümlük bir eğitim serisinin İki-A kısmında, R ile duygu analizini kullanarak The Artist’ın kariyeri ve toplumsal etkisine ışık tutacağız. Üç eğitim şu konuları kapsar:
Duygu analizi hakkında daha fazla bilgi edinmek isterseniz, R’de Duygu Analizi: Tidy Yöntem kursumuza mutlaka göz atın.
Prince’in, sahnede, 9/11’i gerçekleşmeden üç yıl önce öngördüğünü biliyor muydunuz? Kendi ölümünü de öngörmüş olabilir. Bu gerçekten mümkün mü? Sözlerini inceleyip kendi akıl yürütmenizle bir yargıda bulunmak ilginç olmaz mı? 21 Nisan 1985’te "Sometimes It Snows In April"ı kaydetti. Tam 31 yıl sonra, 21 Nisan 2016’da hayatını kaybetti. Bu şarkının duygu analizindeki kelime seçimlerine bir bakın:
Bu, Öngörüsel Analitik’e yeni bir anlam katıyor!
Yapı
Her bir kod parçasını, genellikle öznel nitelikte bir içgörü izler. İsterseniz, kendi varsayımlarınızı yaparak bölümler arasında özgürce gezinin! Aşağıdaki giriş bölümünü okumanızı öneririm; ancak doğrudan koda atlamak isterseniz buraya tıklayın. Sözlüklerin (lexicon) arkasındaki kavramı zaten anlıyorsanız, doğrudan ayrıntılı analiz bölümüne giderek hızlı ilerleyebilirsiniz.
Giriş
Üçlüler: Üç Bölümlük Özet
Az önce iki kedi yavrusu ve bir köpek sahiplendim, artık üçlüler halinde düşünüyorum. Ayrıca, üç kuralı, üçlü gelen şeylerin doğası gereği daha komik, daha tatmin edici veya diğerlerine göre daha etkili olduğunu öne süren bir yazım ilkesidir — bu yüzden bunu üç parçaya böldüm... Birinci Bölüm’de, efsanevi sanatçı Prince’in yüzlerce şarkı sözünden oluşan bir veri kümesini kullanarak metin madenciliği ve keşifsel analize giriş yaptınız. İkinci Bölüm’de, NLP ile duygu analizi (İki-A) ve konu modellemesine (İki-B) odaklanacaksınız. Üçüncü Bölüm ise, bir şarkının hangi on yılda yayımlandığını belirlemenin mümkün olup olmadığı ya da daha ilginci, sözlerine dayanarak Billboard listelerine girip girmeyeceğini tahmin etmek gibi soruları ele alan ek öngörüsel analitik görevleriyle tamamlanacak. Bu eğitimler boyunca, aşağıdaki görselde kırmızıyla vurgulanan farklı makine öğrenimi algoritmalarını kullanacaksınız.
Ayrılmak Zordur
Evet, sadece üç bölüme söz verdiğim doğru, ancak İkinci Bölüm’ü İki-A (Duygu Analizi) ve İki-B (Konu Modellemesi - yakında) olarak böldüm; böylece dört ayrı eğitim ortaya çıktı. Duygu analizinin arkasındaki sürece ilişkin birçok harika makale ve kurs var; bu nedenle İki-A’nın amacı yalnızca kod yazmak değil, analizden içgörüler çıkarmaya odaklanmaktır. Örnek olarak Prince’in şarkı sözlerini kullanacaksınız, fakat adımları kendi favori sanatçınıza da uygulayabilirsiniz. Tüm eğitim serisi boyunca yolculuğunuz, NLP ve makine öğrenimi tekniklerine giriş yaparken, söz analiziyle sunulan fırsatlar hakkında sizde bir merak duygusu uyandırmayı umuyor.
Önkoşullar
Bu eğitim serisinin İki-A kısmı, tidy veriye temel düzeyde aşinalık gerektirir — özellikle
dplyr(veri dönüştürme),ggplot2(görselleştirme) ve%>%boru operatörü (ilk olarakmagrittrpaketinden). Kodu derli toplu ve yeniden kullanılabilir tutmak için,%>%operatörünün sıklıkla adımları birleştirmek için kullanıldığını göreceksiniz.Bu eğitim aynı zamanda bir vaka çalışması olduğundan, yaygın kullanılan grafik ve çizelgelerin ötesinde yoğun bir görselleştirme içerir. Sonuç olarak, bir diğer önkoşul da kendi ortamınıza yeni paketler kurabilmektir. İçgörü elde etmeye odaklanmak için, kendi veri kümenizde yeniden kullanılmak üzere tasarlanmış kodlar ekledim; ancak ayrıntılı açıklama, sizin tarafınızdan daha fazla araştırma gerektirecektir. Her paket için destekleyici bağlantılar verilecektir. Böylece uygulamalarına odaklanırken yeni araçlarla tanışmış olacaksınız.
İpucu: eğitim serisine temel oluşturmak ve Prince’in sözlerindeki yoğun ve çeşitli kelime dağarcığına dair içgörü kazanmak için önce Birinci Bölüm’ü okuyun.
Duygu Analizine Genel Bakış
Yöntemler: Duygu analizi, içeriğin görüşünü ve öznelliğini belirlemeyi amaçlayan bir metin madenciliği türüdür. Şarkı sözlerine uygulandığında, sonuçlar yalnızca sanatçının tutumlarını temsil etmekle kalmaz, aynı zamanda yaygın kültürel etkileri de ortaya çıkarabilir. Duygu analizinde kullanılan farklı yöntemler vardır; bilinen bir veri kümesini eğitmek, kurallarla kendi sınıflandırıcılarınızı oluşturmak ve önceden tanımlanmış sözcük sözlüklerini (lexicon) kullanmak gibi. Bu eğitimde sözlük tabanlı yaklaşımı kullanacaksınız; ancak diğer yöntemleri ve bunların getiri-götürülerini de araştırmanızı öneririm.
Düzeyler: Nasıl ki duygu analizi için farklı yöntemler varsa, metne bağlı olarak farklı analiz düzeyleri de vardır. Bu düzeyler genellikle belge, cümle ve kelime olarak tanımlanır. Şarkı sözlerinde belge, on yıla, yıla, liste düzeyine veya şarkıya göre duygu olarak tanımlanabilir. Cümle düzeyi şarkı sözlerinde genellikle seçenek değildir; çünkü noktalama, uyak ve kalıplardan uzaklaştırabilir. Kelime düzeyi analiz, ayrıntılı bilgileri ortaya çıkarır ve konu modellemesi gibi daha ileri uygulamalar için temel bilgi olarak kullanılabilir.
Sorularınızı Hazırlayın!
Her veri bilimi projesinin keşfedilecek bir soru seti olmalıdır. Bu eğitim boyunca aklınızda bulundurmanız için birkaç soru: Şarkı sözlerinde ifade edilen ruh halini belirleyecek bir program yazmak mümkün mü? Önceden tanımlanmış sözlükler yeterli mi? Ne kadar veri hazırlığı gerekli? Sonuçlarınızı gerçek hayattaki olaylarla ilişkilendirebilir misiniz? Duygu zaman içinde değişiyor mu? Hit şarkılar, listeye girmemiş şarkılara göre daha pozitif mi yoksa daha negatif mi? Prince’in 9/11’i öngördüğü söylenen yılda sözlerinde hangi kelimeler öne çıkıyor? Kendi ölümünü öngördü mü?
İpucu: söz analizi, konuşmalardan veya kitaplardan çok farklı ve genellikle daha karmaşıktır; içgörü elde etmeyi zorlaştırır. Bu nedenle tüm varsayımlar konusunda temkinli olun! Bu eğitimde yanıtlardan çok soru soracağım; dolayısıyla kare paralelkenarın dışına çıkmaya hazırlıklı olun!
Hazırlık Çalışması
Kütüphaneler ve Fonksiyonlar
Prince’in şarkı sözlerini analiz etmeye başlamak için aşağıdaki kütüphaneleri yükleyin. İlk bakışta göz korkutucu görünebilirler; ancak çoğu yalnızca grafik ve çizelgeler içindir. Görselleştirmelerin sık kullanımını göz önüne alarak tutarlılık için standart bir renk şeması tanımlamak daha iyidir. Belirli ANSI renk kodlarını kullanarak bir liste oluşturdum.
ggplot2’nintheme()fonksiyonu, tek tek grafiklerin özelleştirilmesine olanak tanır; bu yüzden varsayılan ayarları değiştirecek kendi fonksiyonunuzu,theme_lyrics()de oluşturacaksınız.knitrpaketi, R ile dinamik rapor üretimi için bir motordur.kableExtraveformattableile birlikte kullanarak renkli, çekici metin tabloları oluşturun. Yine bu kütüphanelerin çıktılarını standartlaştırmak içinmy_kable_styling()adlı kendi fonksiyonunuzu oluşturun. Diğer paketleri kullanıldıkça anacağım.Sushi Verisi
Her zaman olduğu gibi, ham veriyi bir veri çerçevesine okuyarak başlayacaksınız. Birinci Bölüm’de, orijinal veri kümesinde bazı düzenlemeler yapmıştınız: kısaltmaları açma, kaçış dizilerini kaldırma ve metni küçük harfe çevirme gibi. Bu temiz veri kümesini bu eğitimde kullanmak üzere bir CSV dosyasına kaydetmiştiniz.
read.csv()ileprince_data’yı oluşturun ve sözlerin karakter dizileri olarak kalmasını istediğinizden,stringsAsFactors = FALSEayarını yapmayı unutmayın. Satır numaralarına ihtiyacınız olmadığından,row.names = 1olarak ayarlayın.Not: tibble adlı modern bir veri çerçevesine
read_csv()ile okursanız bu parametrelerden kaçınabilirsiniz; ancak Birinci Bölüm ile tutarlılık için buradaread.csv()kullanılmıştır.Veriye hızlıca bir göz atın:
prince_data’nın 824 şarkı ve 10 sütundan oluşan bir veri çerçevesi olduğunu görebilirsiniz. Bu, bir kaydın kelimenin tam anlamıyla bir şarkı olduğu anlamına gelir!Tertemiz Eğlence:
prince_tidyİşte kalan birkaç veri düzenleme adımı:
Ham verinizi tidy formata dönüştürmek için,
tidytext’tenunnest_tokens()kullanarak şarkı sözlerini kelime başına bir satır olacak şekilde bölüpprince_tidy’yi oluşturun. Ardından kalan temizlik adımları içindplyr’denanti_join()vefilter()kullanabilirsiniz. (Ayrıntılı açıklama için Birinci Bölüm’e bakın.)Yeni veri kümeniz
prince_tidyartık, geldiği şarkıyla birlikte satır başına bir kelime olacak şekilde tokenleştirilmiş formdadır. Artık 76116 kelime ve 10 sütundan oluşan bir veri çerçeveniz var.Betimsel İstatistikler
Birinci Bölüm’ü okumadıysanız, tam veri kümesine dair birkaç özet grafiğe hızlıca bakmanız gerekebilir. Bunu
ggplot2,circlizeveyarrrpaketlerinden yaratıcı grafikler ile yapacaksınız.Tertemiz: Şarkı Başına Kelime Sayısı
Bir korsan, her şey düzenli, derli toplu ve temiz olduğunda shipshape derdi. O halde burada, zaman içinde sözlerin söz dağarcığına, yani başka bir deyişle, leksik çeşitliliğe dair ilginç bir görünüm var. Bir korsan grafiği, kelime sayısı gibi sürekli bir bağımlı değişkeni, on yıl gibi kategorik bir bağımsız değişkenin fonksiyonu olarak görselleştirmenin gelişmiş bir yoludur. Bu, ham veri noktalarını, betimsel ve çıkarımsal istatistikleri tek bir etkili grafikte birleştirir.
yarrrpaketindekipirateplot()hakkında daha fazla ayrıntı için şu harika bloga göz atın.word_summaryveri çerçevesini oluşturarak şarkı başına farklı kelime sayısını hesaplayın. Sözler ne kadar çeşitliyse, kelime dağarcığı o kadar geniştir. Veriye bu şekilde bakmak, sizi kelime düzeyi analizine hazırlar. Yayın tarihi olmayan şarkılar için on yıl alanını"NONE"değeriyle sıfırlayın veselect()kullanarak bu alanları daha okunaklı etiketlerle yeniden adlandırın.Bu korsan grafikteki her renkli daire bir şarkıyı temsil eder.
"NONE" değeriyle yer alan yoğun kırmızı alan, veri kümesindeki çok sayıda şarkının yayın tarihinin olmadığını gösterir. Erken on yıllarda şarkı başına benzersiz kelime sayısında hafif bir artış eğilimi vardır: düz yatay çizgi, o on yılın ortalama kelime sayısını gösterir. Bu, zaman içindeki duyguyu analiz etmeye başladığınızda bilmeniz gereken önemli bir noktadır. Prince’in kariyeri boyunca kelimeler daha da aydınlatıcı hale gelir.Yalnızca yüzeyine değindiğiniz için, korsan grafiklerini daha ayrıntılı biçimde keşfetmenizi öneririm!
Tüm Yıl Boyunca: Yıla Göre Şarkı Sayısı
Dairesel grafikler, birkaç kategori arasındaki karmaşık (ya da basit!) ilişkileri görselleştirmenin benzersiz bir yoludur. (Hem de albümler eskiden yuvarlaktı!). Aşağıdaki grafik,
ggplot2’dencoord_polar()kullanılarak oluşturulmuş, yıllara göre göreli şarkı sayısını gösteren basit bir dairesel çubuk grafiğidir. Bu kadar basit bir grafik için çokça kod gerekiyor; ama kesinlikle değer. Benzer bir örnek R Graph Gallery’de daha ayrıntılı olarak burada bulunabilir. Korsan grafiklerinde olduğu gibi, bu da dairesel grafiklerle neler yapabileceğinize bir giriş niteliğinde.Tam tepedeki boşluğu görüyor musunuz? Bu, korsan grafikte belirlediğiniz yüzlerce yayın tarihi olmayan şarkının bir göstergesidir. Liste dışı şarkı sayısı bu kadar büyükken, bunlar dahil edilseydi grafik kullanışlı olmazdı. Eksik yıllar, o yıllarda hiç şarkı yayımlanmadığını gösterir. En üretken yıllar 1996 ve 1998’dir.
Nedenini öğrenmek ister misiniz? Okumaya devam edin!
Akorlar: On Yıla Göre Listeye Giren Şarkılar
Aşağıdaki grafik, bir şarkının yayımlandığı on yıl ile Billboard listelerine girip girmediği arasındaki ilişkiyi gösterir. Müzikal bir analiz için
chordDiagram()kullanmak pek tabii yerinde oldu! Bu grafiksel araç, Zuguang Gu’nun güzelcirclizepaketindendir. Grafik iki kategoriye ayrılmıştır: liste başarısı (üst) ve on yıl (alt). İki kategori geniş boşluklarla ayrılır; değerler arasında daha küçük boşluklar bulunur. Aşağıdaki koddaki üst düzey açıklamalar, daha fazla ayrıntı ile burada desteklenebilir.Yukarıdaki dairesel grafik ilk bakışta karmaşık görünse de, on yıl ve liste düzeyine göre şarkı sayılarını güzelce gösterir. Prince, 1970’lerde kariyerine az sayıda yayınla başlamış ve bazıları listeye girmiştir. 1980’leri 1990’larla karşılaştırırsanız, 1990’larda daha fazla şarkı yayımlandığını; ancak 1980’lerde daha çok şarkının listeye girdiğini görürsünüz. 2000’lerde ticari olarak başarılı az sayıda şarkı vardır ve 2010’larda hit şarkı yoktur.
Sözlükler ve Sözler
Bu bölümde şunları yapacaksınız:
Duygu Sözlüklerini Keşfedin
tidytextpaketi,sentimentsadlı ve birkaç farklı sözlük sağlayan bir veri kümesi içerir. Bu sözlükler, sözcüklere atanmış duygu kategorisi veya değeri olan kelime sözlükleridir.tidytextüç genel amaçlı sözlük sunar:Sözlükleri incelemek için
new_sentimentsadlı bir veri çerçevesi oluşturun. Bir finans sözlüğünü filtreleyin, AFINN sözlüğü için sayısal puanı positive veya negativee çevirerek ikili (diğer adıyla polar) bir duygu alanı oluşturun ve her sözlük için farklı kelime sayısını tutan bir alan ekleyin.new_sentiments, farklı duygu kategorilerini tek bir sütunda tutar; bu nedenle, her sözlük ve kategoriye göre kelime sayılarını daha iyi görmek içintidyr’denspread()ile bu kategorileri ayrı alanlara döndürün. Daha önce oluşturduğunuzmy_kable_styling()fonksiyonundaknitrvekableExtrapaketlerinden yararlanın.formattable’dancolor_tile()vecolor_bar()ile tablonuza renk ekleyerek güzel biçimlendirilmiş bir tablo oluşturun. Tablonuzu yazdırın ve sözlükler arasındaki farkları inceleyin.Yukarıdaki tablo, her sözlüğün boyutu ve yapısı hakkında fikir verir.
Eşleşme Noktası
Hangi sözlüğün şarkı sözlerine daha uygun olduğunu belirlemek için, hem sözlükte hem de sözlerde ortak olan kelimelerin eşleşme oranına bakmak isteyeceksiniz. Hatırlatma:
prince_tidy’de toplam 76116 kelime ve 7851 farklı kelime vardır.Peki bu kelimelerin kaçı sözlüklerde yer alıyor?
prince_tidyilenew_sentimentsarasında birinner_join()yapın ve ardından sözlüğe göre gruplayın. NRC sözlüğünde 10 farklı kategori vardır ve bir kelime birden fazla kategoride yer alabilir: örneğin hem negatif hem de hüzünlü olabilir. Bu nedenle, sözlük başına farklı kelime sayısını elde etmek içinsummarise()içinden_distinct()kullanmak isteyeceksiniz.NRC sözlüğü, AFINN veya Bing’e göre sözlerden daha fazla farklı kelime içeriyor. Eşleşme oranlarının toplamının düşük olduğuna dikkat edin. Hiçbir sözlük tüm kelimeleri kapsayamaz ve kapsamalı da değildir. Pek çok kelime nötr kabul edilir ve ilişkili bir duyguya sahip olmayabilir. Örneğin, 2000 genellikle nötr bir kelimedir ve bu nedenle sözlüklerde bulunmaz. Ancak hatırlarsanız, o yıl uçakların gökten düşeceği ve bilgisayarların duracağı öngörülmüştü. Yani şarkıda var olan bir korku vardır; fakat tipik sözlükler kullanılarak yapılan duygu analizinde yakalanmaz.
Bir kelimenin sözlükte görünmemesinin birkaç nedeni şunlardır:
Sözümü Doğrulamayın, Kendiniz Bakın
Prince’in sözlerinden duygu üzerinde etkisi var gibi görünen bazı belirli kelimelere bakın. Hepsi tüm sözlüklerde var mı?
Controversy ve dark, NRC ve Bing’de yer alır; ancak gangster yalnızca Bing’de bulunur. Race ise hiç görünmez ve Prince’in sözlerinde kritik bir konudur. Fakat kolayca bir duyguya bağlanabilir mi? AFINN’in çok daha küçük olduğunu ve bu kelimelerden sadece birine sahip olduğunu unutmayın.
Kelime Biçimleri
Şimdi daha karmaşık bir örneğe bakalım. Cinsellik, Prince’in müziğinde yaygın bir temadır. Önceden tanımlanmış sözlüklere dayalı duygu analizi, bir kelimenin farklı biçimlerinden nasıl etkilenir? Örneğin, sözlerde kök kelime sexe yapılan tüm göndermeler şunlar. Bunları Bing ve NRC ile karşılaştırın ve nerelerde eşleşme olduğuna bakın.
Prince’in sexy kelimesini sık kullandığına dikkat edin; ancak NRC’de bu biçimiyle yer almıyor. Sex NRC’de var fakat Bing’de yok. Peki kelimelerin gövde ya da köklerine bakılsa yardımcı olur mu? Ne zor bir durum! Metniniz kök kelimenin geçmiş zamanını, çoğulunu veya zarfını içerebilir; ancak bunlar hiçbir sözlükte yer almayabilir. Bununla nasıl başa çıkarsınız?
Daha Fazla Veri Hazırlığı?
Biraz daha veri hazırlığı adımına ihtiyaç duyabilirsiniz. Duygu analizi yapmadan önce değerlendirilmesi gereken üç teknik şunlardır:
Duygu analizinde gelişmiş bir kavram, eşanlamlı (anlamsal olarak benzer eş) ve hipernim (ortak üst kavram) değiştirmedir. Bunlar, sözde geçen ilgili kelimeden daha sık kullanılan ve aslında bir sözlükte olan kelimelerdir; böylece daha yüksek eşleşme yüzdesi sağlar. Bu eğitimde ek veri hazırlığına değinmek için yeterli alan yok; ancak kesinlikle düşünmeye değer!
Görev: sözlükler ve nasıl oluşturuldukları hakkında biraz araştırma yapın. Müzik sözlerine daha uygun olan hâlihazırda mevcut bir sözlük var mı? Gerçekten ilginizi çekiyorsa, kendi sözlüğünüzü oluşturmanın neleri gerektireceğini düşünün. Sınıflandırıcı tabanlı duygu analizi ile sözlük tabanlı duygu analizi arasındaki fark nedir?
Ayrıntılı Analiz
Artık veri kümesi ve sözlükler hakkında temel bir anlayışa sahip olduğunuza göre, analiz için bunları birleştirerek bilgiyi uygulayabilirsiniz. Atacağınız üst düzey adımlar şunlardır:
Duygu Veri Kümeleri Oluşturun
Her çağrıda sözlüğün adını geçirerek
get_sentiments()fonksiyonuna birinner_join()yaparak her sözlük için Prince duygu veri kümeleri oluşturarak başlayın. Bu çalışmada ikili duygu için Bing’i, kategorik duygu için NRC’yi kullanın. NRC’de kelimeler Negative/Fear veya Positive/Joy gibi birden fazla kategoride yer alabildiğinden, daha sonra kullanmak üzere positive ve negative kategorilerini içermeyen bir alt küme de oluşturacaksınız.Havalardasınız: Genel Duygu
Sözlerin ayrıntılı analizinde, tüm şarkılar, liste düzeyi, on yıl düzeyi ve kelime düzeyi gibi farklı düzeyleri incelemek isteyeceksiniz. Tüm veri kümesinin NRC duygu analizini grafiğe dökerek başlayın.
(Sırf eğlence olsun diye, grafiklere görsel (meme) eklemek için
memeryvemagickpaketlerini kullandım.)Prince’in sözleri için NRC’nin positivei güçlü biçimde kayırdığı görülüyor. Peki disgust veya anger duygu etiketine sahip tüm kelimeler aynı zamanda negative kategorisinde mi? Buna bakmaya değer olabilir.
Şimdi de Bing genel duygusuna bakın. Bing sözlüğünde Prince’in sözlerinden yer alan 1185 farklı kelimenin kaçı olumlu, kaçı olumsuz?
Bing için, Prince’in müziğinde positive ve negative duygunun eşit göründüğü söylenebilir mi? Veri kümesi çok büyük olduğunda genel duygu birbirini sıfırlıyor olabilir mi? Bunu bilmek zor; fakat parçalar halinde bakıp neler olduğuna bakın.
Akustikte, iki aynı dalganın frekanslarının tam zıt fazda olup birbirini yok etmesine faz iptali denir; örneğin, davulu iki mikrofonla kaydederken sesin bir mikrofona diğerinden daha geç ulaşması gibi. Bu, o frekansta tam bir sessizlikle sonuçlanır! Bu durum, büyük veri kümelerinin duygu analizine nasıl uygulanabilir? Üzerinde düşünün.
Sesi Açın: Liste Düzeyi
Analizinizi Bing sözlüğünü kullanarak liste düzeyine indirip sesini açın. Liste düzeyine göre polar duygunun grafiğini oluşturun. Duyguları sütunlara ayırmak için
spread()ve farklı bir bakış açısı için polarity (positive - negative) alanı ile percent_positive alanını ($positive / total sentiment * 100$) oluşturmak içinmutate()kullanın. Polarlık grafiği içingeom_hline()ile biryinterceptekleyin. Grafikleri yan yanagrid.arrange()ile çizin.Bu, listeye giren şarkıların genellikle olumsuzdan daha çok olumlu olduğunu mu söylüyor? Öyleyse bu, toplumun duymak istediği şey hakkında ne anlatır? Bu varsayımları yapabilir misiniz bilemeyiz. Toplam duyguya göre pozitif duyguya baktığımızda, listeye giren şarkıların biraz daha olumlu olduğu görülüyor. Bu, Bing sözlüğünün kendisinde pozitiften çok negatif kelime olmasına rağmen ilginç.
Kutup Eriyor: So Blue
Duyguyu polar bir bakışla incelediğinize göre, zaman içinde hava durumu gibi değişip değişmediğini görmek isteyebilirsiniz (bilim şakası). Bu kez daha pürüzsüz bir eğri için
loessyöntemiylegeom_smooth()ve doğrusal bir eğri için method =lmile bir başkageom_smooth()kullanın.Yukarıdaki ikinci grafikte birkaç aşırılık ayarlandı; ancak genel polarlık eğilimi her iki durumda da negatife gidiyor.
Duygu Yüzüğü
NRC duyguları ile on yıllar arasındaki ilişkileri incelemek için yine
chordDiagram()gücünden yararlanacaksınız. Duygu kategorilerinin halkanın üst kısmında, on yılların ise alt kısmında göründüğüne dikkat edin.Bu, NRC kategorisi başına on yıla göre kelime sayılarını gösterir. Küçük bir grafikte çok şey oluyor; ancak kategoriler ve zaman arasındaki ilişkilere dair tonlarca bilgi sağlar. Bu diyagramlar son derece özelleştirilebilir ve istenildiği kadar basit veya bilgilendirici olabilir.
Gerçek Zamanlı Duygu
DataCamp’te aldığınız harika kurslar sayesinde, bu becerileri gerçek dünyaya uygulamak için muhtemelen sabırsızlanıyorsunuz. Öyleyse şimdi, Prince’in sözlerinizi gerçek bir şeye ve bir zaman dönemine eşleyerek bunu yapın. Ancak bu kadar karmaşık bir konuda basitleştirilmiş bir analiz yaparken şüpheci ve temkinli olun.
Rolling Stone Magazine, Biography.com vb. popüler kaynaklardan derlenen Prince’in hayat olaylarının bir listesini oluşturdum. Veri kümemizde yayın tarihi olan şarkılarla eşleşen oldukça kamusal yılları seçtim. Bu olayları şimdi
princeEvents.csv’den içeri okuyun. Ardındanprince_bingvespread()’i kullanarak yıl başına bir polarlık puanı oluşturun.eventsveri çerçevesiyle birleştirin ve çubuk grafiğinizde renkleri doldurmak için bir duygu alanı oluşturun. Her zamanki gibi, büyük metin etiketleri gösterirkencoord_flip()kullanın.İpucu:
princeEvents.csvdosyasını burada bulabilirsiniz.Olayları duyguyla karşılaştırmayı büyüleyici buluyorum. Öznel olsa da, oldukça ilişkili olduklarını gördüm. Evet, olay veri kümesini kendim oluşturdum. Sözlerle eşleşecek şekilde kolayca önyargı katabilirdim. Ancak her yıl için en sık raporlanan olguyu belirlemek üzere birden fazla kaynak kullandım. Bu sonuçlar, Prince’in ne hakkında şarkı söylediğini görmek için kelime düzeyi analizine daha da derinlemesine bakmanız için motivasyon sağlamalı.
The Black Album: 1994 - 1996
1994’te Prince, Afrikalı-Amerikalı dinleyicisini geri kazanma girişimi olarak The Black Album’ü yayımladı. 1994 ve takip eden iki yıl analizde öne çıktığına göre, bu dönem için NRC sözlüğüyle eşleşen en sık kelimelere
ggrepelpaketindengeom_label_repel()vegeom_point()ile bakabilirsiniz. Bu zor bir grafik; aşağıdaki kodun ayarlarıyla oynamanızı öneririm.Prince, 1994’te Rolling Stone dergisine şöyle demişti,
Bu nedenle, yüzüne belirgin şekilde yazdığı "slave" kelimesiyle sahneye çıkarak mevcut müzik şirketine yönelik antikurumsal hissini alenen ilan etti. Adını da bir sembole dönüştürdü. Yukarıdaki kelimeler bu olaylarla ne kadar örtüşüyor? Grafikte "slave", "emancipation", "black" ve "change" kelimelerine dikkat edin?
(Unutmayın, bu sadece Prince ile ilgili değil. Bunu herhangi bir metne uygulayabilirsiniz! Örneğin, Başkan Trump’ın görevindeki ilk yılında söylediği en yüksek trust duygu kelimeleri nelerdi?)
Bu Kez Kişisel: 1998
Yukarıdaki Olaylara Göre Duygu grafiği, 1996 ile 1998 arasında Prince’in evlendiğini, iki çocuğunu kaybettiğini ve sahnede 9/11’i öngördüğünün söylendiğini gösteriyordu. (Kendiniz dinlemek için Hollanda’daki 1998 konserine dair YouTube’da arama yapın!) Önceki grafikteki aynı adımları kullanarak, 1998’de her bir NRC kategorisindeki ilk 10 kelimeye bakın.
Kişisel kayıplar ve yaklaşan terör tehdidi göz önüne alındığında, "suicide", "waste", "mad", "hurt" gibi kelimeler ve bu grafikte yer almayan daha birçoğu, yaşanan olayların güçlü bir göstergesidir. Bu kelimeler güçlüdür ve o dönem duygu durumuna gerçek bir içgörü sağlar.
Radarda: Radar Grafikler
Kategoriler arasında duyguyu karşılaştırmanın bir başka harika yolu da, örümcek grafiği olarak da bilinen radar grafiğini kullanmaktır. Bu tür grafikleri
radarchartpaketiyle oluşturabilirsiniz. Bunlar, hangi değişkenlerin benzer değerlere sahip olduğunu veya her bir değişken için aykırı değerler olup olmadığını görmede kullanışlıdır.Bu analizi üç farklı düzeye böleceksiniz: yıl, liste ve on yıl. (Yer kazanmak için yalnızca belirli yıllara ait kodları ekleyeceğim.)
prince_nrc_subveri kümesini kullanın ki diğerleri daha görünür olsun. Bu kez önce yıl başına duyguya göre kelime toplam sayısını ve tüm yılın toplam duygusunu hesaplayacak ve bir yüzde elde edeceksiniz ($yıl başına duygu kelime sayısı / yıl toplamı * 100$).select()ile gereksiz alanları kaldırın.spread()ile açmanız gerekir. Ardından etkileşimli bir HTML bileşeni üretmek içinchartJSRadar()kullanın. Fareyle üzerine gelindiğinde veri seti etiketlerini göstermek için bir argüman geçirebilirsiniz. (Bilgi: Bazenradarchart, "joy" kelimesinin J ve Y harflerini kırpar ve "iov" gibi görünebilir.)Bu grafikleri karşılaştırmak için yukarı ve aşağı kaydırmanız gerekecek; zira tam boy bırakmak istedim.
yeargibi daha küçük bir veri kümesiyle, bu tür bir görselleştirme kullanarak her bir duygudaki değişimi daha net görebildiğiniz dikkat çekici. Ayrıca, önceki alıştırmaların aksine yüzde kullanıldığında, tüm grafiklerde en yüksek puanın "joy" olduğuna (özellikle Prince’in kariyerinin başındaki 1978’de) dikkat edebilirsiniz.Sign O' the Times
Spotify, 140 milyon aktif kullanıcısı için şarkı önerileri oluşturmak üzere makine öğrenimini kullanıyor. Henüz söz içeriğini kullanmıyor. Kullansaydı hayal edin... Şimdi belirli şarkıların ruh hâline daha da derin bakın.
1987’de Prince, "Sign O' the Times" adlı bir şarkı yazdı. Kenneth Partridge’in yazdığı bir Billboard makalesinde şöyle deniyordu:
Peki bir makine bu şarkının ruh hâlini nasıl yorumlar? Çok mu duygusal yoksa sadece bilgilendirici mi? Prince’i bir kişi olarak mı yoksa genel olarak toplumu mu temsil ediyor? NRC kategorilerini
ggplot2ile grafiğe dökün.Yine oldukça öznel olmakla birlikte, sonuçlarınız Partridge’in belirttiği gibi Prince’in "serinkanlı ve mesafeli" davrandığını doğruluyor gibi görünüyor. Bu, anticipation kelimelerinin sadness, fear ve anger gibi duygusal kategorilerden daha baskın olduğunun gözlenmesiyle yorumlanabilir. Bu üç kategorinin duygular, anticipationın ise bir duygu (sentiment) olduğunu söyleyen bir makale var. Billboard yazarı ayrıca şarkının basit bir "durum güncellemesi, neredeyse duygudan yoksun" olduğunu belirtti. Görünüşe göre makine de aynı fikirde. Siz de böyle mi yorumluyorsunuz? Bunun bir R eğitimi olduğunu biliyorum; ancak duygu analizi salt teknik değildir. Yapay zekânın psikolojiyle buluştuğu yer olduğu söylenir.
ggplot2kullanarak biraz farklı bir grafikle her kategoriye ait kelimelere bakın.Bu kelimeleri Billboard makalesinde bahsedilen konularla eşleştirebiliyor musunuz? Bağlantı oldukça açık: Challenger felaketi -> "rocket", AIDS -> "disease", Uyuşturucular -> "crack", Doğal Afetler -> "hurricane", Çeteler -> "gang" vb.
Adeta Partridge, makaleyi yazmadan önce biraz R kodu yazıp bu grafiği oluşturmuş gibi!
Daha Fazla Şarkı
Belirgin başlıklara sahip birkaç şarkı için duygu kategorilerine bakın ve örtüşüyor gibi görünüp görünmediklerine bakın.
NRC duyguları, the future hakkında bir şarkı için yüksek anticipation ve fear, ve controversy hakkında bir şarkı için bunlara ek yüksek trust gösterir. Ağırlıklı olarak sad olan şarkılar da başlıklarıyla örtüşüyor gibi görünüyor.
On Yıla Göre Bigramlar
Şimdiye dek yalnızca unigramlara, yani tek kelimelere baktınız. Ancak "love" sık kullanılan bir kelimeyse, öncesinde ne gelir? Ya sonrasında? Bağlamdan kopuk tek kelimelere bakmak yanıltıcı olabilir. Şimdi bigramlara, yani kelime çiftlerine bakma zamanı.
Uygun bir şekilde,
tidytextpaketi tek kelimelerin yanı sıra kelime çiftlerini de açma olanağı sunar. Bu durumdaunnest_tokens()çağrısındatokenargümanına ngrams geçeceksiniz. Yalnızca bigramlara (ardışık iki kelime) baktığınızdann = 2geçin. Sonuçlarıprince_bigrams’da saklayın.tidyrpaketi,separate()fonksiyonuyla bigramları tekil kelimelere ayırma olanağı sağlar. Durak kelimeleri ve istenmeyen kelimeleri kaldırmak için bigramları bölmek, istemediklerinizi filtrelemek ve ardındanunite()ile kelime çiftlerini yeniden birleştirmek istersiniz. Bu, on yıla göre en yaygın bigramları görselleştirmeyi kolaylaştırır. (Birinci Bölüm’deslice()verow_number()açıklamasına bakın)Bigramları kullanarak, ortak ifadelerin seksten, danstan ve romantizmden dine ve (gökkuşağı) çocuklara doğru kaydığını neredeyse görebiliyorsunuz. Bilginize: "rainbow baby" terimi bazen, düşükle bebek kaybettikten sonra başka bir çocuk bekleyen ebeveynler tarafından kullanılır. İlginçtir ki, Prince’in Rainbow Children albümüne ilişkin gerçek bir incelemede buna değinildiğini bulamadım.
Bigramlarla Duygu
Peki bigramlar duyguyu nasıl etkiler? Bu kez AFINN sözlüğünü kullanarak kelime çiftleri üzerinde duygu analizi yapın ve duygu ile ilişkili kelimelerin ne sıklıkla "not" gibi olumsuzlayıcı kelimelerle öncelediğine bakın.
Grafiğin ilk satırında care, tek kelimeli analizde "not" göz ardı edildiği için yalancı pozitif duygu alır. Yalancı pozitif bigramlar yalancı negatif bigramları dengeler mi?
Yine yanıtlayamayacağım bir soru; fakat daha fazla keşif için iyi bir konu. İpucu: daha da fazla ardışık kelimeye bakmak için
unnest_tokens()’a "trigrams" ve "n = 3" parametrelerini de geçebilirsiniz!Başka olumsuzlayıcı kelimeler de vardır. Bu kez
ggraphveigraphpaketlerini kullanarak bir ağ grafiği oluşturacaksınız. Kelimeleri, merkezlerinde olumsuzlayıcı kelimeler olacak şekilde bağlı düğümlere yerleştireceksiniz. İlk nesneyigraph_from_data_frame()ile tidy veri setinden oluşturun ve sonraggraph()ile çizin. Ana düğümlerigeom_edge_density()çağrısıyla vurgulayabilirsiniz. Benzer bir örneğin daha fazla ayrıntısını Julia Silge ve David Robinson’ın Tidy Text Mining kitabında bulabilirsiniz.Burada, olumsuzlayıcı kelimelerle ilişkili kelime çiftlerini görüyorsunuz. Analiziniz unigramlara dayanıyorsa ve "alone" olumsuz çıkarsa, yukarıda gördüğünüz "not alone" bigramı ters etki yaratacaktır. Bazı kelimeler birden fazla düğüme geçiş yapar; bunu "never hurt" ve "not hurt" örneklerinde olduğu gibi bu tür görsellerde kolayca görebilirsiniz.
Çiftli Karşılaştırmalar
Artık n-gramlara baktığınıza göre, kelimeler arasındaki korelasyona bakın. Hangi kelimeler en yüksek korelasyona sahip?
widyrpaketindenpairwise_count()işlevini kullanarak birlikte görülme sayılarını belirleyin. Yani her kelime çiftinin bir şarkıda birlikte göründüğü sayıları sayarsınız.widyrpaketi tidy bir veri kümesini alır, görselleştirme ve daha fazla analiz için geçici olarak genişletip tekrar tidy yapıya döndürür.Basit olması için, Prince’in sözlerinde dört ilginç kelime seçtim.
Bunu çiftli korelasyon ile karşılaştırın. Bu, kelimelerin ayrı ayrı ne sıklıkta göründüğüne göre birlikte ne sıklıkta göründüklerini ifade eder.
pairwise_cor()kullanarak, kelimelerin aynı şarkıda görünme sıklığına göre aralarındaki korelasyonu belirleyin.Sadece bu dört kelimeye dayanarak bile sözlere dair içgörülerin büyüleyici olduğunu düşünüyorum! Bu sonuçlara bakarak bazı temaların belirmeye başladığını görebilirsiniz. Bu da bir sonraki eğitim olan Konu Modellemesi’ne harika bir geçiş sağlar!
Sonuç
Bu eğitimde tidy bir veri kümesi oluşturup, leksik çeşitlilik ve yayın yılına göre şarkı sayısı gibi temel bilgileri analiz ettiniz ve yayın on yılı ile bir şarkının listeye girip girmediği arasındaki ilişkiyi incelediniz. Ardından bazı duygu sözlüklerini ve sözlerle ne kadar iyi eşleştiklerini keşfettiniz. Sonra tüm şarkılarda duygu analizi, zaman içinde duygu, şarkı düzeyi duygu ve bigramların etkisini çalıştınız. Bunu her biri farklı bir bakış açısı sunan çok çeşitli ilginç grafiklerle yaptınız.
O hâlde sözlerdeki ruh hâlini belirleyen bir program yazmak mümkün mü? Evet, mümkün! Sonuçlarınız ne kadar güvenilir? Bu, veri hazırlığı miktarı, sözlük seçimi, analiz yöntemi, kaynak verinin kalitesi vb. geniş bir yelpazeye bağlıdır. Gerçek yaşam olaylarını —kişisel ve toplumsal— karşılaştırmak, herhangi bir sözün ruh hâlini aydınlatabilir. Prince’in polar duygusu zamanla hafifçe azalmış görünse de genel olarak joy öne çıkıyor. Listeye giren şarkılar, girmeyenlere göre daha olumlu görünüyor. 9/11’i ve kendi ölümünü öngördüğüne dair iddialar, sözleriyle ürkütücü biçimde örtüşüyor.
Ancak sözler karmaşıktır ve fazla varsayım sorun çıkarabilir. Sözler hakkında öğrendiklerinizi bir sonraki eğitim olan İkinci Bölüm-B’ye, Konu Modellemesi’ne taşırsanız, temaları ve motifleri ortaya çıkarmada iyi bir yol kat etmiş olacaksınız. Noktalama veya cümle yapısı olmadan görünen sözlerde ne kadar NLP yapılabilir? Prince gerçekten ne hakkında şarkı söylüyordu? Artık ruh hâlini anladığınıza göre, olası konuları araştırmaya daha hazırsınız. Ve son olarak, bir şarkının on yılını veya liste düzeyini tahmin etmek için makine öğrenimi tekniklerini uygulayabilir misiniz? Öğrenmek için sonraki eğitimlerde bana katılın!
Umarım yolculuğunuzdan şimdiye kadar keyif almışsınızdır. İkinci Bölüm-B’de 1999’daki gibi parti yapacağız!