Text cleaning menggunakan library TM

By | July 30, 2024
2,782 Views

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 Matrixhttps://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.

  1. To lower yaitu mengubah huruf besar menjadi kecil semuanya.
  2. Remove HTML, mention, hashtag, punctuantion, serta number
  3. Replace kata-kata slank / normalisasi kata/spelling
  4. Remove stopwords
  5. stemming yaitu mengubah kata ke bentuk dasarnya

Yuk kita coba saja Text cleaning menggunakan library TM

Dataset

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.

 

See also  Mengubah Data Berdasarkan Range Kategori

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')

 

See also  Pengertian dan Penjelasan Regresi Linear

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