Metindeki konuları modellemek ve kendi müzik öneri sisteminizi kurmak için R, NLP ve Makine Öğrenimi ile en ileri teknikleri kullanın!
Bu yazı, efsanevi sanatçı Prince’in şarkı sözleri ve diğer sanatçı-yazarlar üzerine bir vaka çalışmasıyla çeşitli analitik görevleri R ile gerçekleştirmeye devam edeceğiniz üç bölümlük bir eğitim serisinin İkinci Bölüm-B’sidir. Üç eğitim şunları kapsar:
Kendinizi NASA’da çalışan bir Veri Bilimci olarak hayal edin. Güneş ile ayın etkileşimlerini incelemek üzere ay yörüngesine gönderilecek iki uzay aracını izlemeniz isteniyor. Her uzay aracında olduğu gibi, test ya da fırlatma sonrası yakalanan sorunlar olabilir. Bu anomaliler, doğal dilde yaklaşık 20.000 problem raporunda kayıt altına alınmıştır. Göreviniz, raporlar külliyatındaki en yaygın konuları ve yükselen temaları belirlemek ve mühendisler ile program direktörlerine reçeteleyici analiz sonuçları sunmaktır; böylece uzay keşfinin geleceğini etkilersiniz.
Bu, gerçek hayattan bir senaryonun örneğidir ve makine öğrenimi ile konu modellemesi, Doğal Dil İşleme (NLP) ve R programlama gibi ileri teknikleri kullanmayı öğrendikten sonra parmaklarınızın ucunda nasıl bir güç olacağına dair fikir vermelidir. Neyse ki, aynı derecede yenilikçi bir şey yapmak için NASA’da çalışmanız gerekmiyor. Bu derste, kabul etmeyi seçerseniz misyonunuz, konu modellemesini öğrenmek ve müzik sözleri ile kurgu dışı kitaplara dayalı basit bir öneri (nam-ı diğer önerici) sistemi kurmaktır.
Sırf Eğlence İçin!
Bu konu modellemesiyle ilgili değil, ama sırf eğlence olsun diye, önceki bir derste tanıtılan harika bir paket olan circlize’ı kullanarak fotoreseptörlerinizi harekete geçirin ve bu derste kullanacağınız tüm kaynakların bu dairesel diyagramının keyfini çıkarın.
library(jpeg)
library(circlize)#you'll use this package later#read in the list of jpg files of album/book covers
files = list.files("jpg\\", full.names =TRUE)#clean up the file names so we can use them in the diagram
removeSpecialChars <-function(x) gsub("[^a-zA-Z]"," ", x)
names <- lapply(files, removeSpecialChars)
names <- gsub("jpg","", names )#read up on the circlize package for details#but there will be comments in later sections
circos.clear()
circos.par("points.overflow.warning"=FALSE)
circos.initialize(names, xlim = c(0,2))
circos.track(ylim = c(0,1), panel.fun =function(x, y){
image = as.raster(readJPEG(files[CELL_META$sector.numeric.index]))
circos.text(CELL_META$xcenter, CELL_META$cell.ylim[1]- uy(1.5,"mm"),
CELL_META$sector.index,
CELL_META$sector.index, facing ="clockwise", niceFacing =TRUE,
adj = c(1,0.5), cex =0.9)
circos.raster(image, CELL_META$xcenter, CELL_META$ycenter, width ="1.5cm",
facing ="downward")}, bg.border =1, track.height =.4)Altyapı:
Yapı
Önceki derslerde, Prince’in şarkı sözlerinin içeriğini sözcük sıklığı, tf-idf istatistiği ve duygu analizi kullanarak incelediniz. Konu modellemesi kavramını kullanarak şarkı sözlerine ve diğer metinlere daha derinlemesine bakış sunabilirsiniz.
Bu derste, Gizli Dirichlet Ayrımı (LDA) ve K-Ortalamalar kümeleme makine öğrenimi algoritmalarını kullanarak dört model oluşturacaksınız. Algoritmaları dersin ilerleyen kısımlarında açıklayacağım.
Model Bir, Prince’in şarkı sözlerinden alınan metni iki kurgu dışı kitapla birleştirir. Bu modelin amacı, gözetimsiz bir algoritma olan LDA’yı kullanarak temaları ima eden sözcük koleksiyonları oluşturmanın basit bir örneğini sunmaktır. Bu temalar etiketlenmemiştir ve insan yorumuna ihtiyaç duyar. Önceden belirlenmiş sayıda temayı tanımladıktan sonra, modelinizin sonuçlarını alıp her şarkıyı veya kitap sayfasını her kategoriye sınıflandıracaksınız. Bir şarkı, ürettiğiniz tüm konuları içerebilir ancak birine diğerinden daha temiz oturabilir. Bu, belge sınıflandırma olarak adlandırılır; fakat belgenin yazarını bildiğiniz için, özünde yazarları tematik kümelere sınıflandırmış olursunuz.
Model İki, Model Bir veri setini kullanır ve farklı bir algoritma, k-means ile tema üretimine hızlı bir bakış sunar ve bunun konu modellemesi için en iyi seçenek olmayabileceğini gösterir.
Yine LDA’yı kullanarak, Model Üç farklı türlerden birden çok sanatçı ve daha fazla kitap yazarı içeren daha büyük bir veri kümesinden yararlanır. Bir yazar/sanatçıya ait belgelerin çoğunu en olası konuya sınıflandırdığınızda, benzer tematik bileşimlere sahip yazarları bir araya getirme yeteneği elde edersiniz. Sağlam bir model ile benzer türlerin aynı konu kümesinde belirdiğini görmelisiniz. Örneğin rap sanatçıları tek bir konuda, benzer konudaki iki kitap ise birlikte başka bir konuda görünmelidir. Böylece potansiyel olarak benzer yazarları önerebilirsiniz! Elbette yazarlar ve türleri etiketlidir, ancak konular değildir ve bu nedenle gözetimsizdir.
Model Dört, yalnızca Prince’in şarkı sözlerinde LDA kullanır. Bu kez, her bir sözcüğün bir sözcük türü (isim, fiil vb.) ile etiketlendiği ve sözcüğün kök biçiminin (lemma) yer aldığı, bu dersin dışında üretilmiş açıklamalı bir veri kümesini kullanacaksınız. Ayrıca bir konunun zaman içinde nasıl değiştiğini de inceleyeceksiniz.
Introduction
NLP ve Makine Öğrenimi, Yapay Zekâ’nın alt alanlarıdır. Şarkı yazımı için YZ kullanmaya yönelik son girişimler oldu. Bu dersin hedefi bu değil; fakat YZ’nin sanat olarak nasıl kullanılabileceğine bir örnektir. Ne de olsa ilk üç harfi A-R-T! Bir an için YZ’yi şarkı yazımıyla karşılaştırın: Bir kalıbı kolayca izleyip bir yapı (kıta, nakarat, kıta vb.) oluşturabilirsiniz; ancak bir şarkıyı harika yapan, yazarın sürece yaratıcılık katmasıdır. Bu derste, modeller kurmak için teknik becerilerinizi kullanmanız gerekecek; fakat sonuçlarınızı yorumlama ve açıklama yeteneği kazanmak için sanatsal yaratıcılığınızı da devreye sokmanız gerekecek.
Şunu düşünün: Eğer konu modellemesi bir sanatsa, sözler koddur, şarkı yazımı algoritim, şarkı ise modeldir! Sizin benzetmeniz ne?
Tipik öneri sistemleri tamamen metne dayanmaz. Örneğin Netflix, önceki seçimler ve ilişkili meta veriler temelinde filmler önerebilir. Pandora ise farklı bir yaklaşım benimser ve melodiden ritme, kompozisyondan söz özetlerine kadar 400 müzikal öznitelikten oluşan bir Müzik Genomuna güvenir; ancak bu genomun geliştirilmesi 2000 yılında başlamış ve tamamlanması beş yıl ve müzik teorisinde 30 uzmanın katkısını gerektirmiştir. Konu özetlerine dayalı film önerilerini ele alan çok sayıda araştırma makalesi vardır. Doğrudan söz içeriğine dayanan müzik öneri sistemlerinin örneklerini bulmak ise daha zordur. Denemek ister misiniz?
Önkoşullar
Bu eğitim serisinin İkinci Bölüm-B’si, tidy veriye dair temel bir anlayış gerektirir — özellikle dplyr ve ggplot2 gibi paketler. Önceki derslerde ele alındığı üzere tidytext kullanarak metin madenciliği pratiği de önerilir. Ayrıca R fonksiyonlarına aşina olmanız gerekir; zira her model için kodunuzu tekrar kullanmak üzere birkaçından yararlanacaksınız. İçgörü yakalamaya odaklanabilmeniz için, kendi veri kümenizde kullanılmak üzere tasarlanmış kodu dahil ettim; ancak ayrıntılı açıklama, tarafınızdan ek araştırma gerektirebilir.
Sorularınızı Hazırlayın
Konu modellemesiyle siz ne yapabilirsiniz? Belki işletmeniz için kritik bilgiler içeren belgeler vardır ve bunları madencilikle çıkarabilirsiniz. Belki Twitter’dan veri kazıyıp insanların şirketinizin ürünleri hakkında ne söylediğini bulabilirsiniz. Belki belirli belgeleri analiz için doğru departmanlara gönderen kendi sınıflandırma sisteminizi kurabilirsiniz. Keşfedebileceğiniz bir olasılıklar dünyası var! Hadi başlayın!
Konu Modellemesi Neden Faydalıdır?
Konu modellemesinin birkaç kullanım alanı şunlardır:
Belge özetleri: Bilimsel makaleleri anlamak ve özetlemek için konu modellerini kullanarak araştırma ve geliştirmeyi hızlandırın. Aynısı tarihî belgeler, gazeteler, bloglar ve hatta kurgu için de geçerlidir.
Metin sınıflandırma: Konu modellemesi, her bir sözcüğü bağımsız bir özellik olarak kullanmak yerine benzer sözcükleri konular içinde gruplandırarak sınıflandırmayı iyileştirebilir.
Öneri Sistemleri: Benzerliğe dayalı olasılıkları kullanarak öneri sistemleri kurabilirsiniz. Okuyuculara, daha önce okuduklarına benzer konu yapısına sahip makaleleri önerebilirsiniz.
Başka fikirleriniz var mı?
Hazırlık Çalışması
Kütüphaneler ve Fonksiyonlar
Bu derste, Birinci Bölüm veya İkinci Bölüm-A’da yer almayan tek yeni paketler topicmodels, tm ve plotly’dir. Modellerin farklı belgeleri ayırt etmeyi öğrenmesini sağlayan topicmodels paketinden LDA() fonksiyonunu kullanacaksınız. tm paketi metin madenciliği içindir ve yalnızca belge-terim matrisinin içini görmek için bir kez inspect() fonksiyonunu kullanacaksınız; bunu daha sonra açıklayacağım. plotly’yi ise bir kez ggplot2 grafiğinin etkileşimli bir sürümünü oluşturmak için kullanacaksınız.
library(tidytext)#text mining, unnesting
library(topicmodels)#the LDA algorithm
library(tidyr)#gather()
library(dplyr)#awesome tools
library(ggplot2)#visualization
library(kableExtra)#create attractive tables
library(knitr)#simple table generator
library(ggrepel)#text and label geoms for ggplot2
library(gridExtra)
library(formattable)#color tile and color bar in `kables`
library(tm)#text mining
library(circlize)#already loaded, but just being comprehensive
library(plotly)#interactive ggplot graphsAltyapı:
Aşağıdaki fonksiyonlar, word_chart() istisna olmak üzere önceki derslerde tanımlanmıştı; ancak word_chart()’ın içeriği ve açıklaması da İkinci Bölüm-B’de bulunabilir. Esasen bilmeniz gereken, sözcüklere dayalı bir görsel oluşturmak için ggplot()’u alışılmadık bir şekilde kullandığıdır.
#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 on or off the minor grid lines
legend.title = lt,#turn on or off the legend title
legend.position = lp)#turn on or off the legend}#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)}
word_chart <-function(data, input, title){
data %>%#set y = 1 to just plot one variable and use word as the label
ggplot(aes(as.factor(row),1, label = input, fill = factor(topic)))+#you want the words, not the points
geom_point(color ="transparent")+#make sure the labels don't overlap
geom_label_repel(nudge_x =.2,
direction ="y",
box.padding =0.1,
segment.color ="transparent",
size =3)+
facet_grid(~topic)+
theme_lyrics()+
theme(axis.text.y = element_blank(), axis.text.x = element_blank(),#axis.title.x = element_text(size = 9),
panel.grid = element_blank(), panel.background = element_blank(),
panel.border = element_rect("lightgray", fill =NA),
strip.text.x = element_text(size =9))+
labs(x =NULL, y =NULL, title = title)+#xlab(NULL) + ylab(NULL) +#ggtitle(title) +
coord_flip()}Altyapı:
Müzik ve Kitaplar
Konu modellemesi ve sınıflandırmanın gücünü gerçekten görmek için, önceki derslerde olduğu gibi yalnızca Prince’in şarkı sözlerini kullanmakla kalmayacak, aynı zamanda Billboard listelerinde tanınan farklı türlerden birkaç sanatçıyla da çalışacaksınız. Buna ek olarak, spor beslenmesi, buzdağları ve hatta makine öğrenimi gibi farklı konularda birkaç kitap ekledim! Çeşitli bir veri setine sahip olarak, belgeleri ilişkili konulara sınıflandırabilir ve benzer sanatçı/yazarları ayırt edebilirsiniz.
İpucu: Şarkıları ve kitap sayfalarını belge, müzisyen/yazarları ise yazar olarak adlandıracağım. Kodda source (kaynak) sözcüğüne atıf göreceksiniz. Bu, verinin hangi yazara ait olduğunu belirtir. Tür sözcüğünü hem müzik türü hem de kitap kategorisi için kullanacağım. Kitap yazar adları yerine açıklık için kitap başlıklarını kullandım. Derste ilerledikçe bu referanslar anlam kazanacak.
Veriyi Edinin
Modellemeye odaklanabilmek için, bu dersin dışında veri hazırlama yaptım ve aşağıdaki üç dosyada ihtiyacınız olan tüm verileri şu ön işlemler uygulanmış şekilde sağladım:
sekiz sanatçının şarkı sözlerini web’den kazıdım
dört kitabın içeriğini toplamak için pdftools paketindeki pdf_text() fonksiyonunu kullandım (her sayfa ayrı bir belgeyi temsil eder)
Birinci Bölüm’de açıklanan tidytext paketini kullanarak tüm veriyi temizledim, durak sözcükleri kaldırdım ve tidy sürümlerini oluşturdum
veriyi birleştirip dengeledim; böylece her yazarın (source) aynı sayıda sözcüğü oldu
Bu derste çalışmak üzere üç ayrı veri setiniz olacak:
three_sources_tidy_balanced: Prince sözleri ve iki kitap içerir
all_sources_tidy_balanced: sekiz sanatçının sözleri ve dört kitap içerir
prince_tidy: yalnızca Prince sözleri içerir
Ayrıca Prince’in şarkı sözlerinin açıklamalı bir veri setini de ekledim. Model Dörte geldiğinizde açıklamalıdan ne kastettiğimi açıklayacağım.
#Get Tidy Prince Dataset and Balanced Tidy Dataset of All Sources and 3 Sources
three_sources_tidy_balanced <- read.csv("three_sources_tidy_balanced.csv",
stringsAsFactors =FALSE)
all_sources_tidy_balanced <- read.csv("all_sources_tidy_balanced.csv",
stringsAsFactors =FALSE)
prince_tidy <- read.csv("prince_tidy.csv",
stringsAsFactors =FALSE)Altyapı:
LDA ile Modeller Kurma
Konu modellemesinin ana hedefi, yapılandırılmamış metinsel veride, sözcüklerin birlikte görülme kalıpları olarak ölçülen, tematik olarak ilişkili önemli terimleri (konuları) bulmaktır. Konu modellerinin temel bileşenleri belgeler, terimler ve konulardır. Gizli Dirichlet Ayrımı (LDA), her belgenin bir sözcük koleksiyonu olduğu bir belge kümesinin altında yatan farklı konuları keşfeden gözetimsiz bir öğrenme yöntemidir. LDA şu varsayımları yapar:
Her belge bir veya daha fazla konu(ların) birleşimidir
Her konu, sözcüklerin bir karışımıdır
LDA, ilişkili sözcük gruplarını bulmayı amaçlar. Yinelemeli, üretici bir algoritmadır. İki ana adım şunlardır:
Başlatmada, her sözcük rastgele bir konuya atanır
Algoritma her sözcüğü yinelenerek dolaşır ve şu hususları dikkate alarak sözcüğü bir konuya yeniden atar:
sözcüğün bir konuya ait olma olasılığı
belgenin bir konu tarafından üretilme olasılığı
LDA konu modelinin arkasındaki fikir, bir konuya ait sözcüklerin belgelerde birlikte görünmesidir. Her belgeyi konuların bir karışımı, her konuyu da sözcüklerin bir karışımı olarak modellemeye çalışır. (Buna karışık-üyelik modeli dendiğini görebilirsiniz.) Daha sonra, bir belgenin belirli bir konuya ait olma olasılığını kullanarak onu buna göre sınıflandırabilirsiniz. Sizin durumunuzda, orijinal veriden belgenin yazarını bildiğiniz için, benzer konu yapılarına dayalı olarak bir sanatçı/yazar önerebilirsiniz. Şimdi bir örneğe bakalım.
Model Bir: Üç Yazar için LDA
Veriyi İnceleyin
Bu modelde, üç farklı yazarın (yani kaynakların) birleşiminden oluşan veri setini kullanacak ve gizli konular arayacaksınız. Konu modellemesinin gücünü anlamanıza yardımcı olmak için, seçilen bu üç kaynak birbirinden oldukça farklıdır ve sezgisel olarak üç farklı konuyu kapsadıklarını bilirsiniz. Sonuç olarak, modelinize üç konu oluşturmasını söyleyecek ve ne kadar başarılı olduğuna bakacaksınız. Önce, formattable paketinden color_bar() ve color_tile() ile birlikte my_kable_styling() fonksiyonunuzu kullanarak veri setinizi incelemek istersiniz.
#group the dataset by writer (source) and count the words
three_sources_tidy_balanced %>%
group_by(source)%>%
mutate(word_count = n())%>%
select(source, genre, word_count)%>%#only need these fields
distinct()%>%
ungroup()%>%#assign color bar for word_count that varies according to size#create static color for source and genre
mutate(word_count = color_bar("lightpink")(word_count),
source = color_tile("lightblue","lightblue")(source),
genre = color_tile("lightgreen","lightgreen")(genre))%>%
my_kable_styling("Üç Kaynak İstatistikleri")Altyapı:
Burada Prince’in şarkı sözlerini, "Machine Learning For Dummies" adlı bir kitabı ve "Why Icebergs Float" adlı başka bir kitabı kullanacaksınız; her birinde 30.000’den fazla (tekrarlı) sözcük bulunmaktadır.
Belge-Terim Matrisini Oluşturun
Şu anda Prince’in sözleri ve iki kitaptan oluşan dengelenmiş, tidy bir veri setine sahip olduğunuz için, önce her bir belgenin bir satır, her bir sütunun bir terim olduğu bir belge-terim matrisi (DTM) oluşturmak isteyeceksiniz. Bu biçim, LDA algoritması için gereklidir. Bir belge, şarkı sözlerinde bir şarkıyı, kitaplarda ise bir sayfa numarasını ifade eder. Önce tidy verinizi alıp bir belgedeki sözcükleri sayacak, sonra bunu tidytext’in cast_dtm() fonksiyonuna bağlayacaksınız; burada document belge adını, word ise terimi içeren alanın adıdır. Başka parametreler de geçebilirsiniz, fakat bu ikisi zorunludur.
three_sources_dtm_balanced <- three_sources_tidy_balanced %>%#get word count per document to pass to cast_dtm
count(document, word, sort =TRUE)%>%
ungroup()%>%#create a DTM with docs as rows and words as columns
cast_dtm(document, word, n)#examine the structure of the DTM
three_sources_dtm_balanced
<<DocumentTermMatrix (documents:1449, terms:13608)>>
Non-/sparse entries:71386/19646606
Sparsity :100%
Maximal term length:27
Weighting : term frequency (tf)Altyapı:
Bu çıktı, kaç belge ve teriminiz olduğunu ve matrisin çok seyrek olduğunu gösterir. Seyrek, DTM’nin çoğunlukla boş alanlar içerdiği anlamına gelir. Tüm belgelerden gelebilecek geniş kelime dağarcığı nedeniyle, her bir belgede yalnızca az sayıda terim kullanılacaktır.
tm paketinden inspect() fonksiyonunu kullanarak DTM’nin birkaç satır ve sütun içeriğine bakarsanız, her satırın bir belgeyi, her sütunun bir terimi temsil ettiğini görürsünüz. (Gerçek yapıyı görmek için str() kullanmaktan çekinmeyin.)
#look at 4 documents and 8 words of the DTM
inspect(three_sources_dtm_balanced[1:4,1:8])Altyapı:
<<DocumentTermMatrix (documents:4, terms:8)>>
Non-/sparse entries:9/23
Sparsity :72%
Maximal term length:9
Weighting : term frequency (tf)
Sample :
Terms
Docs beautiful dance party push rock roll shake style
party up 004001200
push it up 011560000
shake 001000520
style 000000032Altyapı:
Değişkenleri Ayarlayın
Modelinizi oluşturmak için girdide nelerin gerektiğini bildiğinize göre, her model oluştururken kolayca sıfırlayabileceğiniz iki değişken ayarlayın. Bunlara source_dtm ve source_tidy adını vereceksiniz.
#assign the source dataset to generic var names#so we can use a generic function per model
source_dtm <- three_sources_dtm_balanced
source_tidy <- three_sources_tidy_balancedAltyapı:
Modeli Uydurun
Nihayet, modeli uydurma kısmının eğlenceli bölümüne geldiniz. Kod basittir; ancak iyi bir Veri Bilimci olmak için kaputun altında neler olduğunu anlamak istersiniz. Bu yüzeysel bir açıklama olsa da, LDA hakkında çevrimiçi olarak bir servet değerinde bilgi mevcut. Sizin amaçlarınız için dört parametreyi bilmeniz yeterli: girdi, konu sayısı, örnekleme yöntemi ve tohum (seed).
Veri setinizin üç farklı yazar içerdiğini bildiğiniz için k’yi 3 olarak ayarlayacak ve tekrarlanabilir sonuçlar elde etmek için seed’i sabit bir değere koyacaksınız. Başka control parametreleri de vardır; kodda list biçimi bu yüzdendir; ancak şimdilik yalnızca seed kullanacaksınız. method parametresi, kullanılacak örnekleme algoritmasını tanımlar. GIBBS örnekleme yöntemini kullanacaksınız. Varsayılan VEM’dir; fakat deneyimlerime göre GIBBS kadar iyi performans göstermemektedir.
GIBBS örneklemenin kısa teknik açıklaması, başlangıç noktasını sizin başlatabileceğiniz (burada 0 varsayılanını kullanacaksınız) bir rastgele yürüyüş gerçekleştirdiği ve her adımda eş olasılıkla bir artı ya da eksi hareket ettiğidir. Ayrıntılar ilginizi çekiyorsa buradan detaylı açıklamayı okuyun.
Not: LDA algoritmasının ayrıntılarını hızlıca geçtim. Kullanmak için istatistik kuramını anlamanız şart olmasa da, Ethen Liu’nun sağlam bir açıklama sunan şu belgesini okumanızı öneririm.
k <-3#number of topics
seed =1234#necessary for reproducibility#fit the model passing the parameters discussed above#you could have more control parameters but will just use seed here
lda <- LDA(source_dtm, k = k, method ="GIBBS", control = list(seed = seed))#examine the class of the LDA object
class(lda)Altyapı:
Burada üç konulu bir LDA_Gibbs nesnesi oluşturulduğunu görebilirsiniz. Çıktısı çok büyük olduğundan burada str(lda) çalıştırmadım; ancak neler içerdiğini görmek için siz çalıştırabilirsiniz.
Bir sonraki adım, bu nesneyi açıp sonuçlara bakmaktır. Anlaşılması kolay bir biçime dönüştürmek için tidy() fonksiyonunu kullanabilirsiniz. tidy() çağrısında LDA nesnesini ve matrix argümanı için betayı geçin. betayı geçirmek, modelden konu-başına-sözcük olasılıklarını sağlar. Aşağıdaki örnek, iceberg terimini kullanarak, o sözcüğün her bir konudaki olasılığını gösterir. iceberg sözcüğünün Konu 1’de üretilme olasılığı daha yüksektir.
#convert the LDA object into a tidy format#passing "beta" shows the word probabilities#filter on the word iceberg as an example#results show probability of iceberg for each topic
tidy(lda, matrix ="beta")%>% filter(term =="iceberg")Altyapı:
[# A tibble: 3 x 3 topic term beta 1 1 iceberg 0.000198 2 2 iceberg 0.00000292 3 3 iceberg 0.00000315]
En Üst Sözcüklerle Temaları Belirleyin
Modeli net şekilde anlamak için, her konudaki terimlerin neler olduğunu görmeniz gerekir. LDA modelini tidy hâline getirecek ve her konu için en üst terimleri çıkaracak bir fonksiyon oluşturun. Yani, her konu için en büyük beta değerlerine sahip terimler. Bu fonksiyonun içinde, üç konuyu ve en üst sözcükleri şıkça göstermek için önceden oluşturduğunuz word_chart()a başvuracaksınız. Bu örnekte num_words’u 10 olarak ayarlayın; fakat farklı bakışlar edinmek için bu sayı ile oynayabilirsiniz.
num_words <-10#number of words to visualize#create function that accepts the lda model and num word to display
top_terms_per_topic <-function(lda_model, num_words){#tidy LDA object to get word, topic, and probability (beta)
topics_tidy <- tidy(lda_model, matrix ="beta")
top_terms <- topics_tidy %>%
group_by(topic)%>%
arrange(topic, desc(beta))%>%#get the top num_words PER topic
slice(seq_len(num_words))%>%
arrange(topic, beta)%>%#row is required for the word_chart() function
mutate(row = row_number())%>%
ungroup()%>%#add the word Topic to the topic labels
mutate(topic = paste("Topic", topic, sep =" "))#create a title to pass to word_chart
title <- paste("LDA Top Terms for", k,"Topics")#call the word_chart function you built in prep work
word_chart(top_terms, top_terms$term, title)}#call the function you just built!
top_terms_per_topic(lda, num_words)Altyapı:
Gözetimsiz öğrenme her zaman insan yorumuna ihtiyaç duyar... ama bu konular açıkça Buzdağları, Makine Öğrenimi ve Prince olmak üzere üç kaynağı yansıtıyor! Çok basit bir örnek olmasına rağmen, ihtimalleri düşündüğünüzde oldukça etkileyici!
Belgeleri Sınıflandırın
LDA, her konuyu sözcüklerin bir karışımı olarak tahmin etmenin yanı sıra, her belgeyi de konuların bir karışımı olarak gösterir. Bu kez LDA modelini tidy hâline getirirken matrix = "gamma" kullanın; böylece belge-başına-konu olasılıklarını elde edersiniz. Örneğin, Prince’in 1999 adlı şarkısına bakın. Tıpkı bir sözcüğün birden çok konuyla ilişkili olabilmesi gibi, belgeler için de durum aynıdır. Bu, karışık-üyelik kavramına geri döner. Aşağıda 1999’un en olası olarak Konu 3’te yer aldığını görebilirsiniz.
#this time use gamma to look at the prob a doc is in a topic#just look at the Prince song 1999 as an example
tidy(lda, matrix ="gamma")%>% filter(document =="1999")Altyapı:
# A tibble: 3 x 3
document topic gamma
<chr><int><dbl>1199910.1702199920.1703199930.661Altyapı:
Bu şarkı her konuya aittir; ancak gamma değeriyle temsil edilen farklı yüzdelerde. Bazı belgeler bazı konulara diğerlerinden daha iyi uyar. Yukarıda gösterildiği gibi, 1999’un Konu 3 için gamma değeri daha yüksektir.
Akor Diyagramı
LDA’nın ne yaptığını netleştirmek için bu dairesel grafiğe bakın. Bu grafik, her kaynaktan gelen belgelerin yüzde kaçının her konuya ait olduğunu gösterir. Bunu oluşturmak için, LDA’nın tidy çıktısını, gerçek kaynağın (yani yazarın) yer aldığı source_tidy ile document üzerinden birleştirin. Sonra uygun gruplayla, konu/kaynak başına ortalama gamma değerini alabilirsiniz. Böylece her kaynak için belgelerin çoğunun hangi konuya düştüğünü görebilirsiniz.
Daha önce dairesel grafikleri kullanmadıysanız, lütfen bir dakikanızı ayırıp gerçekten inceleyin. (İkinci Bölüm-A’da chordDiagrams() ve circlize paketiyle pratik yapın. Paketle ilgili bilmeniz gereken her şey, Zuguang Gu’nun şu kitabında ele alınmıştır.)
#using tidy with gamma gets document probabilities into topic#but you only have document, topic and gamma
source_topic_relationship <- tidy(lda, matrix ="gamma")%>%#join to orig tidy data by doc to get the source field
inner_join(three_sources_tidy_balanced, by ="document")%>%
select(source, topic, gamma)%>%
group_by(source, topic)%>%#get the avg doc gamma value per source/topic
mutate(mean = mean(gamma))%>%#remove the gamma value as you only need the mean
select(-gamma)%>%#removing gamma created duplicates so remove them
distinct()#relabel topics to include the word Topic
source_topic_relationship$topic = paste("Topic", source_topic_relationship$topic, sep =" ")
circos.clear()#very important! Reset the circular layout parameters#assign colors to the outside bars around the circle
grid.col = c("prince"= my_colors[1],"icebergs"= my_colors[2],"machine_learning"= my_colors[3],"Topic 1"="grey","Topic 2"="grey","Topic 3"="grey")# set the global parameters for the circular layout. Specifically the gap size (15)#this also determines that topic goes on top half and source on bottom half
circos.par(gap.after = c(rep(5, length(unique(source_topic_relationship[[1]]))-1),15,
rep(5, length(unique(source_topic_relationship[[2]]))-1),15))#main function that draws the diagram. transparancy goes from 0-1
chordDiagram(source_topic_relationship, grid.col = grid.col, transparency =.2)
title("Konu ile Kaynak Arasındaki İlişki")Altyapı:
Bu, her kaynaktan gelen belgeler her konuda görünse de, her kaynağın açık biçimde belirli bir konuda çoğunluğa sahip olduğunu görmenin gerçekten ilginç bir yoludur. Örneğin Prince şarkıları, birinci ve ikinci konulara giden akorlardan daha büyük olduğu için çoğunlukla Konu 3 ile ilişkilidir. Aynı şey Buzdağları ve Konu 1, Makine Öğrenimi ve Konu 2 için de geçerlidir. Deseni bir kez gördüğünüzde, neler olduğu çok netleşir.
Şimdi yaptıklarınızı düşünürseniz, aslında belgeleri, bir konu/kaynak için gamma ortalamasına dayalı olarak Konulara sınıflandırdınız. Bir belgenin yazarını biliyorsanız ve bu yazarın çoğu sözü veya kitabı belirli bir konuda yazdığını biliyorsanız, benzer türdeki sanatçıların aynı konulara düşeceğini ve dolayısıyla benzer yazarları önerebileceğinizi varsayabilirsiniz... Daha büyük veri setine baktığınızda bu alıştırmayı pratiğe dökeceksiniz.
Konu Başına En İyi Belgeler
Şimdi bireysel belge düzeyine bakın ve konu başına en iyi belgeleri görüntüleyin.
number_of_documents =5#number of top docs to view
title <- paste("LDA Top Documents for", k,"Topics")#create tidy form showing topic, document and its gamma value
topics_tidy <- tidy(lda, matrix ="gamma")#same process as used with the top words
top_documents <- topics_tidy %>%
group_by(topic)%>%
arrange(topic, desc(gamma))%>%
slice(seq_len(number_of_documents))%>%
arrange(topic, gamma)%>%
mutate(row = row_number())%>%
ungroup()%>%#re-label topics
mutate(topic = paste("Topic", topic, sep =" "))
title <- paste("LDA Top Documents for", k,"Topics")
word_chart(top_documents, top_documents$document, title)Altyapı:
Sanatçı/Yazarları Belirleyin
Belge/şarkı başlıklarının adlandırmasını (ör. alt çizgi içeren sayfalar makine öğrenimi kitabından) bilmeyebileceğiniz için, belge adını kaynak adıyla değiştireceğim.
title <- paste("Sources for Top Documents for", k,"Topics")
topics_tidy <- tidy(lda, matrix ="gamma")
top_sources <- top_documents %>%#join back to the tidy form to get the source field
inner_join(source_tidy)%>%
select(document, source, topic)%>%
distinct()%>%
group_by(topic)%>%#needed by word_chart (not relevant here)
mutate(row = row_number())%>%
ungroup()
word_chart(top_sources, top_sources$source, title)Altyapı:
Önceki grafikte gösterilen her konu için en iyi belgeler, kaynaklarıyla değiştirildi. Kodunuz, bu belgeleri iyi sınıflandırdı; çünkü (en azından bu ilk 5 için) aynı kategoriye düştüler! Büyük soru, bunun yalnızca üç kaynaktan fazlasıyla çalışıp çalışmadığıdır. Sonuçlarınız doğruysa, o zaman benzer konulara sahip yazarları önerebilirsiniz.
Model İki: Üç Yazar için K-Ortalamalar
İkinci modelinizi farklı bir makine öğrenimi tekniğiyle oluşturacaksınız: k-ortalamalar algoritması. LDA gibi, k-ortalamalar da gözetimsiz bir öğrenme algoritmasıdır ve konu sayısını önceden belirlemenizi gerektirir. LDA’nın karışık-üyelik modelinin aksine, k-ortalamalar belgeleri görünürde ayrık kümelere (yani konulara) böler. Burada algoritma, benzerlik ölçüsüne göre belgeleri farklı gruplara kümeleler. Belgeleri, belgedeki sözcüklere atanan ağırlıklarla (tf-idf’ye benzer) sayısal vektörlere dönüştürür. Her belge tam olarak bir kümede yer alır. Buna sert kümeleme denir. Çıktı, kümeler ve bunların belgelerinden oluşur. Buna karşılık, LDA verinin birden fazla kümeye ait olabildiği bulanık (yumuşak) kümeleme tekniğidir.
Dolayısıyla kavramsal olarak, doğal dile uygulandığında, metin genellikle birden fazla konu barındırdığı için konu atamasında LDA’nın k-ortalamalardan daha gerçekçi sonuçlar vermesi beklenir. Şimdi modelinizi kurun, k-ortalamalar nesnesini inceleyin ve varsayımınızın doğru olup olmadığını görün.
Değişkenleri Ayarlayın ve Modeli Uydurun
#use the same three sources you started with
source_dtm <- three_sources_dtm_balanced
source_tidy <- three_sources_tidy_balanced
#Set a seed for replicable results
set.seed(1234)
k <-3
kmeansResult <- kmeans(source_dtm, k)
str(kmeansResult)Altyapı:
List of 9$ cluster : Named int [1:1449]1322313223...
..- attr(*,"names")= chr [1:1449]"push it up""shake""party up""style"...$ centers : num [1:3,1:13608]420.010650.0075800.01141...
..- attr(*,"dimnames")=List of 2
.. ..$: chr [1:3]"1""2""3"
.. ..$: chr [1:13608]"push""shake""party""style"...$ totss : num 237535$ withinss : num [1:3]64020221128285$ tot.withinss: num 231137$ betweenss : num 6398$ size : int [1:3]21315132$ iter : int 3$ ifault : int 0- attr(*,"class")= chr "kmeans"Altyapı:
K-ortalamalar nesnesinin yapısı iki önemli bilgiyi ortaya koyar: clusters ve centers. Aşağıdaki biçimi, 1999 şarkısı ve o şarkıda geçen party sözcüğü için her değişkenin içeriğini görmek için kullanabilirsiniz.
Bu alanlar, 1999’un tek bir kümeye (küme iki) yerleştirildiğini ve party’nin her üç kümede de bulunduğunu, ancak çoğunlukla birinci kümeye düştüğünü gösterir. Şimdi temaları belirlemek için centers değerlerine dayalı en üst sözcüklere bakalım.
K-Ortalamalar Temalarını En Üst Sözcüklerle Belirleyin
Bu veri setinin üç kaynak içerdiğini unutmayın: Prince, Buzdağları ve Makine Öğrenimi. Her küme için en üst sözcükleri yazdırın ve sonuçlarınızı LDA çıktısıyla karşılaştırın. word_chart() fonksiyonunuzu kullanabilmek için verinin biçimini biraz değiştirmeniz gerekecek. Kodu takip edebilirsiniz; fakat burada ayrıntılardan çok en üst sözcüklerin analizi önemlidir.
num_words <-8#number of words to display#get the top words from the kmeans centers
kmeans_topics <- lapply(1:k,function(i){
s <- sort(kmeansResult$centers[i,], decreasing = T)
names(s)[1:num_words]})#make sure it's a data frame
kmeans_topics_df <- as.data.frame(kmeans_topics)#label the topics with the word Topic
names(kmeans_topics_df)<- paste("Topic", seq(1:k), sep =" ")#create a sequential row id to use with gather()
kmeans_topics_df <- cbind(id = rownames(kmeans_topics_df),
kmeans_topics_df)#transpose it into the format required for word_chart()
kmeans_top_terms <- kmeans_topics_df %>% gather(id,1:k)
colnames(kmeans_top_terms)= c("topic","term")
kmeans_top_terms <- kmeans_top_terms %>%
group_by(topic)%>%
mutate(row = row_number())%>%#needed by word_chart()
ungroup()
title <- paste("K-Means Top Terms for", k,"Topics")
word_chart(kmeans_top_terms, kmeans_top_terms$term, title)Altyapı:
K-ortalamalar algoritması, konuları kitaplar ve müzik arasında ayıracak kadar zekidir. Başka bir deyişle, Konu 1 ve 3 açıkça Prince temalarıdır ve Konu 2 iki kitabın bir kombinasyonudur. Ancak, LDA ile yaptığınız gibi bu iki kitabı birbirinden ayırt edememiştir. K-ortalamalar daha iyi performans için ayarlanabilir; LDA da öyle. Hızlı bir bakışta ve varsayılan parametrelerle, k-ortalamaların LDA kadar iyi performans göstermediği görülüyor; nitekim sert kümeleme genellikle konu modellemesi için pek kullanılmaz. (Başka bir seçenek için mallet paketine bakın.)
Model Üç: 12 Yazar için LDA
Bu modelde, birden fazla türü kapsayan 12 farklı kaynak/yazardan oluşan veri setinde LDA algoritmasını kullanacaksınız. Veri seti, yazar başına benzer sayıda belge ve sözcük ile zaten dengelenmiştir. Veriye genel bakış aşağıdadır:
Veriyi İnceleyin
all_sources_tidy_balanced %>%
group_by(source)%>%#get the word count and doc count per source
mutate(word_count = n(),
source_document_count = n_distinct(document))%>%
select(source, genre, word_count, source_document_count)%>%
distinct()%>%
ungroup()%>%#bars change size according to number#tiles are static sizes
mutate(word_count = color_bar("lightpink")(word_count),
source_document_count = color_bar("lightpink")(source_document_count),
source = color_tile("lightblue","lightblue")(source),
genre = color_tile("lightgreen","lightgreen")(genre))%>%
my_kable_styling("Tüm Kaynaklar İstatistikleri")Altyapı:
Bu veri seti, Prince’ten country sanatçısı Johnny Cash’e, rap sanatçısı Eminem’e kadar geniş bir yelpazede sanatçıları ve ayrıca dört ayrı kitabı içerir. Bu sanatçılar, kendi türlerinde en üretken olarak sıralandıkları için seçildi. İçerik bir şarkı sözü sitesinden kazındı. İki makine öğrenimi kitabı olmasına rağmen, biri genel veri bilimine odaklanır, diğeri ise R programlamaya özgü makine öğrenimine daha odaklıdır. Tüm kitaplar indirilebilir PDF olarak mevcuttur. (Ham PDF’ler bu analiz için gerekli değildir; tidy sürümleri sağlanmıştır.)
Kısa bir düzenleme adımı: bazı tür açıklamaları grafiklerimiz için fazla uzun; bu yüzden okunabilirliği artırmak adına kısaltılmış biçimler oluşturun.
#this time use the dataset with 12 sources
all_sources_dtm_balanced <- all_sources_tidy_balanced %>%
count(document, word, sort =TRUE)%>%
ungroup()%>%
cast_dtm(document, word, n)
source_dtm <- all_sources_dtm_balanced
source_tidy <- all_sources_tidy_balancedAltyapı:
Modeli Uydurun ve Temaları Belirleyin
Bu kez on iki yazar ve sekiz tür var. Umudum, aynı türden yazarların aynı konu içinde gruplanması. Asıl sınav bu. O hâlde, konu sayısını sekiz olarak ayarlayın ve bu daha büyük veri setiyle modeli yeniden uydurun.
k <-8#number of topics chosen to match the number of genres
num_words <-10#number of words we want to see in each topic
seed =1234#make it repeatable#same as before
lda <- LDA(source_dtm, k = k, method ="GIBBS", control = list(seed = seed))
top_terms_per_topic(lda, num_words)Altyapı:
Görüşünüzü etkilemek istemem ama tepkim şu: "Vay be"! Bu modelin girdilerini göz önünde bulundurduğunuzda, temaları görebiliyor musunuz? Her konuya bakın ve onları bilinen sekiz türe eşleştirmeye çalışın. Bazıları ayırt etmesi zor olacaktır, ama diğerleri oldukça belirgindir. Örneğin, yorum için olası eşleştirmeler:
Birinci Konu - makine öğrenimi ve veri bilimi
İkinci Konu - pop/rock
Üçüncü Konu - spor beslenmesi
Dördüncü Konu - country
Beşinci Konu - hip-hop-rap
Altıncı Konu - country veya pop-rock
Yedinci Konu - buzdağları, yer bilimleri
Sekizinci Konu - dini
Karışık-üyelik kavramını unutmayın; bu konuların tamamen ayrık olması beklenmez, yine de burada gördüğünüz kadar ayrışmış sonuçlara şaşırdım. Küçük bir not: LDA algoritması, kullandıklarınızdan daha fazla parametre alır; böylece modelinizi daha da güçlendirecek şekilde ayarlayabilirsiniz.
Sıradaki kısım gerçekten heyecan verici. Bu konuların ne hakkında olduğunu görmeyi nasıl kolaylaştırabilirsiniz? Çoğu durumda yorumlamak zordur; ancak doğru veri setiyle modeliniz iyi performans gösterebilir. Modeliniz hangi belgelerin hangi konuya daha çok düştüğünü belirleyebilirse, yazarları birlikte gruplamaya başlayabilirsiniz. Ve sizin durumunuzda yazarın türünü bildiğiniz için, sonuçlarınızı belirli bir ölçüde doğrulayabilirsiniz! İlk adım, her belgeyi sınıflandırmaktır.
Belgeleri Sınıflandırın
Akor Diyagramı
Hatırlatma olarak, her belge birden çok konu içerir; ancak bu, gamma değeriyle temsil edilen farklı yüzdelerde olur. Bazı belgeler bazı konulara daha iyi uyar. Bu grafik, her konu için her kaynaktan gelen belgelerin ortalama gamma değerini gösterir. Bu, yukarıda üç yazar ile kullandığınız yaklaşımın aynısıdır; ancak bu kez tür alanına bakacaksınız. Yazarların türü ile konular arasındaki ilişkiyi göstermenin harika bir yoludur.
source_topic_relationship <- tidy(lda, matrix ="gamma")%>%#join to the tidy form to get the genre field
inner_join(source_tidy, by ="document")%>%
select(genre, topic, gamma)%>%
group_by(genre, topic)%>%#avg gamma (document) probability per genre/topic
mutate(mean = mean(gamma))%>%
select(genre, topic, mean)%>%
ungroup()%>%#re-label topics
mutate(topic = paste("Topic", topic, sep =" "))%>%
distinct()
circos.clear()#very important! Reset the circular layout parameters#this is the long form of grid.col just to show you what I'm doing#you can also assign the genre names individual colors as well
grid.col = c("Topic 1"="grey","Topic 2"="grey","Topic 3"="grey","Topic 4"="grey","Topic 5"="grey","Topic 6"="grey","Topic 7"="grey","Topic 8"="grey")#set the gap size between top and bottom halves set gap size to 15
circos.par(gap.after = c(rep(5, length(unique(source_topic_relationship[[1]]))-1),15,
rep(5, length(unique(source_topic_relationship[[2]]))-1),15))
chordDiagram(source_topic_relationship, grid.col = grid.col, annotationTrack ="grid",
preAllocateTracks = list(track.height = max(strwidth(unlist(dimnames(source_topic_relationship))))))#go back to the first track and customize sector labels#use niceFacing to pivot the label names to be perpendicular
circos.track(track.index =1, panel.fun =function(x, y){
circos.text(CELL_META$xcenter, CELL_META$ylim[1], CELL_META$sector.index,
facing ="clockwise", niceFacing =TRUE, adj = c(0,0.5))}, bg.border =NA)# here set bg.border to NA is important
title("Konu ile Tür Arasındaki İlişki")Altyapı:
Her akor (yani bağlantı), bir konuya ait olan tür başına belgelerin ortalama gamma değerini temsil eder. sports_nutrition bölümüne bakarsanız, Konu 3’e giden akorun diğerlerinden daha büyük olduğunu görebilirsiniz. Bu, daha çok spor beslenmesi sayfasının o konuya düştüğü anlamına gelir. Açıkça, Makine Öğrenimi ve Veri Bilimi sayfalarının çoğu Konu 1’e; Yer Bilimleri belgelerinin çoğu Konu 7’ye düşer ve bekleneceği gibi Pop-Rock birden fazla konu arasında oldukça bölünmüştür. Bu mantıklıdır; çünkü Pop tanım gereği popülerdir ve genelleştirilmiş bir türdür. Rap-Hip-Hop ise daha çok Konu 5’te bulunur. Peki bu bilgilerle ne yapabilirsiniz? Tematik içeriğe dayanarak dinleyicilere önerilerde bulunabilirsiniz!
Elbette söz içeriği, öneri sistemlerinde kullanılan tek özellik olmak zorunda değildir; daha iyi bir dinleme deneyimi için ritim, enstrümantasyon, tempo vb. meta verilerle birleştirilebilir.
Benzer Yazarları Önerin
Artık belgeler ve konular arasındaki ilişkiyi gördüğünüze göre, source (yazar) ve konu bazında gruplayın ve grup başına gamma değerlerinin toplamını alın. Ardından her konu için top_n(1) kullanarak en yüksek topic_sum değerine sahip yazarı seçin. Belgeleri türe göre sınıflandırırken burada yazar ile yaptığınızın aynısını yapmak isteyeceğiniz için, top_items_per_topic() adlı bir fonksiyon oluşturun ve türü type olarak source geçin. Böylece daha sonra genre ile çağırabilirsiniz.
Bu, yazar ile belirli bir konuyu gerçekten eşlediğiniz kritik andır. Ne olmasını bekliyorsunuz?
#this function can be used to show genre and source via passing the "type"
top_items_per_topic <-function(lda_model, source_tidy, type){#get the tidy version by passing gamma for the per document per topic probs
document_lda_gamma <- tidy(lda_model, matrix ="gamma")%>%#join to the tidy form to get source and genre
inner_join(source_tidy)%>%
select(document, gamma, source, genre, topic)%>%
distinct()%>%#remove duplicates#group so that you can get sum per topic/source
group_by(source, topic)%>%#sort by decending gamma value
arrange(desc(gamma))%>%#create the sum of all document gamma vals per topic/source. Important!
mutate(topic_sum = sum(gamma))%>%
select(topic, topic_sum, source, genre)%>%
distinct()%>%
ungroup()%>%#type will be either source or genre
group_by(source, genre )%>%#get the highest topic_sum per type
top_n(1, topic_sum)%>%
mutate(row = row_number())%>%
mutate(label = ifelse(type =="source", source, genre),
title = ifelse(type =="source","Recommended Writers Per Topic","Genres Per Topic"))%>%
ungroup()%>%#re-label topics
mutate(topic = paste("Topic", topic, sep =" "))%>%
select(label, topic, title)#slightly different format from word_chart input, so use this version
document_lda_gamma %>%#use 1, 1, and label to use words without numeric values
ggplot(aes(1,1, label = label, fill = factor(topic)))+#you want the words, not the points
geom_point(color ="transparent")+#make sure the labels don't overlap
geom_label_repel(nudge_x =.2,
direction ="y",
box.padding =0.1,
segment.color ="transparent",
size =3)+
facet_grid(~topic)+
theme_lyrics()+
theme(axis.text.y = element_blank(), axis.text.x = element_blank(),
axis.title.y = element_text(size =4),
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(document_lda_gamma$title)+
coord_flip()}
top_items_per_topic(lda, source_tidy,"source")Altyapı:
Bu heyecan verici! Ancak bu sanatçılara pek aşina olmayabileceğiniz için, yazarı tür ile değiştirerek işler netleştireceğim. Hazır olun...
Hip-hop-rap sanatçıları birlikte gruplanmış; Hristiyan sanatçılar birlikte; pop-rock sanatçılarının ikisi birlikte ve her kitap kendi konusuna sahip! Yalnızca metne dayanarak gözetimsiz öğrenmenin (farklı türleri tanıma gibi) böyle sonuçlar üretebilmesi oldukça şaşırtıcı. Farklı bir konu sayısı seçseniz ne olurdu? Hangi türleri birleştirir ya da ayırırdı? Belki bunu kendi başınıza deneyebilirsiniz. Şimdilik, sonraki model önceki derslerde kullandığınız Prince veri setine odaklanacak.
Model Dört: Prince Şarkıları için LDA
Bu modelde yalnızca Prince şarkılarını içeren veri setinizi kullanacaksınız. Şarkı sözlerinde ayırt edilebilir konular olsa da, çoğu zaman tek bir şarkı birden fazla konuyu kapsar. Veri setinizde yalnızca bir sanatçı olduğunda, konular daha karışık ve daha az ayrık olacaktır. Bu, yorumlamayı çok kritik bir adım hâline getirir. Prince’in sözlerinden ham veri kullanmak yerine, aşağıda açıklandığı gibi biraz değiştirilmiş bir sürüm kullanacaksınız.
Modeli Geliştirmek için NLP Kullanın
Daha önce sözcükleri metinde göründükleri hâliyle kullandınız. Ama şimdi, cleanNLP adlı güçlü bir NLP paketinden elde edilen açıklamalı veri biçimini kullanacaksınız. Bu paket, belirteçleme, sözcük türü etiketleme, varlık tanıma, varlık bağlama, duygu analizi ve daha birçok açıklama görevini sağlayan bir Doğal Dil İşleme için tidy veri modelidir. Bu alıştırma bu dersin dışında yapıldı; ancak konu modellemesi için ihtiyacınız olan her şeyi sağladım.
NLP Çıktısını İnceleyin
Açıklamalı veri setinde, Prince’in sözlerindeki külliyattaki her bir sözcük için, o sözcük hakkında önemli bilgiler içeren bir satır vardır.
Belirteçlenmiş açıklama nesnesine daha yakından bakmak için alan adlarını inceleyin.
#read in the provided annotated dataset
prince_annotated <- read.csv("prince_data_annotated.csv")#look at the fields provided in the dataset
names(prince_annotated)Altyapı:
lemma: çekimli bir sözcüğün temel kök biçimi (yani indirgenmiş biçimi)
upos: her bir sözcüğün evrensel sözcük türü
word alanı orijinal sözcüktür; lemma ise lemmatize edilmiş sürümdür. upos, evrensel sözcük türü kodudur. upos üzerinde table() çağırırsanız, her etiketli sözcük türüne düşen sözcük sayısını görürsünüz. (Bazı sözcüklerin birden çok kez etiketlenmiş olabileceğini unutmayın)
ADJ ADP ADV AUX CCONJ DET INTJ NOUN NUM PART PRON PROPN
1519319157204391985556012077753994804754391008750932523
SCONJ SYM VERB X
562672436733095Altyapı:
Verinin nasıl göründüğüne dair fikir vermek için, lemma’nın orijinal sözcükle aynı olmadığı birkaç şarkıya odaklanın ve durak sözcükleri kaldırın.
prince_annotated %>%#most lemmas are the same as the raw word so ignore those
filter((as.character(word)!= as.character(lemma))&(id %in% c("broken","1999")))%>%#filter on 2 songs
anti_join(stop_words)%>%
select(song = id, word, lemma, upos)%>%
distinct()%>%
my_kable_styling("Açıklamalı Alt Küme")Altyapı:
Bu, modellere neleri dahil edeceğinizi (ör. sözcük, lemma veya belirli bir sözcük türü) ne kadar seçici olabileceğinizi gösterir. Lemmatize edilmiş sözcüğü mü yoksa orijinal sözcüğü mü kullanacağınıza karar vermek bir hüküm meselesidir. Ya da İkinci Bölüm-A’da bahsedilen kök biçimini kullanmak isteyebilirsiniz. cleanNLP’nin sonuçlarını ve neyin isim neyin sıfat sayıldığını da sorgulayabilirsiniz. Sizin için en iyi sonucu vereni bulana kadar birkaç farklı yapılandırmayla denemeler yapmanızı öneririm.
Bu derste yalnızca isimleri modele dahil edeceksiniz. Tür ve yıl gibi ilişkili Prince meta verilerini almak için, prince_annotated’ı prince_tidy ile word ve document üzerinden birleştirin, ardından her zamanki gibi DTM’yi oluşturun. Tüm konularda bulunan bazı çok yaygın sözcükleri çıkarmayı seçtim; sadece ilginç kalsın diye. (Birinci Bölüm’de ele alınan tf-idf kavramını, yaygın sözcükleri kaldırmak için dikkate alabileceğiniz başka bir yöntem olarak not edin.)
NLP Kullanarak Değişkenleri Ayarlayın
source_tidy <- prince_annotated %>%
select(document = id, word, lemma, upos)%>%
filter(upos =="NOUN")%>%#choose only the nouns
inner_join(prince_tidy, by = c("word","document"))%>%
select(document, word, lemma, upos, source, genre, year)%>%
distinct()
source_dtm <- source_tidy %>%#filter out some words that exist across themes just for our purposes
filter(!word %in% c("love","time","day","night","girl"))%>%
count(document, word, sort =TRUE)%>%
ungroup()%>%
cast_dtm(document, word, n)Altyapı:
Modeli Uydurun ve Temaları Belirleyin
#Changing these parameters or the source data will cause different results!!
k <-7
num_words <-6
seed =4321
lda <- LDA(source_dtm, k = k, method ="GIBBS",
control = list(seed = seed))
top_terms_per_topic(lda, num_words)Altyapı:
Aşağıda, yıllar içinde insanlar tarafından Prince’in müziğinde olası temalar olarak etiketlenmiş bir tema listesi var. Belirli sözcüklerle etiketlenmişlerdir ve tüm konu modellemesinde olduğu gibi örtüşme vardır. Ancak bu elle etiketlenmiş temalara (rastgele sırada listelenmiştir!) bakın ve kurduğunuz modelde onları bulup bulamayacağınıza bakın.
aşk, zaman, hayat
insanlar, aile
savaş, barış, tartışma, özgürlük
acı, hüzün, kayıp
seks, uyuşturucu
benlik, toplum, din
müzik, dans, parti
Görünüşe göre Konu 1 insan ve aileyle ilgili; Konu 7 müzik, dans ve partiyle; Konu 4 ise benlik, toplum ve dinle ilgili. Bu oldukça öznel bir yorum gerektirir. İş bağlamında, bu adımın, ne beklemesi gerektiğine dair fikri olabilecek bir konu uzmanı tarafından yapılması en iyisidir. Şimdi NLP’nin gerçekten yapay zekâ ile hesaplamalı dilbilimin kesişimi olduğunu görebilirsiniz!
Bunu farklı bir konu sayısıyla, yalnızca fiillerle, ham sözcük yerine lemmatize biçimle ya da farklı sayıda en üst sözcükle çalıştırmayı deneyin ve hangi içgörüleri elde edebileceğinize bakın. Konu sayısını belirlemenize yardımcı olacak yeni yöntemler var: perpleksite kavramına buradan ya da ldatuning paketine buradan bakın.
Zaman İçinde Temalar
Prince veri seti yıl içerdiğinden, temaları zaman içinde izleyebilirsiniz. Burada oldukça yaratıcı olabilirsiniz; ancak şimdilik iki konudan birkaç sözcüğe bakın ve zaman içindeki sıklığını görüntüleyin. Eğilim analizi başlı başına bir ders olabilir; gerçekten ilginizi çekiyorsa şu kaynağa göz atın.
Bu, temaların zaman içinde nasıl değiştiğine dair son derece temel bir örnektir; peki ya bu tür bir analizi müziğin dışına taşısaydınız? Belki şirketiniz, ürün satışları ile müşterilerin ürününüz hakkında attığı tweet’lerdeki trend temalar arasındaki korelasyonla ilgileniyordur. Konuların zaman içinde nasıl değiştiğini anlamanın birçok uygulaması vardır.
Sonuç
Bu ders, konu modellemesi, NLP ve makine öğrenimi ile mümkün olanların yalnızca yüzeyini çiziyor. Bu, veri biliminin gelişmekte olan bir alanıdır ve daha fazla bilim insanı yapılandırılmamış verinin keşfedilmemiş okyanuslarına daldıkça büyümeye devam edecektir. Müzikte, şarkıları sözlerine göre sınıflandırma kavramı daha çok araştırma makalelerinde bulunur; belki siz bu çalışmadan sıçrayarak YZ dünyasına kendi katkınızı sunabilirsiniz.
Sözlerden ve kurgu dışı kitaplardan verileri kullanarak temaları belirlediniz, tek tek belgeleri en olası konulara sınıflandırdınız ve tematik içeriğe dayalı olarak benzer yazarları belirlediniz. Böylece, metne ve etiketli yazarlara dayalı basit bir öneri sistemi kurabildiniz.
Aklınızda bulunsun; sanatı makinelerle modellemeye çalışıyorsunuz. Bir sanatçı "Gözümün bebeğisin" diyebilir; fakat meyveden ya da beden parçalarından söz etmiyordur. Gizleneni bulmanız gerekir. Müzik dinlerken her zaman geri vokalleri duymazsınız; ama oradadırlar. Favori şarkınızı açın ve ana vokalin ötesine kulak verin; gizli bir bilgi dünyasıyla karşılaşabilirsiniz. Bu keşfinizde mantığı arka plana, yaratıcılığı ise ön plana alın!
Bu serideki tüm derslerde olduğu gibi, burada sunulan veriyi hem eğlenceli bir vaka çalışması olarak hem de ilginizi çeken metinleri analiz etmek için bir fikir üreticisi olarak kullanmanızı öneririm. Bu, kendi favori sanatçılarınız, sosyal medya, kurumsal, bilimsel veya sosyo-ekonomik metinler olabilir. Konu modellemenin potansiyel uygulamaları hakkında ne düşünüyorsunuz? Lütfen fikirlerinizi aşağıya yorum olarak bırakın!
Serinin Üçüncü Bölümü’ne (dördüncü makale) göz kulak olun: Şarkı Sözü Analizi: R ile Makine Öğrenimi Kullanarak Öngörücü Analitik. Orada sözler ve etiketli meta veriler kullanarak bir şarkının geleceğini tahmin edeceksiniz. Karar Ağaçları, Naive Bayes ve daha fazlası gibi çeşitli algoritmalarla türü, on yılı ve hatta bir şarkının listeye girip girmeyeceğini tahmin etmeye çalışacaksınız! Yakında görüşmek üzere!
Uyarılar:
Uyarı bir: Benimle aynı sonuçları almanın tek yolu, kodu tamamen aynı sırayla ve aynı, değiştirilmemiş veri dosyalarıyla çalıştırmanızdır. Aksi halde belirli konulara atıflar anlam ifade etmeyecektir.
Uyarı iki: Bu çalışmayla ilgili kesin ve değişmez kurallar yoktur ve kendi araştırmalarıma dayanmaktadır. Konu modellemesi gerçek dünyadaki uygulamalarda yer alsa da, yalnızca sözlere dayalı müzik önericileri geliştirme konusunda çok fazla faaliyet yoktur.
Uyarı üç: Konu modellemesi zorludur. Modeli kurmak bir şeydir; sonuçları yorumlamak ise zor, öznel ve tam anlamıyla doğrulaması güçtür (yine de araştırmalar sürmektedir: Thomas W. Jones’un şu makalesine bakın). Süreç gözetimsiz, üretici, yinelemeli ve olasılıklara dayalıdır. Konular açık değil, ince, gizli ve ima edilmiştir.
R kullanarak makine öğrenimi hakkında daha fazla bilgi edinmek isterseniz, başlangıç seviyesindeki eğitimimize göz atın. Ayrıca, Makine Öğrenimine Giriş kursumuzu alın.
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!
Metindeki konuları modellemek ve kendi müzik öneri sisteminizi kurmak için R, NLP ve Makine Öğrenimi ile en ileri teknikleri kullanın!
Bu yazı, efsanevi sanatçı Prince’in şarkı sözleri ve diğer sanatçı-yazarlar üzerine bir vaka çalışmasıyla çeşitli analitik görevleri R ile gerçekleştirmeye devam edeceğiniz üç bölümlük bir eğitim serisinin İkinci Bölüm-B’sidir. Üç eğitim şunları kapsar:
Kendinizi NASA’da çalışan bir Veri Bilimci olarak hayal edin. Güneş ile ayın etkileşimlerini incelemek üzere ay yörüngesine gönderilecek iki uzay aracını izlemeniz isteniyor. Her uzay aracında olduğu gibi, test ya da fırlatma sonrası yakalanan sorunlar olabilir. Bu anomaliler, doğal dilde yaklaşık 20.000 problem raporunda kayıt altına alınmıştır. Göreviniz, raporlar külliyatındaki en yaygın konuları ve yükselen temaları belirlemek ve mühendisler ile program direktörlerine reçeteleyici analiz sonuçları sunmaktır; böylece uzay keşfinin geleceğini etkilersiniz.
Bu, gerçek hayattan bir senaryonun örneğidir ve makine öğrenimi ile konu modellemesi, Doğal Dil İşleme (NLP) ve R programlama gibi ileri teknikleri kullanmayı öğrendikten sonra parmaklarınızın ucunda nasıl bir güç olacağına dair fikir vermelidir. Neyse ki, aynı derecede yenilikçi bir şey yapmak için NASA’da çalışmanız gerekmiyor. Bu derste, kabul etmeyi seçerseniz misyonunuz, konu modellemesini öğrenmek ve müzik sözleri ile kurgu dışı kitaplara dayalı basit bir öneri (nam-ı diğer önerici) sistemi kurmaktır.
Sırf Eğlence İçin!
Bu konu modellemesiyle ilgili değil, ama sırf eğlence olsun diye, önceki bir derste tanıtılan harika bir paket olan
circlize’ı kullanarak fotoreseptörlerinizi harekete geçirin ve bu derste kullanacağınız tüm kaynakların bu dairesel diyagramının keyfini çıkarın.Yapı
Önceki derslerde, Prince’in şarkı sözlerinin içeriğini sözcük sıklığı, tf-idf istatistiği ve duygu analizi kullanarak incelediniz. Konu modellemesi kavramını kullanarak şarkı sözlerine ve diğer metinlere daha derinlemesine bakış sunabilirsiniz.
Bu derste, Gizli Dirichlet Ayrımı (LDA) ve K-Ortalamalar kümeleme makine öğrenimi algoritmalarını kullanarak dört model oluşturacaksınız. Algoritmaları dersin ilerleyen kısımlarında açıklayacağım.
Model Bir, Prince’in şarkı sözlerinden alınan metni iki kurgu dışı kitapla birleştirir. Bu modelin amacı, gözetimsiz bir algoritma olan LDA’yı kullanarak temaları ima eden sözcük koleksiyonları oluşturmanın basit bir örneğini sunmaktır. Bu temalar etiketlenmemiştir ve insan yorumuna ihtiyaç duyar. Önceden belirlenmiş sayıda temayı tanımladıktan sonra, modelinizin sonuçlarını alıp her şarkıyı veya kitap sayfasını her kategoriye sınıflandıracaksınız. Bir şarkı, ürettiğiniz tüm konuları içerebilir ancak birine diğerinden daha temiz oturabilir. Bu, belge sınıflandırma olarak adlandırılır; fakat belgenin yazarını bildiğiniz için, özünde yazarları tematik kümelere sınıflandırmış olursunuz.
Model İki, Model Bir veri setini kullanır ve farklı bir algoritma, k-means ile tema üretimine hızlı bir bakış sunar ve bunun konu modellemesi için en iyi seçenek olmayabileceğini gösterir.
Yine LDA’yı kullanarak, Model Üç farklı türlerden birden çok sanatçı ve daha fazla kitap yazarı içeren daha büyük bir veri kümesinden yararlanır. Bir yazar/sanatçıya ait belgelerin çoğunu en olası konuya sınıflandırdığınızda, benzer tematik bileşimlere sahip yazarları bir araya getirme yeteneği elde edersiniz. Sağlam bir model ile benzer türlerin aynı konu kümesinde belirdiğini görmelisiniz. Örneğin rap sanatçıları tek bir konuda, benzer konudaki iki kitap ise birlikte başka bir konuda görünmelidir. Böylece potansiyel olarak benzer yazarları önerebilirsiniz! Elbette yazarlar ve türleri etiketlidir, ancak konular değildir ve bu nedenle gözetimsizdir.
Model Dört, yalnızca Prince’in şarkı sözlerinde LDA kullanır. Bu kez, her bir sözcüğün bir sözcük türü (isim, fiil vb.) ile etiketlendiği ve sözcüğün kök biçiminin (lemma) yer aldığı, bu dersin dışında üretilmiş açıklamalı bir veri kümesini kullanacaksınız. Ayrıca bir konunun zaman içinde nasıl değiştiğini de inceleyeceksiniz.
Introduction
NLP ve Makine Öğrenimi, Yapay Zekâ’nın alt alanlarıdır. Şarkı yazımı için YZ kullanmaya yönelik son girişimler oldu. Bu dersin hedefi bu değil; fakat YZ’nin sanat olarak nasıl kullanılabileceğine bir örnektir. Ne de olsa ilk üç harfi A-R-T! Bir an için YZ’yi şarkı yazımıyla karşılaştırın: Bir kalıbı kolayca izleyip bir yapı (kıta, nakarat, kıta vb.) oluşturabilirsiniz; ancak bir şarkıyı harika yapan, yazarın sürece yaratıcılık katmasıdır. Bu derste, modeller kurmak için teknik becerilerinizi kullanmanız gerekecek; fakat sonuçlarınızı yorumlama ve açıklama yeteneği kazanmak için sanatsal yaratıcılığınızı da devreye sokmanız gerekecek.
Tipik öneri sistemleri tamamen metne dayanmaz. Örneğin Netflix, önceki seçimler ve ilişkili meta veriler temelinde filmler önerebilir. Pandora ise farklı bir yaklaşım benimser ve melodiden ritme, kompozisyondan söz özetlerine kadar 400 müzikal öznitelikten oluşan bir Müzik Genomuna güvenir; ancak bu genomun geliştirilmesi 2000 yılında başlamış ve tamamlanması beş yıl ve müzik teorisinde 30 uzmanın katkısını gerektirmiştir. Konu özetlerine dayalı film önerilerini ele alan çok sayıda araştırma makalesi vardır. Doğrudan söz içeriğine dayanan müzik öneri sistemlerinin örneklerini bulmak ise daha zordur. Denemek ister misiniz?
Önkoşullar
Bu eğitim serisinin İkinci Bölüm-B’si, tidy veriye dair temel bir anlayış gerektirir — özellikle
dplyrveggplot2gibi paketler. Önceki derslerde ele alındığı üzeretidytextkullanarak metin madenciliği pratiği de önerilir. Ayrıca R fonksiyonlarına aşina olmanız gerekir; zira her model için kodunuzu tekrar kullanmak üzere birkaçından yararlanacaksınız. İçgörü yakalamaya odaklanabilmeniz için, kendi veri kümenizde kullanılmak üzere tasarlanmış kodu dahil ettim; ancak ayrıntılı açıklama, tarafınızdan ek araştırma gerektirebilir.Sorularınızı Hazırlayın
Konu modellemesiyle siz ne yapabilirsiniz? Belki işletmeniz için kritik bilgiler içeren belgeler vardır ve bunları madencilikle çıkarabilirsiniz. Belki Twitter’dan veri kazıyıp insanların şirketinizin ürünleri hakkında ne söylediğini bulabilirsiniz. Belki belirli belgeleri analiz için doğru departmanlara gönderen kendi sınıflandırma sisteminizi kurabilirsiniz. Keşfedebileceğiniz bir olasılıklar dünyası var! Hadi başlayın!
Konu Modellemesi Neden Faydalıdır?
Konu modellemesinin birkaç kullanım alanı şunlardır:
Hazırlık Çalışması
Kütüphaneler ve Fonksiyonlar
Bu derste, Birinci Bölüm veya İkinci Bölüm-A’da yer almayan tek yeni paketler
topicmodels,tmveplotly’dir. Modellerin farklı belgeleri ayırt etmeyi öğrenmesini sağlayantopicmodelspaketindenLDA()fonksiyonunu kullanacaksınız.tmpaketi metin madenciliği içindir ve yalnızca belge-terim matrisinin içini görmek için bir kezinspect()fonksiyonunu kullanacaksınız; bunu daha sonra açıklayacağım.plotly’yi ise bir kezggplot2grafiğinin etkileşimli bir sürümünü oluşturmak için kullanacaksınız.Aşağıdaki fonksiyonlar,
word_chart()istisna olmak üzere önceki derslerde tanımlanmıştı; ancakword_chart()’ın içeriği ve açıklaması da İkinci Bölüm-B’de bulunabilir. Esasen bilmeniz gereken, sözcüklere dayalı bir görsel oluşturmak içinggplot()’u alışılmadık bir şekilde kullandığıdır.Müzik ve Kitaplar
Konu modellemesi ve sınıflandırmanın gücünü gerçekten görmek için, önceki derslerde olduğu gibi yalnızca Prince’in şarkı sözlerini kullanmakla kalmayacak, aynı zamanda Billboard listelerinde tanınan farklı türlerden birkaç sanatçıyla da çalışacaksınız. Buna ek olarak, spor beslenmesi, buzdağları ve hatta makine öğrenimi gibi farklı konularda birkaç kitap ekledim! Çeşitli bir veri setine sahip olarak, belgeleri ilişkili konulara sınıflandırabilir ve benzer sanatçı/yazarları ayırt edebilirsiniz.
Veriyi Edinin
Modellemeye odaklanabilmek için, bu dersin dışında veri hazırlama yaptım ve aşağıdaki üç dosyada ihtiyacınız olan tüm verileri şu ön işlemler uygulanmış şekilde sağladım:
pdftoolspaketindekipdf_text()fonksiyonunu kullandım (her sayfa ayrı bir belgeyi temsil eder)tidytextpaketini kullanarak tüm veriyi temizledim, durak sözcükleri kaldırdım ve tidy sürümlerini oluşturdumBu derste çalışmak üzere üç ayrı veri setiniz olacak:
three_sources_tidy_balanced: Prince sözleri ve iki kitap içerirall_sources_tidy_balanced: sekiz sanatçının sözleri ve dört kitap içerirprince_tidy: yalnızca Prince sözleri içerirAyrıca Prince’in şarkı sözlerinin açıklamalı bir veri setini de ekledim. Model Dörte geldiğinizde açıklamalıdan ne kastettiğimi açıklayacağım.
LDA ile Modeller Kurma
Konu modellemesinin ana hedefi, yapılandırılmamış metinsel veride, sözcüklerin birlikte görülme kalıpları olarak ölçülen, tematik olarak ilişkili önemli terimleri (konuları) bulmaktır. Konu modellerinin temel bileşenleri belgeler, terimler ve konulardır. Gizli Dirichlet Ayrımı (LDA), her belgenin bir sözcük koleksiyonu olduğu bir belge kümesinin altında yatan farklı konuları keşfeden gözetimsiz bir öğrenme yöntemidir. LDA şu varsayımları yapar:
LDA, ilişkili sözcük gruplarını bulmayı amaçlar. Yinelemeli, üretici bir algoritmadır. İki ana adım şunlardır:
LDA konu modelinin arkasındaki fikir, bir konuya ait sözcüklerin belgelerde birlikte görünmesidir. Her belgeyi konuların bir karışımı, her konuyu da sözcüklerin bir karışımı olarak modellemeye çalışır. (Buna karışık-üyelik modeli dendiğini görebilirsiniz.) Daha sonra, bir belgenin belirli bir konuya ait olma olasılığını kullanarak onu buna göre sınıflandırabilirsiniz. Sizin durumunuzda, orijinal veriden belgenin yazarını bildiğiniz için, benzer konu yapılarına dayalı olarak bir sanatçı/yazar önerebilirsiniz. Şimdi bir örneğe bakalım.
Model Bir: Üç Yazar için LDA
Veriyi İnceleyin
Bu modelde, üç farklı yazarın (yani kaynakların) birleşiminden oluşan veri setini kullanacak ve gizli konular arayacaksınız. Konu modellemesinin gücünü anlamanıza yardımcı olmak için, seçilen bu üç kaynak birbirinden oldukça farklıdır ve sezgisel olarak üç farklı konuyu kapsadıklarını bilirsiniz. Sonuç olarak, modelinize üç konu oluşturmasını söyleyecek ve ne kadar başarılı olduğuna bakacaksınız. Önce,
formattablepaketindencolor_bar()vecolor_tile()ile birliktemy_kable_styling()fonksiyonunuzu kullanarak veri setinizi incelemek istersiniz.Burada Prince’in şarkı sözlerini, "Machine Learning For Dummies" adlı bir kitabı ve "Why Icebergs Float" adlı başka bir kitabı kullanacaksınız; her birinde 30.000’den fazla (tekrarlı) sözcük bulunmaktadır.
Belge-Terim Matrisini Oluşturun
Şu anda Prince’in sözleri ve iki kitaptan oluşan dengelenmiş, tidy bir veri setine sahip olduğunuz için, önce her bir belgenin bir satır, her bir sütunun bir terim olduğu bir belge-terim matrisi (DTM) oluşturmak isteyeceksiniz. Bu biçim, LDA algoritması için gereklidir. Bir belge, şarkı sözlerinde bir şarkıyı, kitaplarda ise bir sayfa numarasını ifade eder. Önce tidy verinizi alıp bir belgedeki sözcükleri sayacak, sonra bunu
tidytext’incast_dtm()fonksiyonuna bağlayacaksınız; buradadocumentbelge adını,wordise terimi içeren alanın adıdır. Başka parametreler de geçebilirsiniz, fakat bu ikisi zorunludur.Bu çıktı, kaç belge ve teriminiz olduğunu ve matrisin çok seyrek olduğunu gösterir. Seyrek, DTM’nin çoğunlukla boş alanlar içerdiği anlamına gelir. Tüm belgelerden gelebilecek geniş kelime dağarcığı nedeniyle, her bir belgede yalnızca az sayıda terim kullanılacaktır.
tmpaketindeninspect()fonksiyonunu kullanarak DTM’nin birkaç satır ve sütun içeriğine bakarsanız, her satırın bir belgeyi, her sütunun bir terimi temsil ettiğini görürsünüz. (Gerçek yapıyı görmek içinstr()kullanmaktan çekinmeyin.)Değişkenleri Ayarlayın
Modelinizi oluşturmak için girdide nelerin gerektiğini bildiğinize göre, her model oluştururken kolayca sıfırlayabileceğiniz iki değişken ayarlayın. Bunlara
source_dtmvesource_tidyadını vereceksiniz.Modeli Uydurun
Nihayet, modeli uydurma kısmının eğlenceli bölümüne geldiniz. Kod basittir; ancak iyi bir Veri Bilimci olmak için kaputun altında neler olduğunu anlamak istersiniz. Bu yüzeysel bir açıklama olsa da, LDA hakkında çevrimiçi olarak bir servet değerinde bilgi mevcut. Sizin amaçlarınız için dört parametreyi bilmeniz yeterli: girdi, konu sayısı, örnekleme yöntemi ve tohum (seed).
Veri setinizin üç farklı yazar içerdiğini bildiğiniz için
k’yi3olarak ayarlayacak ve tekrarlanabilir sonuçlar elde etmek içinseed’i sabit bir değere koyacaksınız. Başka control parametreleri de vardır; kodda list biçimi bu yüzdendir; ancak şimdilik yalnızcaseedkullanacaksınız.methodparametresi, kullanılacak örnekleme algoritmasını tanımlar.GIBBSörnekleme yöntemini kullanacaksınız. VarsayılanVEM’dir; fakat deneyimlerime göreGIBBSkadar iyi performans göstermemektedir.GIBBSörneklemenin kısa teknik açıklaması, başlangıç noktasını sizin başlatabileceğiniz (burada0varsayılanını kullanacaksınız) bir rastgele yürüyüş gerçekleştirdiği ve her adımda eş olasılıkla bir artı ya da eksi hareket ettiğidir. Ayrıntılar ilginizi çekiyorsa buradan detaylı açıklamayı okuyun.Burada üç konulu bir
LDA_Gibbsnesnesi oluşturulduğunu görebilirsiniz. Çıktısı çok büyük olduğundan buradastr(lda)çalıştırmadım; ancak neler içerdiğini görmek için siz çalıştırabilirsiniz.Bir sonraki adım, bu nesneyi açıp sonuçlara bakmaktır. Anlaşılması kolay bir biçime dönüştürmek için
tidy()fonksiyonunu kullanabilirsiniz.tidy()çağrısında LDA nesnesini vematrixargümanı içinbetayı geçin.betayı geçirmek, modelden konu-başına-sözcük olasılıklarını sağlar. Aşağıdaki örnek, iceberg terimini kullanarak, o sözcüğün her bir konudaki olasılığını gösterir. iceberg sözcüğünün Konu 1’de üretilme olasılığı daha yüksektir.[# A tibble: 3 x 3 topic term beta 1 1 iceberg 0.000198
2 2 iceberg 0.00000292 3 3 iceberg 0.00000315]
En Üst Sözcüklerle Temaları Belirleyin
Modeli net şekilde anlamak için, her konudaki terimlerin neler olduğunu görmeniz gerekir. LDA modelini tidy hâline getirecek ve her konu için en üst terimleri çıkaracak bir fonksiyon oluşturun. Yani, her konu için en büyük
betadeğerlerine sahip terimler. Bu fonksiyonun içinde, üç konuyu ve en üst sözcükleri şıkça göstermek için önceden oluşturduğunuzword_chart()a başvuracaksınız. Bu örnektenum_words’u 10 olarak ayarlayın; fakat farklı bakışlar edinmek için bu sayı ile oynayabilirsiniz.Gözetimsiz öğrenme her zaman insan yorumuna ihtiyaç duyar... ama bu konular açıkça Buzdağları, Makine Öğrenimi ve Prince olmak üzere üç kaynağı yansıtıyor! Çok basit bir örnek olmasına rağmen, ihtimalleri düşündüğünüzde oldukça etkileyici!
Belgeleri Sınıflandırın
LDA, her konuyu sözcüklerin bir karışımı olarak tahmin etmenin yanı sıra, her belgeyi de konuların bir karışımı olarak gösterir. Bu kez LDA modelini tidy hâline getirirken
matrix = "gamma"kullanın; böylece belge-başına-konu olasılıklarını elde edersiniz. Örneğin, Prince’in 1999 adlı şarkısına bakın. Tıpkı bir sözcüğün birden çok konuyla ilişkili olabilmesi gibi, belgeler için de durum aynıdır. Bu, karışık-üyelik kavramına geri döner. Aşağıda 1999’un en olası olarak Konu 3’te yer aldığını görebilirsiniz.Bu şarkı her konuya aittir; ancak
gammadeğeriyle temsil edilen farklı yüzdelerde. Bazı belgeler bazı konulara diğerlerinden daha iyi uyar. Yukarıda gösterildiği gibi, 1999’un Konu 3 içingammadeğeri daha yüksektir.Akor Diyagramı
LDA’nın ne yaptığını netleştirmek için bu dairesel grafiğe bakın. Bu grafik, her kaynaktan gelen belgelerin yüzde kaçının her konuya ait olduğunu gösterir. Bunu oluşturmak için, LDA’nın tidy çıktısını, gerçek kaynağın (yani yazarın) yer aldığı
source_tidyiledocumentüzerinden birleştirin. Sonra uygun gruplayla, konu/kaynak başına ortalamagammadeğerini alabilirsiniz. Böylece her kaynak için belgelerin çoğunun hangi konuya düştüğünü görebilirsiniz.Daha önce dairesel grafikleri kullanmadıysanız, lütfen bir dakikanızı ayırıp gerçekten inceleyin. (İkinci Bölüm-A’da
chordDiagrams()vecirclizepaketiyle pratik yapın. Paketle ilgili bilmeniz gereken her şey, Zuguang Gu’nun şu kitabında ele alınmıştır.)Bu, her kaynaktan gelen belgeler her konuda görünse de, her kaynağın açık biçimde belirli bir konuda çoğunluğa sahip olduğunu görmenin gerçekten ilginç bir yoludur. Örneğin Prince şarkıları, birinci ve ikinci konulara giden akorlardan daha büyük olduğu için çoğunlukla Konu 3 ile ilişkilidir. Aynı şey Buzdağları ve Konu 1, Makine Öğrenimi ve Konu 2 için de geçerlidir. Deseni bir kez gördüğünüzde, neler olduğu çok netleşir.
Şimdi yaptıklarınızı düşünürseniz, aslında belgeleri, bir konu/kaynak için
gammaortalamasına dayalı olarak Konulara sınıflandırdınız. Bir belgenin yazarını biliyorsanız ve bu yazarın çoğu sözü veya kitabı belirli bir konuda yazdığını biliyorsanız, benzer türdeki sanatçıların aynı konulara düşeceğini ve dolayısıyla benzer yazarları önerebileceğinizi varsayabilirsiniz... Daha büyük veri setine baktığınızda bu alıştırmayı pratiğe dökeceksiniz.Konu Başına En İyi Belgeler
Şimdi bireysel belge düzeyine bakın ve konu başına en iyi belgeleri görüntüleyin.
Sanatçı/Yazarları Belirleyin
Belge/şarkı başlıklarının adlandırmasını (ör. alt çizgi içeren sayfalar makine öğrenimi kitabından) bilmeyebileceğiniz için, belge adını kaynak adıyla değiştireceğim.
Önceki grafikte gösterilen her konu için en iyi belgeler, kaynaklarıyla değiştirildi. Kodunuz, bu belgeleri iyi sınıflandırdı; çünkü (en azından bu ilk 5 için) aynı kategoriye düştüler! Büyük soru, bunun yalnızca üç kaynaktan fazlasıyla çalışıp çalışmadığıdır. Sonuçlarınız doğruysa, o zaman benzer konulara sahip yazarları önerebilirsiniz.
Model İki: Üç Yazar için K-Ortalamalar
İkinci modelinizi farklı bir makine öğrenimi tekniğiyle oluşturacaksınız: k-ortalamalar algoritması. LDA gibi, k-ortalamalar da gözetimsiz bir öğrenme algoritmasıdır ve konu sayısını önceden belirlemenizi gerektirir. LDA’nın karışık-üyelik modelinin aksine, k-ortalamalar belgeleri görünürde ayrık kümelere (yani konulara) böler. Burada algoritma, benzerlik ölçüsüne göre belgeleri farklı gruplara kümeleler. Belgeleri, belgedeki sözcüklere atanan ağırlıklarla (tf-idf’ye benzer) sayısal vektörlere dönüştürür. Her belge tam olarak bir kümede yer alır. Buna sert kümeleme denir. Çıktı, kümeler ve bunların belgelerinden oluşur. Buna karşılık, LDA verinin birden fazla kümeye ait olabildiği bulanık (yumuşak) kümeleme tekniğidir.
Dolayısıyla kavramsal olarak, doğal dile uygulandığında, metin genellikle birden fazla konu barındırdığı için konu atamasında LDA’nın k-ortalamalardan daha gerçekçi sonuçlar vermesi beklenir. Şimdi modelinizi kurun, k-ortalamalar nesnesini inceleyin ve varsayımınızın doğru olup olmadığını görün.
Değişkenleri Ayarlayın ve Modeli Uydurun
K-ortalamalar nesnesinin yapısı iki önemli bilgiyi ortaya koyar:
clustersvecenters. Aşağıdaki biçimi, 1999 şarkısı ve o şarkıda geçen party sözcüğü için her değişkenin içeriğini görmek için kullanabilirsiniz.Bu alanlar, 1999’un tek bir kümeye (küme iki) yerleştirildiğini ve party’nin her üç kümede de bulunduğunu, ancak çoğunlukla birinci kümeye düştüğünü gösterir. Şimdi temaları belirlemek için
centersdeğerlerine dayalı en üst sözcüklere bakalım.K-Ortalamalar Temalarını En Üst Sözcüklerle Belirleyin
Bu veri setinin üç kaynak içerdiğini unutmayın: Prince, Buzdağları ve Makine Öğrenimi. Her küme için en üst sözcükleri yazdırın ve sonuçlarınızı LDA çıktısıyla karşılaştırın.
word_chart()fonksiyonunuzu kullanabilmek için verinin biçimini biraz değiştirmeniz gerekecek. Kodu takip edebilirsiniz; fakat burada ayrıntılardan çok en üst sözcüklerin analizi önemlidir.K-ortalamalar algoritması, konuları kitaplar ve müzik arasında ayıracak kadar zekidir. Başka bir deyişle, Konu 1 ve 3 açıkça Prince temalarıdır ve Konu 2 iki kitabın bir kombinasyonudur. Ancak, LDA ile yaptığınız gibi bu iki kitabı birbirinden ayırt edememiştir. K-ortalamalar daha iyi performans için ayarlanabilir; LDA da öyle. Hızlı bir bakışta ve varsayılan parametrelerle, k-ortalamaların LDA kadar iyi performans göstermediği görülüyor; nitekim sert kümeleme genellikle konu modellemesi için pek kullanılmaz. (Başka bir seçenek için mallet paketine bakın.)
Model Üç: 12 Yazar için LDA
Bu modelde, birden fazla türü kapsayan 12 farklı kaynak/yazardan oluşan veri setinde LDA algoritmasını kullanacaksınız. Veri seti, yazar başına benzer sayıda belge ve sözcük ile zaten dengelenmiştir. Veriye genel bakış aşağıdadır:
Veriyi İnceleyin
Bu veri seti, Prince’ten country sanatçısı Johnny Cash’e, rap sanatçısı Eminem’e kadar geniş bir yelpazede sanatçıları ve ayrıca dört ayrı kitabı içerir. Bu sanatçılar, kendi türlerinde en üretken olarak sıralandıkları için seçildi. İçerik bir şarkı sözü sitesinden kazındı. İki makine öğrenimi kitabı olmasına rağmen, biri genel veri bilimine odaklanır, diğeri ise R programlamaya özgü makine öğrenimine daha odaklıdır. Tüm kitaplar indirilebilir PDF olarak mevcuttur. (Ham PDF’ler bu analiz için gerekli değildir; tidy sürümleri sağlanmıştır.)
Kısa bir düzenleme adımı: bazı tür açıklamaları grafiklerimiz için fazla uzun; bu yüzden okunabilirliği artırmak adına kısaltılmış biçimler oluşturun.
DTM’yi Oluşturun ve Değişkenleri Ayarlayın
Modeli Uydurun ve Temaları Belirleyin
Bu kez on iki yazar ve sekiz tür var. Umudum, aynı türden yazarların aynı konu içinde gruplanması. Asıl sınav bu. O hâlde, konu sayısını sekiz olarak ayarlayın ve bu daha büyük veri setiyle modeli yeniden uydurun.
Görüşünüzü etkilemek istemem ama tepkim şu: "Vay be"! Bu modelin girdilerini göz önünde bulundurduğunuzda, temaları görebiliyor musunuz? Her konuya bakın ve onları bilinen sekiz türe eşleştirmeye çalışın. Bazıları ayırt etmesi zor olacaktır, ama diğerleri oldukça belirgindir. Örneğin, yorum için olası eşleştirmeler:
Karışık-üyelik kavramını unutmayın; bu konuların tamamen ayrık olması beklenmez, yine de burada gördüğünüz kadar ayrışmış sonuçlara şaşırdım. Küçük bir not: LDA algoritması, kullandıklarınızdan daha fazla parametre alır; böylece modelinizi daha da güçlendirecek şekilde ayarlayabilirsiniz.
Sıradaki kısım gerçekten heyecan verici. Bu konuların ne hakkında olduğunu görmeyi nasıl kolaylaştırabilirsiniz? Çoğu durumda yorumlamak zordur; ancak doğru veri setiyle modeliniz iyi performans gösterebilir. Modeliniz hangi belgelerin hangi konuya daha çok düştüğünü belirleyebilirse, yazarları birlikte gruplamaya başlayabilirsiniz. Ve sizin durumunuzda yazarın türünü bildiğiniz için, sonuçlarınızı belirli bir ölçüde doğrulayabilirsiniz! İlk adım, her belgeyi sınıflandırmaktır.
Belgeleri Sınıflandırın
Akor Diyagramı
Hatırlatma olarak, her belge birden çok konu içerir; ancak bu,
gammadeğeriyle temsil edilen farklı yüzdelerde olur. Bazı belgeler bazı konulara daha iyi uyar. Bu grafik, her konu için her kaynaktan gelen belgelerin ortalamagammadeğerini gösterir. Bu, yukarıda üç yazar ile kullandığınız yaklaşımın aynısıdır; ancak bu kez tür alanına bakacaksınız. Yazarların türü ile konular arasındaki ilişkiyi göstermenin harika bir yoludur.Her akor (yani bağlantı), bir konuya ait olan tür başına belgelerin ortalama gamma değerini temsil eder.
sports_nutritionbölümüne bakarsanız, Konu 3’e giden akorun diğerlerinden daha büyük olduğunu görebilirsiniz. Bu, daha çok spor beslenmesi sayfasının o konuya düştüğü anlamına gelir. Açıkça, Makine Öğrenimi ve Veri Bilimi sayfalarının çoğu Konu 1’e; Yer Bilimleri belgelerinin çoğu Konu 7’ye düşer ve bekleneceği gibi Pop-Rock birden fazla konu arasında oldukça bölünmüştür. Bu mantıklıdır; çünkü Pop tanım gereği popülerdir ve genelleştirilmiş bir türdür. Rap-Hip-Hop ise daha çok Konu 5’te bulunur. Peki bu bilgilerle ne yapabilirsiniz? Tematik içeriğe dayanarak dinleyicilere önerilerde bulunabilirsiniz!Benzer Yazarları Önerin
Artık belgeler ve konular arasındaki ilişkiyi gördüğünüze göre, source (yazar) ve konu bazında gruplayın ve grup başına
gammadeğerlerinin toplamını alın. Ardından her konu içintop_n(1)kullanarak en yüksektopic_sumdeğerine sahip yazarı seçin. Belgeleri türe göre sınıflandırırken burada yazar ile yaptığınızın aynısını yapmak isteyeceğiniz için,top_items_per_topic()adlı bir fonksiyon oluşturun ve türü type olarak source geçin. Böylece daha sonra genre ile çağırabilirsiniz.Bu, yazar ile belirli bir konuyu gerçekten eşlediğiniz kritik andır. Ne olmasını bekliyorsunuz?
Bu heyecan verici! Ancak bu sanatçılara pek aşina olmayabileceğiniz için, yazarı tür ile değiştirerek işler netleştireceğim. Hazır olun...
Belgeyi Türüne Göre Önerin
Hip-hop-rap sanatçıları birlikte gruplanmış; Hristiyan sanatçılar birlikte; pop-rock sanatçılarının ikisi birlikte ve her kitap kendi konusuna sahip! Yalnızca metne dayanarak gözetimsiz öğrenmenin (farklı türleri tanıma gibi) böyle sonuçlar üretebilmesi oldukça şaşırtıcı. Farklı bir konu sayısı seçseniz ne olurdu? Hangi türleri birleştirir ya da ayırırdı? Belki bunu kendi başınıza deneyebilirsiniz. Şimdilik, sonraki model önceki derslerde kullandığınız Prince veri setine odaklanacak.
Model Dört: Prince Şarkıları için LDA
Bu modelde yalnızca Prince şarkılarını içeren veri setinizi kullanacaksınız. Şarkı sözlerinde ayırt edilebilir konular olsa da, çoğu zaman tek bir şarkı birden fazla konuyu kapsar. Veri setinizde yalnızca bir sanatçı olduğunda, konular daha karışık ve daha az ayrık olacaktır. Bu, yorumlamayı çok kritik bir adım hâline getirir. Prince’in sözlerinden ham veri kullanmak yerine, aşağıda açıklandığı gibi biraz değiştirilmiş bir sürüm kullanacaksınız.
Modeli Geliştirmek için NLP Kullanın
Daha önce sözcükleri metinde göründükleri hâliyle kullandınız. Ama şimdi,
cleanNLPadlı güçlü bir NLP paketinden elde edilen açıklamalı veri biçimini kullanacaksınız. Bu paket, belirteçleme, sözcük türü etiketleme, varlık tanıma, varlık bağlama, duygu analizi ve daha birçok açıklama görevini sağlayan bir Doğal Dil İşleme için tidy veri modelidir. Bu alıştırma bu dersin dışında yapıldı; ancak konu modellemesi için ihtiyacınız olan her şeyi sağladım.NLP Çıktısını İnceleyin
Açıklamalı veri setinde, Prince’in sözlerindeki külliyattaki her bir sözcük için, o sözcük hakkında önemli bilgiler içeren bir satır vardır.
Belirteçlenmiş açıklama nesnesine daha yakından bakmak için alan adlarını inceleyin.
Şimdilik yalnızca iki bilgiyi kullanacaksınız:
wordalanı orijinal sözcüktür;lemmaise lemmatize edilmiş sürümdür.upos, evrensel sözcük türü kodudur.uposüzerindetable()çağırırsanız, her etiketli sözcük türüne düşen sözcük sayısını görürsünüz. (Bazı sözcüklerin birden çok kez etiketlenmiş olabileceğini unutmayın)Verinin nasıl göründüğüne dair fikir vermek için, lemma’nın orijinal sözcükle aynı olmadığı birkaç şarkıya odaklanın ve durak sözcükleri kaldırın.
Bu, modellere neleri dahil edeceğinizi (ör. sözcük, lemma veya belirli bir sözcük türü) ne kadar seçici olabileceğinizi gösterir. Lemmatize edilmiş sözcüğü mü yoksa orijinal sözcüğü mü kullanacağınıza karar vermek bir hüküm meselesidir. Ya da İkinci Bölüm-A’da bahsedilen kök biçimini kullanmak isteyebilirsiniz.
cleanNLP’nin sonuçlarını ve neyin isim neyin sıfat sayıldığını da sorgulayabilirsiniz. Sizin için en iyi sonucu vereni bulana kadar birkaç farklı yapılandırmayla denemeler yapmanızı öneririm.Bu derste yalnızca isimleri modele dahil edeceksiniz. Tür ve yıl gibi ilişkili Prince meta verilerini almak için,
prince_annotated’ıprince_tidyilewordvedocumentüzerinden birleştirin, ardından her zamanki gibi DTM’yi oluşturun. Tüm konularda bulunan bazı çok yaygın sözcükleri çıkarmayı seçtim; sadece ilginç kalsın diye. (Birinci Bölüm’de ele alınan tf-idf kavramını, yaygın sözcükleri kaldırmak için dikkate alabileceğiniz başka bir yöntem olarak not edin.)NLP Kullanarak Değişkenleri Ayarlayın
Modeli Uydurun ve Temaları Belirleyin
Aşağıda, yıllar içinde insanlar tarafından Prince’in müziğinde olası temalar olarak etiketlenmiş bir tema listesi var. Belirli sözcüklerle etiketlenmişlerdir ve tüm konu modellemesinde olduğu gibi örtüşme vardır. Ancak bu elle etiketlenmiş temalara (rastgele sırada listelenmiştir!) bakın ve kurduğunuz modelde onları bulup bulamayacağınıza bakın.
Görünüşe göre Konu 1 insan ve aileyle ilgili; Konu 7 müzik, dans ve partiyle; Konu 4 ise benlik, toplum ve dinle ilgili. Bu oldukça öznel bir yorum gerektirir. İş bağlamında, bu adımın, ne beklemesi gerektiğine dair fikri olabilecek bir konu uzmanı tarafından yapılması en iyisidir. Şimdi NLP’nin gerçekten yapay zekâ ile hesaplamalı dilbilimin kesişimi olduğunu görebilirsiniz!
Zaman İçinde Temalar
Prince veri seti yıl içerdiğinden, temaları zaman içinde izleyebilirsiniz. Burada oldukça yaratıcı olabilirsiniz; ancak şimdilik iki konudan birkaç sözcüğe bakın ve zaman içindeki sıklığını görüntüleyin. Eğilim analizi başlı başına bir ders olabilir; gerçekten ilginizi çekiyorsa şu kaynağa göz atın.
Bu, temaların zaman içinde nasıl değiştiğine dair son derece temel bir örnektir; peki ya bu tür bir analizi müziğin dışına taşısaydınız? Belki şirketiniz, ürün satışları ile müşterilerin ürününüz hakkında attığı tweet’lerdeki trend temalar arasındaki korelasyonla ilgileniyordur. Konuların zaman içinde nasıl değiştiğini anlamanın birçok uygulaması vardır.
Sonuç
Bu ders, konu modellemesi, NLP ve makine öğrenimi ile mümkün olanların yalnızca yüzeyini çiziyor. Bu, veri biliminin gelişmekte olan bir alanıdır ve daha fazla bilim insanı yapılandırılmamış verinin keşfedilmemiş okyanuslarına daldıkça büyümeye devam edecektir. Müzikte, şarkıları sözlerine göre sınıflandırma kavramı daha çok araştırma makalelerinde bulunur; belki siz bu çalışmadan sıçrayarak YZ dünyasına kendi katkınızı sunabilirsiniz.
Sözlerden ve kurgu dışı kitaplardan verileri kullanarak temaları belirlediniz, tek tek belgeleri en olası konulara sınıflandırdınız ve tematik içeriğe dayalı olarak benzer yazarları belirlediniz. Böylece, metne ve etiketli yazarlara dayalı basit bir öneri sistemi kurabildiniz.
Aklınızda bulunsun; sanatı makinelerle modellemeye çalışıyorsunuz. Bir sanatçı "Gözümün bebeğisin" diyebilir; fakat meyveden ya da beden parçalarından söz etmiyordur. Gizleneni bulmanız gerekir. Müzik dinlerken her zaman geri vokalleri duymazsınız; ama oradadırlar. Favori şarkınızı açın ve ana vokalin ötesine kulak verin; gizli bir bilgi dünyasıyla karşılaşabilirsiniz. Bu keşfinizde mantığı arka plana, yaratıcılığı ise ön plana alın!
Bu serideki tüm derslerde olduğu gibi, burada sunulan veriyi hem eğlenceli bir vaka çalışması olarak hem de ilginizi çeken metinleri analiz etmek için bir fikir üreticisi olarak kullanmanızı öneririm. Bu, kendi favori sanatçılarınız, sosyal medya, kurumsal, bilimsel veya sosyo-ekonomik metinler olabilir. Konu modellemenin potansiyel uygulamaları hakkında ne düşünüyorsunuz? Lütfen fikirlerinizi aşağıya yorum olarak bırakın!
Serinin Üçüncü Bölümü’ne (dördüncü makale) göz kulak olun: Şarkı Sözü Analizi: R ile Makine Öğrenimi Kullanarak Öngörücü Analitik. Orada sözler ve etiketli meta veriler kullanarak bir şarkının geleceğini tahmin edeceksiniz. Karar Ağaçları, Naive Bayes ve daha fazlası gibi çeşitli algoritmalarla türü, on yılı ve hatta bir şarkının listeye girip girmeyeceğini tahmin etmeye çalışacaksınız! Yakında görüşmek üzere!
Uyarılar:
Uyarı bir: Benimle aynı sonuçları almanın tek yolu, kodu tamamen aynı sırayla ve aynı, değiştirilmemiş veri dosyalarıyla çalıştırmanızdır. Aksi halde belirli konulara atıflar anlam ifade etmeyecektir.
Uyarı iki: Bu çalışmayla ilgili kesin ve değişmez kurallar yoktur ve kendi araştırmalarıma dayanmaktadır. Konu modellemesi gerçek dünyadaki uygulamalarda yer alsa da, yalnızca sözlere dayalı müzik önericileri geliştirme konusunda çok fazla faaliyet yoktur.
Uyarı üç: Konu modellemesi zorludur. Modeli kurmak bir şeydir; sonuçları yorumlamak ise zor, öznel ve tam anlamıyla doğrulaması güçtür (yine de araştırmalar sürmektedir: Thomas W. Jones’un şu makalesine bakın). Süreç gözetimsiz, üretici, yinelemeli ve olasılıklara dayalıdır. Konular açık değil, ince, gizli ve ima edilmiştir.
R kullanarak makine öğrenimi hakkında daha fazla bilgi edinmek isterseniz, başlangıç seviyesindeki eğitimimize göz atın. Ayrıca, Makine Öğrenimine Giriş kursumuzu alın.