Text cleaning menggunakan library TM – Artikel ini kelanjutan dari https://softscients.com/2021/02/21/text-preprocessing/ yang memisahkan function pre procesing tersendiri telah dibahas juga cara membuat Term Document Matrix – https://softscients.com/2021/02/16/membuat-document-term-matrix/ serta cara menghitung Term Frequency – Inverse Document Frequency – https://softscients.com/2021/06/05/cara-menghitung-term-frequency-dan-inverse-document-frequency/
Kesemuanya menggunakan library RtextTools yang merupakan turunan dari library TM, nah artikel yang ini akan lebih mendayagunakan library tm yang sebetulnya kita bisa custom, misalkan argument input menggunakan sebuah function sehingga menjadi lebih efisien kerjanya.
Library tm dari awalnya sangat mendukung bahasa inggris sehingga text cleaning menjadi lebih mudah bila text berupa bahasa inggris, namun demikian tidak perlu bingung, kita akan banyak membuat custom function yang akan digunakan pada tm_map() sehingga kita bisa secara full menggunakan library tm sebagai text cleaningnya. Berikut beberapa pre processing yang akan kita terapkan.
- To lower yaitu mengubah huruf besar menjadi kecil semuanya.
- Remove HTML, mention, hashtag, punctuantion, serta number
- Replace kata-kata slank / normalisasi kata/spelling
- Remove stopwords
- stemming yaitu mengubah kata ke bentuk dasarnya
Yuk kita coba saja Text cleaning menggunakan library TM
Dataset
Contents
Dataset yang kita gunakan https://github.com/rizalespe/Dataset-Sentimen-Analisis-Bahasa-Indonesia/blob/master/dataset_tweet_sentiment_opini_film.csv. Data tersebut agar lebih untuk diolah untuk text cleaning sebaiknya diubah kedalam format excel. Secara umum dataset tersebut cukup lengkap sebagai contoh operasi text cleaning pada data minning karena didalam text tersebut terdapat karakter seperti HTML, tag, URL, tanda baca, kata-kata singkatan. Adapun untuk mengubah kata kerja menjadi kata dasar atau disebut dengan proses stemming, kita butuh library Katadasar.
library(dplyr) library(tm) library(katadasaR) library(openxlsx) library(wordcloud) source('library.R')
source(‘library.R’) diabaikan terlebih dahulu itu berisi function yang custom, untuk membaca file excel menggunakan perintah berikut
file = 'dataset_tweet_sentiment_opini_film.csv' tweets = read.csv(file) dat = tweets$Text.Tweet
Untuk membedakan dengan banyak function, saya lebih suka menggunakan perintah berikut package::function
Corpus dan Pre Processing
Pre processing terdiri dari banyak langkah, salah satunya yaitu case folding untuk mengecilkan hurufkan semua, untungnya di R sudah tersedia function untuk mengecilkan huruf yaitu tolower(). Namun kita harus mengkonvert variabel diatas menjadi corpus (disebut dengan kumpulan teks) dengan perintah sebagai berikut.
dat_corpus <- tm::Corpus(VectorSource(dat)) #buat corpus
Isi dat yang belum sebagai berikut,
jelek filmnya... apalagi si ernest gak mutu bgt actingnya... film sampah film king arthur ini film paling jelek dari seluruh cerita king arthur @beexkuanlin sepanjang film gwa berkata kasar terus pada bapaknya ane ga suka fast and furious..menurutku kok jelek ya tu film @baekhyun36 kan gua ga tau film nya, lu bilang perang perangan/? perang"an disebut ama rp yaoi jadi ambigu :v tolong editingnya yg bagus ya. saya sering kecewa dgn film indonesia. ditunggu filmnya!! kecewa dgn salah satu aktornya yg ternyata pendukung penista agama. ah, saya harus bersabar utk tak menonton film ini. kecewa parah sama film the guys. dear @radityadika sorry to say this. banyak yg kecewa abis nonton film ini :( #themummy 2017 adalah film yang paling memgecewakan saya selama hidup. yah padahal sy udh berekspektasi tinggi dan suka bgt mesir kuno.
tolower / case folding
Gunakan function tm_map untuk sebagai passing argumen inputnya dengan sebuah function tolower() melalui function content_transformer
dat_casefolding <- tm::tm_map(dat_corpus, content_transformer(tolower)) #corpus di to lower openxlsx::write.xlsx(dat_casefolding$content,'output/1. dat casefolding.xlsx')
Remove HTML dan URL
Remove HTML sesuai dengan namanya yaitu untuk menghapus semua tag HTML seperti alamat link. function removeURL() akan dipanggil sebagai argument input pada tm_map().
dat_removeurl <- tm::tm_map(dat_casefolding,content_transformer(removeURL)) openxlsx::write.xlsx(dat_removeurl$content,'output/2. remove url.xlsx')
Remove mention
Remove mention juga wajib dilakukan untuk menghilangkan tanda @ di tweet melalui function berikut.
dat_removemention <- tm::tm_map(dat_removeurl,content_transformer(removeMention)) openxlsx::write.xlsx(dat_removemention$content,'output/3. remove mention.xlsx')
Remove hashtag
Dilanjutkan dengan remove hashtag untuk menghilangkan tanda #, kita buat sendiri functionnya sekaligus kita panggil.
dat_removehashtag <- tm::tm_map(dat_removemention,content_transformer(removeHashtag)) openxlsx::write.xlsx(dat_removehashtag$content,'output/4. remove hashtag.xlsx')
Remove Punctuation
Untuk remove Punctuation sudah ada koq bawaan dari library tm, jadi kita tinggal panggil saja.
dat_punctuation<-tm::tm_map(dat_removehashtag,content_transformer(removePunctuation)) openxlsx::write.xlsx(dat_punctuation$content,'output/5. remove punctuation.xlsx')
Remove Number
Untuk remove number pun demikian, sudah ada bawaan dari library tm, jadi tinggal panggil saja.
dat_nonumber<-tm::tm_map(dat_punctuation, content_transformer(removeNumbers)) openxlsx::write.xlsx(dat_nonumber$content,'output/6. remove number.xlsx')
Replace kata-kata slank / normalisasi kata/spelling
Untuk replace kata-kata slank/normalisasi kata/spelling, kita membutuhkan database khusus yang berisi 2 pasangan kata. Saya sudah siapkan dalam bentuk excel yang isinya sebagai berikut
spell words 7an tujuan @ di ababil abg labil abis habis acc accord ad ada adl adalah adlah adalah adlh adalah adoh aduh
Kita langsung load saja
spelling = read.xlsx('kamus/spelling.xlsx')
Kemudian kita terapin
#spelling hasil = unlist(lapply(dat_nonumber$content,function(x) changeSpelling(x,spelling))) dat_changeslang <- tm::Corpus(VectorSource(hasil)) #buat corpus openxlsx::write.xlsx(dat_changeslang$content,'output/7. change slank.xlsx')
Remove Stopword
Stopword adalah kata-kata yang sering berulang dan tidak mengandung arti dalam corpus mengingat kita menggunakan bahasa indonesia, maka kita perlu siapkan database stopword dengan format excel saja agar lebih mudah. Berikut contoh database stopword
text ada adalah adanya adapun agak agaknya agar akan akankah akhir akhiri akhirnya
Seperti biasa, kita loading saja menggunakan perintah berikut
stop_word_database = read.xlsx("kamus/stopword.xlsx")
#hapus stopwords dat_stopword <- tm::tm_map(dat_changeslang, removeWords, stop_word_database$text) ##untuk hapus space berlebih maka harus dibuat token dulu hasil_token <- tokenizers::tokenize_sentences(dat_stopword$content) ##kemudian dibuat corpus lagi dat_stopword <- tm::Corpus(VectorSource(hasil_token)) #buat corpus openxlsx::write.xlsx(dat_stopword$content,'output/8. stop words.xlsx')
Stemming
Mengubah kata menjadi kata dasarnya.
#stemming hasil = unlist(lapply(dat_stopword$content,function(x) stemming(x))) dat_stemming <- tm::Corpus(VectorSource(hasil)) #buat corpus openxlsx::write.xlsx(dat_stemming$content,'output/10. change stemmming.xlsx')
Berikut hasil akhir dari Text Cleaning menggunakan library TM
jelek film ernest mutu banget actingnya film sampah film king arthur film jelek cerita king arthur film gwa kasar bapak ane suka fast and furiousmenurutku jelek iya tuh film film bilang perang perang perang yaoi ambigu v tolong editingnya bagus iya kecewa film indonesia tunggu film kecewa salah aktor dukung nista agama ah sabar tonton film kecewa parah film teman-teman dear maaf to sayang this kecewa habis nonton film film memgecewakan hidup iya berekspektasi suka banget mesir kuno
Walaupun belum rapi2 sekali, cukup edit database kamus spelling dan stopword. Misalkan kata “bapaknya” karena tidak termasuk dalam kata stopword yaitu mengandung imbuhan “nya”, mari kita ubah urutanya yang semula remove stopword -> stemming menjadi stemming -> stopword
#stemming hasil = unlist(lapply(dat_changeslang$content,function(x) stemming(x))) dat_stemming <- tm::Corpus(VectorSource(hasil)) #buat corpus openxlsx::write.xlsx(dat_stemming$content,'output/8. change stemmming.xlsx') #hapus stopwords dat_stopword <- tm::tm_map(dat_stemming, removeWords, stop_word_database$text) ##untuk hapus space berlebih maka harus dibuat token dulu hasil_token <- tokenizers::tokenize_sentences(dat_stopword$content) ##kemudian dibuat corpus lagi dat_stopword <- tm::Corpus(VectorSource(hasil_token)) #buat corpus openxlsx::write.xlsx(dat_stopword$content,'output/9. stop words.xlsx')
Hasil akhir sebagai berikut
jelek film ernest mutu banget actingnya film sampah film king arthur film jelek cerita king arthur film gwa kasar ane suka fast and furiousmenurutku jelek iya tuh film film bilang perang perang perang yaoi ambigu v tolong editingnya bagus iya kecewa film indonesia tunggu film kecewa salah aktor nyata dukung nista agama ah sabar tonton film kecewa parah film teman-teman dear maaf to sayang this kecewa habis nonton film film memgecewakan hidup iya berekspektasi suka banget mesir kuno
Gunakah perintah berikut
dat_strip<-tm::tm_map(dat_stopword,content_transformer(stripWhitespace)) openxlsx::write.xlsx(dat_strip$content,'output/10. stripwhite.xlsx')
WordCloud
Setelah semuanya selesai, kita buat wordcloud sebagai berikut
dtm <- TermDocumentMatrix(dat_strip) em <- as.matrix(dtm) ve <- sort(rowSums(em),decreasing=TRUE) de <- data.frame(word = names(ve),freq=ve) wordcloud(words = de$word, freq = de$freq, min.freq = 1, max.words=200, random.order=FALSE, rot.per=0.15, colors=brewer.pal(8, "Set2"))
ggwordcloud
Kalian bisa menggunakan wordcloud dengan library ggworldcloud
library(ggwordcloud) library(ggplot2)
ref: https://cran.r-project.org/web/packages/ggwordcloud/vignettes/ggwordcloud.html
Cukup 100 record saja yang digunakan agar tidak berat RAM nya
de = de[1:100,] set.seed(42) ggplot( de, aes( label = word, size = freq, color = factor(sample.int(10, length(de$word), replace = TRUE)), #angle = 90 ) ) + geom_text_wordcloud_area() + scale_size_area(max_size = 24) + theme_minimal()
Library
Pada artikel diatas, dituliskan source(‘library.R’) dan spelling.xlsx serta stopword.xlsx bisa kalian peroleh disini