R ile Metin Madenciliği | Bölüm 3/6
Önceki yazılarda metin madenciliği üzerine genel girişi yaptığımıza göre yavaş yavaş işi ilerletme zamanı geldi, ama önceki konuda neler yaptığımızı hatırlayalım. Duygu analizinin ve duygu sözlüklerinin ne olduğunu, karşılaştırmalar ve görselleştirmeler üzerinden anlattık. Şimdi ise, belge koleksiyonlarından nasıl bilgi çıkarımı yapacağımızı keşfedelim.
3. Bölüm – Kelime ve Belge Sıklıklarını Analiz Etme: tf-idf
Doğal Dil İşlemenin ve Metin Madenciliği ortak bir soruyu kendine sorar, bir belgenin (döküman) ne ile alakalı olduğunu ölçmek. Belgeyi oluşturan kelimelere bakarak bunu yapabilir miyiz ? Bir kelimenin ne kadar önemli olabileceğinin bir ölçüsü, terim sıklığıdır (tf – term frequency).
Duraklama kelimelerinden bahsettik “the”, “of” gibi kelimeler. Belge içerisinde kelimeler var ama bunlardan bazıları çok fazla tekrar etmesine rağmen bir anlamı olmayabilir. Bu gibi kelimeleri duraklama kelimeleri gibi duraklama kelimesi listesine ekleyip, analizden çıkarma yaklaşımı sergileyebiliriz, ancak bazı kelimeler de bu belgelerin bazılarının diğerlerinden daha önemli olabileceği de olasıdır. Durma kelimelerinin listesi, yaygın olarak kullanılan kelimeler için terim sıklığını ayarlamada çok karmaşık bir yaklaşım değildir.
Bir diğer yaklaşım ise, terimin yaygın olarak kullanılan kelimelerin ağırlığını azaltan ve bir doküman koleksiyonunda çok fazla kullanılmayan kelimelerin ağırlığını arttıran bir terimin ters belge frekansına (inverse document frequency -idf) bakmaktır . idf, tf (terim frekansı) ile çarpılarak birleştirilebilir.
İstatistiksel tf-idf , bir kelimenin bir belgenin bir koleksiyonunda (veya bir belgede), örneğin bir roman koleksiyonunda bir romanda veya bir web sitesi koleksiyonundaki bir web sitesinde bir belgenin ne kadar önemli olduğunu ölçmek için tasarlanmıştır.
tf-idf, metin madenciliğinde, arama motorlarında vb. şeylerde yararlı olduğu kanıtlanmıştır.
3.1. Jane Austen’in Romanlarındaki Terim Frekansı
Jane Austen’in yayınlanmış romanlarına bakarak başlayalım. İlk olarak terim frekanslarını (tf), daha sonra da tf-idf’yi inceleyelim.
Jane Austen’in romanlarında en çok kullanılan kelimeler nelerdir?
library(dplyr)
library(janeaustenr)
library(tidytext)
book_words <- austen_books() %>%
unnest_tokens(word, text) %>%
count(book, word, sort = TRUE) %>%
ungroup()
total_words <- book_words %>%
group_by(book) %>%
summarize(total = sum(n))
book_words <- left_join(book_words, total_words)
## Joining, by = "book"
book_words
## # A tibble: 40,379 x 4
## book word n total
## <fct> <chr> <int> <int>
## 1 Mansfield Park the 6206 160460
## 2 Mansfield Park to 5475 160460
## 3 Mansfield Park and 5438 160460
## 4 Emma to 5239 160996
## 5 Emma the 5201 160996
## 6 Emma and 4896 160996
## 7 Mansfield Park of 4778 160460
## 8 Pride & Prejudice the 4331 122204
## 9 Emma of 4291 160996
## 10 Pride & Prejudice to 4162 122204
## # ... with 40,369 more rows
n / total ile her romanın dağılımına bakalım, bir romanda görünen kelimelerin sayısı o romanda toplam terim (kelime) sayısına bölünür.
Jane Austen’in Romanlarında Terim Frekans Dağılımı
library(ggplot2)
ggplot(book_words, aes(n/total, fill = book)) +
geom_histogram(show.legend = FALSE) +
xlim(NA, 0.0009) +
facet_wrap(~book, ncol = 2, scales = "free_y")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 896 rows containing non-finite values (stat_bin).
Grafikler tüm romanlar için benzer dağılıma sahip.
3.2. Zipf Kanunu
Zipf yasası, bir kelimenin ortaya çıkma sıklığıyla, sırasının ters orantılı olduğunu belirtir.
Terim sıklığını göstermek için kullandığımız veri çerçevesine sahip olduğumuzdan, Zipf’in Jane Austen’in romanlarına ilişkin birkaç yasayı dplyr işlevleri ile inceleyelim.
freq_by_rank <- book_words %>%
group_by(book) %>%
mutate(rank = row_number(),
`term frequency` = n/total)
freq_by_rank
## # A tibble: 40,379 x 6
## # Groups: book [6]
## book word n total rank `term frequency`
## <fct> <chr> <int> <int> <int> <dbl>
## 1 Mansfield Park the 6206 160460 1 0.0387
## 2 Mansfield Park to 5475 160460 2 0.0341
## 3 Mansfield Park and 5438 160460 3 0.0339
## 4 Emma to 5239 160996 1 0.0325
## 5 Emma the 5201 160996 2 0.0323
## 6 Emma and 4896 160996 3 0.0304
## 7 Mansfield Park of 4778 160460 4 0.0298
## 8 Pride & Prejudice the 4331 122204 1 0.0354
## 9 Emma of 4291 160996 4 0.0267
## 10 Pride & Prejudice to 4162 122204 2 0.0341
## # ... with 40,369 more rows
Buradaki rank sütunu, frekans tablosundaki her kelimenin sıralamasını bize gösterir. Tablo zaten frekanslara göre sıralandı, row_number() ile kelimelerin sırasını bulmak için kullanabiliriz.
Zipf yasası genellikle x ekseni ve y ekseni üzerindeki terim sıklğı logaritmik ölçekler üzerinde grafik çizilerek görselleştirilir. Bu şekilde çizildiğinde, ters orantılı bir ilişki sabit, negatif bir eğime sahip olacaktır.
Jane Austen’in romanları için Zipf yasası
freq_by_rank %>%
ggplot(aes(rank, `term frequency`, color = book)) +
geom_line(size = 1.1, alpha = 0.8, show.legend = FALSE) +
scale_x_log10() +
scale_y_log10()
Yukarıdaki şekilde log-log koordinatlarında olduğuna dikkat etmeliyiz. Jane Austen’in romanlarının altı tanesinin birbirine benzediğini ve kelime sırası ile frekansı arasındaki ilişkinin negatif eğime sahip olduğunu görüyoruz. Güç yasası ile belli aralıkta nasıl olduğunu görelim.
rank_subset <- freq_by_rank %>%
filter(rank < 500,
rank > 10)
lm(log10(`term frequency`) ~ log10(rank), data = rank_subset)
##
## Call:
## lm(formula = log10(`term frequency`) ~ log10(rank), data = rank_subset)
##
## Coefficients:
## (Intercept) log10(rank)
## -0.6226 -1.1125
Aslında burada -1’e yakın bir eğime sahibiz.
Jane Austen’in romanlarıyla Zipf yasası için bir üs uydurma
freq_by_rank %>%
ggplot(aes(rank, `term frequency`, color = book)) +
geom_abline(intercept = -0.62, slope = -1.1, color = "gray50", linetype = 2) +
geom_line(size = 1.1, alpha = 0.8, show.legend = FALSE) +
scale_x_log10() +
scale_y_log10()
Jane Austen’in romanlarının korpusu için Zipf’in yasasının klasik versiyonuna yakın bir sonuç bulduk.
Bu tür analizler yazarları karşılaştırmak ya da diğer metin koleksiyonlarını karşılaştırmak için yapılabilir. bu analizler sadece düzenli veri ilkelerini kullanarak uygulanabilir.
3.3. bind_tf_idf() Fonksyionu
Tf-idf, yaygın olarak kullanılan kelimelerin ağırlığını azaltarak ve bir dökümanda ya da belgede çok fazla kullanılmayan kelimelerin ağırlığını artırarak, her bir belgenin içeriği için önemli kelimeleri bulmaya çalışır.
Jane Austen’in romanlarıyla tf-idf hesaplamaya çalışalım
word değişkeni terimleri, book değişkeni dökümanları ve son değişken n ise her bir kelimenin o belge içinde geçme sıklığını içerir. total değişkeni her bir kitaptaki(belgedeki) kelime sayısını içerir. Ancak bind_tf_idf() fonksiyonu için total değişkeni gerekli değildir. Sadece her belgede bulunan tüm kelimeleri veri setinde içermesi yeterlidir.
book_words <- book_words %>%
bind_tf_idf(word, book, n)
book_words
## # A tibble: 40,379 x 7
## book word n total tf idf tf_idf
## <fct> <chr> <int> <int> <dbl> <dbl> <dbl>
## 1 Mansfield Park the 6206 160460 0.0387 0 0
## 2 Mansfield Park to 5475 160460 0.0341 0 0
## 3 Mansfield Park and 5438 160460 0.0339 0 0
## 4 Emma to 5239 160996 0.0325 0 0
## 5 Emma the 5201 160996 0.0323 0 0
## 6 Emma and 4896 160996 0.0304 0 0
## 7 Mansfield Park of 4778 160460 0.0298 0 0
## 8 Pride & Prejudice the 4331 122204 0.0354 0 0
## 9 Emma of 4291 160996 0.0267 0 0
## 10 Pride & Prejudice to 4162 122204 0.0341 0 0
## # ... with 40,369 more rows
Bu son derece yaygın kelimeler için idf ve dolayısıyla tf-idf’in sıfır olduğuna dikkat etmemiz gerekiyor. Buradaki kelimeler Jane Austen’ın romanlarının altısında da görülen tüm kelimelerdir. Bu nedenle idf terimi sıfırdır.
Bir belge koleksiyonundaki belgelerin çoğunda ortaya çıkan kelimeler için ters belge(döküman) frekansı (inverse document frequency – idf) sıfıra yakın olacak şekilde çok düşük olur. Bu yaklaşım ortak kelimelerin ağırlığının nasıl azalttığıdır. Ters Belge Frekansı (idf), koleksiyondaki belgelerin daha azında ortaya çıkan kelimeler için daha yüksek bir sayı olacaktır.
Jane Austen’in eserlerindeki yüksek tf-idf değerlerine bakalım.
book_words %>%
select(-total) %>%
arrange(desc(tf_idf))
## # A tibble: 40,379 x 6
## book word n tf idf tf_idf
## <fct> <chr> <int> <dbl> <dbl> <dbl>
## 1 Sense & Sensibility elinor 623 0.00519 1.79 0.00931
## 2 Sense & Sensibility marianne 492 0.00410 1.79 0.00735
## 3 Mansfield Park crawford 493 0.00307 1.79 0.00551
## 4 Pride & Prejudice darcy 373 0.00305 1.79 0.00547
## 5 Persuasion elliot 254 0.00304 1.79 0.00544
## 6 Emma emma 786 0.00488 1.10 0.00536
## 7 Northanger Abbey tilney 196 0.00252 1.79 0.00452
## 8 Emma weston 389 0.00242 1.79 0.00433
## 9 Pride & Prejudice bennet 294 0.00241 1.79 0.00431
## 10 Persuasion wentworth 191 0.00228 1.79 0.00409
## # ... with 40,369 more rows
Burada tüm isimler, gerçekte bu romanda önemli olan isimleri görüyoruz. Bunların hiçbiri romanda yer alamaz ve Jane Austen’in romanlarının içindeki her metin için önemli, karakteristik kelimelerdir.
Bu yüksek tf-idf kelimelerinin görselleştirilmesi yani Jane Austen’in romanlarının her birindeki en yüksek tf-idf kelimeleri
book_words %>%
arrange(desc(tf_idf)) %>%
mutate(word = factor(word, levels = rev(unique(word)))) %>%
group_by(book) %>%
top_n(15) %>%
ungroup %>%
ggplot(aes(word, tf_idf, fill = book)) +
geom_col(show.legend = FALSE) +
labs(x = NULL, y = "tf-idf") +
facet_wrap(~book, ncol = 2, scales = "free") +
coord_flip()
## Selecting by tf_idf
Görsellerde tf-idf tarafından ölçülen her bir romanda isimler ön plana çıkmış. Jane Austen altı romanında benzer bir dil kullanmış ve kişieri ön plana çıkartmış.
3.4. Özet
Terim sıklığı ve ters belge frekansı kullanmak, belge koloksiyonlarındaki belgelerin içerisindeki karakteristik kelimeleri bulmamızı sağlar. Tidytext paketi, tf-idf’in düzenli veri ilkeleriyle tutarlı bir şekilde kullanılmasını ve bu sayede belge koleksiyonlarındaki belgeler içindeki farklı kelimelerin öneminin nasıl olduğunu gösterir.