The Office ScriptThe Office adalah suatu acara TV series America pada tahun 1995 yang menceritakan kehidupan sehari-hari yang dialami oleh karyawan kantoran di Scranton, Pennsylvania. Acara ini sudah tayang hingga Season 9 dan memiliki peringkat 8.9/10 berdasarkan IMDb. Banyaknya orang yang tertarik terhadap serial televisi ini menyebabkan banyak orang yang tertarik untuk melakukan analisis terhadap script dialog dari series The Office. Oleh karena itu, pada kesempatan kali ini, pada artikel ini akan mencoba untuk melakukan analisis text generation pada script dialog series The Office menggunakan markov chain. Tujuan dari analisis ini adalah untuk mendapatkan suatu kalimat baru yang diperoleh dari data script The Office dengan menggunakan metode text generation markov chain.
Dataset yang akan digunakan adalah script The Office dari package schrute. Pada artikel ini, hanya akan menggunakan script pada Season 9 untuk seluruh episode yaitu Eps 01 - 06 dikarenakan banyaknya kata yang perlu dilakukan pre-processing dan akan menyebabkan waktu untuk memprosesnya. Oleh karena itu, akan dilakukan step filtering data hanya pada Season 9 saja.
Data yang digunakan The Office Season 9 Eps 01-06 sebanyak 1,495 data dengan penjelasan setiap kolom data sebagai berikut:
index: index barisseason: index seasonepisode: index episodeepisode_name: nama episodedirector: director dari episodewriter: script writer dari episodecharacter: karakter yang membacakan dialogtext: teks dialogtext_w_direction: teks dialog dari directorimdb_rating: IMDb rating untuk episodetotal_votes: total votes yang diberikan untuk episodeair_date: tanggal publikasi episodeTujuan dari artikel adalah membuat kalimat baru berdasarkan script dialog yang ada, oleh karena itu kita akan fokus pada kolom text yang berisi script dialognya. Sebelum mendapatkan text generation, kita perlu melakukan pre-processing pada kolom text. Pre-processing yang akan dilakukan pada script dialog ini diantaranya yaitu :
the_office_clean <- the_office %>%
mutate(text = tolower(text)) %>%
mutate(text = text %>%
str_replace(pattern = "--", " ") %>%
replace_contraction() %>%
str_remove_all(pattern = "[[:punct:]]") %>%
str_remove_all(pattern = "[0-9]") %>%
replace_white() %>%
str_replace_all(pattern = "[.]", replacement = " .") %>%
str_replace_all(pattern = "[!]", replacement = " !") %>%
str_replace_all(pattern = "[?]", replacement = " ?") %>%
str_replace_all(pattern = "[,]", replacement = " ,"))
# quick check text clean
head(the_office_clean, 10)Setelah selesai dalam melakukan text pre-processing, selanjutnya kita perlu mendapatkan setiap kata dari kalimat yang ada. Kita akan menggunakan strsplit() untuk menjadikan kalimat yang ada menjadi satu kata pada kolom text. Selanjutnya kita akan menggunakan fungsi unlist() untuk membuat setiap kata menjadi vector.
text_theoffice<- the_office_clean %>%
pull(text) %>%
strsplit(" ") %>%
unlist()
# quick check text
text_theoffice %>% head(10)## [1] "all" "right" "jim" "your" "quarterlies"
## [6] "look" "very" "good" "how" "are"
Setelah model markov chain sudah terbuat, langkah selanjutnya yaitu membuat fungsi untuk memprediksi teks yang akan muncul pada kata selanjutnya. Pada step ini, agar prediksi teks yang dihasilkan tidak hanya melihat satu kata terakhirnya, maka kita akan menggunakan 1-gram dan bigram agar prediksi kata yang dihasilkan mempertimbangkan 1 dan 2 kata terakhir sehingga kata yang akan dihasilkan atau kalimat yang akan diperoleh dari hasil text generation lebih masuk akal. (Psss…Selain itu dikarenakan komputasi yang cukup besar sehingga menggunakan 1-gram dan bigram)
onegram_theoffice<- the_office_clean %>%
pull(text) %>%
strsplit(" ") %>%
unlist()
# quick check text
onegram_theoffice %>% head(10)## [1] "all" "right" "jim" "your" "quarterlies"
## [6] "look" "very" "good" "how" "are"
bigram_theoffice <- the_office_clean %>%
unnest_tokens(bigram, text, token = "ngrams", n = 2) %>%
pull(bigram)
bigram_theoffice %>% head(10)## [1] "all right" "right jim" "jim your" "your quarterlies"
## [5] "quarterlies look" "look very" "very good" "good how"
## [9] "how are" "are things"
Kata yang kita butuhkan sudah siap untuk membuat text generation. Selanjutnya kita akan membuat model markov chain menggunakan markovchainFit() menggunakan vector kata sepagai input kata dan akan kita simpan pada object fit_theoffice untuk model yang menggunakan 1-gram dan fit_theoffice2 untuk model yang menggunakan bigram.
Berdasarkan kata yang diperoleh dari onegram_theoffice, kita dapat memvisualisasikan hubungan dari masing-masing kata tersebut menggunakan Markov Chain Network.
Karena banyak sekali kata yang ada, sehingga network dari masing-masing kata tidak terlihat, namun dari hubungan ini kita bisa menghasilkan prediksi kata yang bisa menjadi penghubung kata selanjutnya dari kata yang kita definisikan pertama kali.
Selanjutnya kita akan membuat fungsi yang nantinya akan digunakan untuk menemukan prediksi kata yang akan dihasilkan dari kata yang kita sebutkan diawal. Kita akan simpan fungsi untuk prediksi kata menggunakan 1-gram dalam objek predictive_text sedangkan untuk fungsi prediksi kata menggunakan bigram akan disimpan dalam objek predictive_text_bigram
# fungsi prediksi teks bigram
predictive_text_bigram <- function(text, num_word){
suggest <- fit_theoffice2$estimate[ tolower(text), ] %>%
sort(decreasing = T) %>%
head(num_word)
suggest <- suggest[ suggest > 0] %>%
names() %>%
str_extract(pattern = "\\s(.*)") %>%
str_remove("[ ]")
return(suggest)
}Model untuk menjalankan algoritma markov chain telah terbuat dan fungsi untuk mendapatkan prediksi kata juga sudah kita buat menggunakan 1-gram dan bigram. Oleh karena itu, pada tahap selanjutnya adalah membuat text generation dengan cara melakukan prediksi kata yang akan muncul dari kata yang sudah kita berikan.
Pertama kita akan coba menggunakan model 1-gram yang kita miliki. Kita akan menemukan prediksi kata yang diperoleh dari kata awal “you”.
## [1] "know" "are" "can" "have" "do" "want" "guys" "should"
## [9] "just" "think"
Selanjutnya kita akan coba buat 10 kalimat yang terbentuk dari prediksi kata diatas menggunakan fungsi text_generation dibawah ini.
text_generation <- function(text, num_text, end_num){
for (i in 1:end_num) {
set.seed(i)
markovchainSequence(n = num_text,
markovchain = fit_theoffice$estimate,
t0 = text, include.t0 = T) %>%
# joint words
paste(collapse = " ") %>%
# create proper sentence form
str_replace_all(pattern = " ,", replacement = ",") %>%
str_replace_all(pattern = " [.]", replacement = ".") %>%
str_replace_all(pattern = " [!]", replacement = "!") %>%
str_to_sentence() %>%
print()
}
}
text_generation("you", 15, 10)## [1] "You have you got big surprise where time go this is the cards get any heart"
## [1] "You are attracted to the beat me in some colored greens what you believe this is"
## [1] "You are fake uh well we could be fun everybody say for my decision that goes"
## [1] "You ok i can i uh who are usually hit a stall you know uh me"
## [1] "You are coming down into the check thoroughness is worse than you will be an office"
## [1] "You wanna be great um mostly watercolor a bit about the phones you know i take"
## [1] "You felt the workplace ok all i am against the earth grumbling all spilling over there"
## [1] "You need to how much easier in a young guatemalan guy for a workspace same thing"
## [1] "You are you are not get the prettiest girl around i think i have been with"
## [1] "You did not need somebody gets it is that that you cannot screw this morning uh"
Nah beberapa kalimat diatas adalah 10 kalimat baru yang terbentuk apabila kita menggunakan 1-gram tokenization. Beberapa kalimat mungkin ada yang masih rancu susunannya, hal ini dikarenakan dengan menggunakan 1-gram, markov-chain akan memperhatikan satu kata terakhir untuk memprediksi kata berikutnya yang akan muncul.
Selanjutnya dengan menggunakan model bigram, kita akan menemukan prediksi kata yang diperoleh dari kata awal “you will”.
Beberapa prediksi kata yang terbentuk cukup lebih sinkron dengan kata “you will” yang sudah didefinisikan diawal. Kita akan coba buat text generation dari kata “you will” menggunakan fungsi text_generation_bigram dimana banyak kata yang akan dimasukkan sebanyak 20 kata dan kita akan membuat 10 kalimat baru dari kata “you will”.
library(stringi)
text_generation_bigram <- function(text, first_terms, num_text, end_num){
for (i in 1:end_num) {
set.seed(i)
markovchainSequence(n = 10,
markovchain = fit_theoffice2$estimate,
t0 = text, include.t0 = T) %>%
stri_extract_last_words() %>%
# joint words
c(first_terms, .) %>%
paste(collapse = " ") %>%
# create proper sentence form
str_replace_all(pattern = " ,", replacement = ",") %>%
str_replace_all(pattern = " [.]", replacement = ".") %>%
str_replace_all(pattern = " [!]", replacement = "!") %>%
str_to_sentence() %>%
print()
}
}
text_generation_bigram("you will", "you", 20, 10)## [1] "You will not be gloomy here man we are gonna run us"
## [1] "You will not i did not use um oh where is that"
## [1] "You will not promise me that several times but you are assistant"
## [1] "You will know it is just it it is only twenty past"
## [1] "You will not come out sometime to go upstairs to the regional"
## [1] "You will know it is the best jan i deserve a raise"
## [1] "You will really let the temp agency daniqua sent me down to"
## [1] "You will give more than three dollars people out there and find"
## [1] "You will not be covered sound fair good i would have to"
## [1] "You will give more than three dollars a mile it is an"
Markov chain dapat digunakan sebagai salah satu metode untuk membuat text generation dengan melihat network setiap kata yang kita miliki. Markov chain akan berusaha memetakan setiap hubungan dari kata yang ada dan memberikan nilai peluang untuk hubungan antar katanya sehingga dapat diperoleh prediksi kata yang rasional ketika membuat text generation. Markov chain juga dapat memprediksi kata berdasarkan n-gram kata yang digunakan tergantung pre-process yang kita definisikan diawal. Semakin besar n-gram yang digunakan dan semakin banyak data (kata) yang ada, maka akan semakin membutuhkan waktu yang lama dan semakin berat komputasinya.