Anasayfa / Uygulamalar / R / R ile Metin Madenciliği | Bölüm 3/6

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.

Hakkında Ekrem Bayar

GÖZ ATMAK İSTEYEBİLİRSİNİZ

R ile Sıralı Logit Modelleri

Herkese merhaba, bu yazıda sıralı logit modelleri ve bu modellerin tahmincileri üzerine bir uygulama yapacağız. …

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir