knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

Dalam modul ini Anda akan diajak untuk membuat pemodelan dan melakukan pengkategorian menggunakan model tersebut.

Anda mungkin sudah terbiasa membaca narasi teks, seperti artikel, cerita pendek, cuitan twitter, atau bahkan buku dan novel. Seringkali secara tidak sadar kita melakukan pengkategorian atas narasi-narasi yang dibaca, bukan? Bagaimana caranya melakukan pengkategorian tersebut dengan menggunakan mesin/komputer?

Dalam studi kasus ini kita akan melakukan pemodelan topic (topic modeling) untuk mengkategorikan topik dari buku cerita. Kita akan menggunakan beberapa paket untuk melakukan hal tersebut, diantaranya adalah tidytext dan topicmodels. Selain kedua paket tersebut aktifkanlah juga paket vroom, here, dplyr, dan ggplot2!

___
___
___
___
___
___

Pada subdirektori "data-raw" terdapat berkas bernama "sherlock.csv". Imporlah berkas tersebut menjadi obyek R bernama sherlock. Ya! Kita akan melakukan pengkategorian topik buku "The Adventures of Sherlock Holmes" karya Arthur Conan Doyle. Apakah Anda tertarik? Jangan lupa untuk melakukan inspeksi terhadap data sherlock tersebut.

sherlock <- vroom(here("data-raw", "___"))
___

Data sherlock tersebut berisi kolom "story" yang merupakan subcerita dari cerita keseluruhan dan kolom "text" yang merupakan naskah cerita pada setiap baris. Sekarang kita akan melakukan transformasi data untuk mencatat kata apa saja yang muncul untuk setiap subcerita. Jalankan chunk berikut dan simpanlah hasilnya sebagai obyek R bernama sherlock_tidy!

___ <- sherlock %>% 
  filter(!is.na(text)) %>% 
  group_by(story) %>%
  unnest_tokens(word, text) %>%
  ungroup() %>%
  anti_join(stop_words)

sherlock_tidy

Dapatkah Anda menjelaskan apa saja yang dilakukan pada setiap tahap transformasi data sherlock menjadi sherlock_tidy? Apa isi dari stop_words?

Anda dapat menghitung frekuensi penggunaan kata untuk setiap subcerita dengan menggunakan fungsi count(). Tambahkanlah argumen untuk mengurutkan frekuensi kata (n) dari paling tinggi hingga paling rendah!

sherlock_tidy %>% 
  count(story, word, ___)

Selanjutnya Anda dapat dapat mengetahui kata penting apa yang terdapat dapat suatu subcerita dengan menggunakan analisis Term Frequency - Inverse Document Frequency (tf-idf). Fungsi bind_tf_idf() dapat dimanfaatkan untuk melakukan hal tersebut. Simpanlah hasil keluaran fungsi tersebut dalam obyek bernama sherlock_tfidf dan cetaklah hasilnya pada layar!

___ <- sherlock_tidy %>% 
  count(story, word, sort = TRUE) %>% 
  bind_tf_idf(word, story, n)

sherlock_tfidf

sherlock_tfidf tersebut akan lebih mudah dicerna jika ditampilkan dalam bentuk grafik. Pada chunk berikut kita akan memvisualisasikan data tersebut dengan menampilkan 15 kata terpenting untuk sucerita "ADVENTURE I. A SCANDAL IN BOHEMIA"

sherlock_tfidf %>% 
  filter(story == "ADVENTURE I. A SCANDAL IN BOHEMIA") %>% 
  top_n(15, tf_idf) %>% 
  ggplot(aes(x = reorder(word, tf_idf), y = tf_idf)) +
  geom_col() +
  coord_flip() +
  labs(
    x = "",
    y = "tf-idf",
    title = "Kata terpenting pada cerita Sherlock Holmes",
    subtitle = "Subcerita 'Adventure I. A Scandal in Bohemia'"
  ) +
  theme_light()

Pilihlah dua subcerita lain dan buatlah grafik serupa!



Berdasarkan analisis tf-idf di atas kita dapat melihat bahwa masih banyak kata yang merupakan nama tokoh dalam cerita termasuk dalam kata penting. Apakah sebaiknya kita menghapus kata-kata tersebut terlebih dahulu sebelum melakukan pemodelan topik?

Sekarang kita akan mulai melakukan pemodelan topik. Adapun algoritma yang akan kita pergunakan adalah Latent Dirichlet allocation (LDA). LDA merupakan algoritma yang biasa digunakan dalam pemodelan topik. Untuk menjalankan algoritma LDA dari paket topicmodels, sherlock_tidy harus diubah menjadi obyek berjenis DocumentTermMatrix dengan cara sebagai berikut:

sherlock_dtm <- sherlock_tidy %>% 
  count(story, word) %>% 
  cast_dtm(story, word, n)

sherlock_dtm

Selanjutnya kita dapat mengimplementasikan algoritma LDA dengan menggunakan fungsi LDA(). Pada fungsi ini kita harus menentukan nilai k, yaitu jumlah kategori topik yang diinginkan. Sebagai contoh kita akan menggunakan nilai k = 5.

sherlock_lda <- LDA(sherlock_dtm, k = 5)

sherlock_lda

Bagaimanakah kategorisasi subcerita Sherlock Holmes dalam 5 topik yang telah kita buat pemodelannya tersebut? Kita dapat mengetahuinya dengan cara mengamati peluang suatu topik per dokumen yang dinyatakan sebagai nilai $gamma$. Fungsi tidy() dari paket broom dapat digunakan untuk melakukan hal tersebut. Perhatikan contoh di bawah ini:

sherlock_gamma <- sherlock_lda %>% 
  tidy(matrix = "gamma") %>% 
  rename(story = document) %>% 
  arrange(story, desc(gamma))

sherlock_gamma

Kesimpulan apa yang dapat Anda tarik berdasarkan sherlock_gamma di atas?

Anda juga dapat membuat visualisasi untuk sherlock_gamma seperti ditunjukan pada chunk di bawah. Silakan Anda berikan kostumisasi pada grafik tersebut!

sherlock_gamma %>% 
  ggplot(aes(x = rev(story), y = gamma, fill = factor(topic))) +
  geom_col() +
  coord_flip()

Agar dapat memahami makna dari setiap topik, Anda dapat menghimpun kata-kata apa saja yang menjadi kunci dalam suatu topik. Hal tersebut dapat dilakukan dengan cara mengekstrak probabilitas kata dalam suatu topik yang dinyatakan sebagai nilai $beta$. Dalam chunk berikut kita akan menggunakan fungsi tidy() dari paket broom untuk mengekstrak nilai $beta$ dan selanjutnya menampilkan 10 kata teratas dari setiap topik:

sherlock_beta <- sherlock_lda %>% 
  tidy(matrix = "beta") %>% 
  rename(word = term) %>% 
  arrange(topic, desc(beta))

sherlock_beta

sherlock_beta %>% 
  group_by(topic) %>% 
  top_n(10, beta)  

Dapatkah Anda membuat visualisasi untuk sherlock_beta? Buatlah visualisasi untuk setidaknya 3 topik! (Petunjuk: baris kode serupa dengan kode untuk membuat visualisasi sherlock_tfidf)




Berikan interpretasi Anda terhadap hasil-hasil yang telah Anda dapatkan di atas!

Selamat Anda telah menyelesaikan modul 6! Silakan jalankan "Ctrl + Shift + K" atau klik tombol "Knit" untuk membuat dokumen final.



vynspermadi/tidyds documentation built on Nov. 5, 2019, 12:06 p.m.