Text Mining Review Borobudur Temple using R

Dhea Laksmita Arsya Primananda
15 min readJan 15, 2021

Assalamu’alaikum wr.wb. teman-teman data enthusiastic……

Pada kesempatan ini saya akan melakukan analisis dari review pengunjung Candi Borobodur yang berada di Magelang berdasarkan website Tripadvisor menggunakan metode text mining. Nah, sebelum melakukan analisis saya akan menceritakan sedikit tentang Candi Borobudur ini. Mari simak artikel di bawah ini!!!!

Sejarah Singkat Candi Borobudur

Candi Borobudur merupakan salah satu candi budha terbesar di dunia dan ada di Indonesia yang letaknya di kota Magelang. Kadang kita suka lupa dengan ini ya. Di negara kita banyak peninggalan yang sifatnya luar biasa, namun malahan kita anggap biasa saja.

Sekarang, taman wisata Candi Borobudur menjadi tujuan tempat wisata favorit di Jawa tengah. Tak hanya sebagai tempat wisata, peninggalan bersejarah ini juga berfungsi kembali menjadi salah satu tempat keagamaan dan ziarah agama Budha di Indonesia. Nah sebelum kalian mengunjunginya, alangkah baiknya kita melihat dulu review atau ulasan dari para pengunjung yang sudah pernah kesana.

Jadi teman-teman udah pada tau kan yaa betapa luar biasanya Candi Borobudur ini. Di awal tadi disebutkan jika analisis ini menggunakan text mining. Apakah kalian mengetahui apa itu text mining? Kalau belum tau, ayo diikuti!!!

Apa itu text mining?

Dalam data science, kita sering mendengar istilah machine learning dan data visualization. Tapi sebenarnya, data science mencakup bidang yang jauh lebih luas. Banyak istilah-istilah teknologi yang termasuk dalam kategori “data science”. Salah satunya yang cenderung lebih jarang kita dengar adalah Text Mining atau dikenal juga dengan istilah text analytics.

Pada dasarnya, text mining merupakan teknologi artificial intelligence (AI) yang memungkinkan penggunanya untuk mengubah konten inti dari sebuah dokumen teks menjadi sebuah data kuantitatif secara cepat. Data kuantitatif tersebut nantinya akan dapat digunakan atau ditindaklanjutkan sesuai keinginan penggunanya.

Dengan bantuan teknologi text mining, proses tersebut dapat menjadi jauh lebih efisien dibandingkan proses manual, dan juga menarik informasi atau wawasan yang mungkin tidak bisa didapatkan secara manual. Informasi tersebut kemudian dapat diolah menjadi data terstruktur untuk dianalisa dan divisualisasikan. Intinya, penggunaan text mining dapat membantu kita untuk meningkatkan efisiensi analisis dokumen teks dengan memberikan kemampuan otomasi pada proses tersebut.

Text mining biasanya digunakan dalam:

  • Menganalisis sebuah survey dimana para peserta menuliskan komentarnya secara bebas.
  • Mengklasifikasi email sebagai spam, marketing, atau personal (contoh: Gmail).
  • Menganalisa klaim asuransi atau garansi, wawancara diagnostik, dan lain-lain.
  • Meneliti kompetitor dengan melakukan crawling dalam website merek.

Pada analisis ini, disini saya akan mengambil data dari Tripadvisor mengenai review pengunjung Candi Borobudur dan dapat diakses dari website https://www.tripadvisor.co.id seperti berikut:

Berikutnya dilakukan pencarian dan mengetikkan “Candi Borobudur” di kolom search, setelah itu melihat review para pengunjung sebagai berikut:

Selanjutnya, saya akan menganalisis dari kolom komentar yang sudah pernah berkunjung ke Candi Prambanan yang ada pada halaman website. Pada langkah ini kita menggunakan “SelectorGadget”. Selector gadget digunakan untuk mengetahui posisi letak kolom komentar dalam halaman html. Aplikasi tersebut dapat diunduh dan ditambahkan ke extension Chrome. Jika aplikasi tersebut telah ditambahkan, maka akan muncul ikon kaca pembesar pada kanan atas halaman Chrome yang artinya aplikasi tersebut telah ditambahkan.

Sebelum melakukan analisis, siapkan R terlebih dahulu dan install package yang akan digunakan dan mengaktifkan packages di bawah ini.

> install.packages("xml2")
> library(xml2)
> install.packages("rvest")
> library(rvest)

Maka hasilnya seperti berikut:

Setelah packages tersebut ter-install, selanjutnya memasukkan alamat dari halaman website Tripadvisor ke dalam RStudio, kemudian diberi nama “borobudur” untuk menampilkan data dengan menggunakan sintaks sebagai berikut:

> borobudur <- read_html(“https://www.tripadvisor.co.id/Attraction_Review-g790291-d320054-Reviews-Borobudur_Temple-Borobudur_Magelang_Temples_Central_Java.html")
> borobudur

Maka akan muncul hasilnya seperti gambar di bawah ini:

Berikutnya, kita akan mengambil data menggunakan “SelectorGadget” untuk melihat posisi kolom dari review pengunjung sebagai berikut:

Selanjutnya, memasukkan perintah kedalam R dengan menuliskan sintaks berikut:

 > review<-html_nodes(borobudur,”.cPQsENeY”)
> reviewtext<-html_text(review)
> reviewtext

Maka hasilnya akan muncul seperti gambar di bawah ini:

Selanjutnya melakukan lakukan data cleaning atau pembersihan data, seperti: huruf “\n” dan huruf lain yang tidak diperlukan. Lalu, disimpan ke dalam folder yang diinginkan dengan format csv sebagai berikut:

> reviewtextbaru<-gsub(“\n”,””,reviewtext)
> reviewtextbaru
> write.csv(reviewtextbaru,”C:/Users/Shendy/UAS BIML/reviewtextbaru.csv”)

Dapat dilihat untuk hasilnya akan tersimpan pada folder yang kita inginkan.

Kemudian kita membuka file menggunakan Microsoft Excel dan muncul tampilan sebagai berikut:

Dari gambar di atas bisa dilihat bahwa data sudah bersih, sehingga tidak diperlukan lagi data cleaning. Kemudian kita melakukan install beberapa packages tambahan yang digunakan untuk analisis berikutnya dengan menggunakan perintah “install.packages(package_name)”, lalu memanggilnya dengan menggunakan perintah library sebagai berikut:

> library(tm)
> library(SnowballC)
> library(wordcloud)
> library(RColorBrewer)
> library(stringr)

Apabila proses instalasi packages sudah selesai, maka langkah berikutnya yaitu membaca kembali dokumen yang terdapat di dalam folder. File input memiliki beberapa baris teks dan tidak ada kolom atau field (data tidak berbentuk tabel), jadi kita akan menggunakan fungsi readLines. Fungsi ini mengambil file atau URL sebagai input dan mengembalikan vektor yang berisi elemen sebanyak jumlah baris dalam file. Fungsi readLines hanya mengekstrak teks dari sumber inputnya dan mengembalikan setiap baris sebagai string karakter. Kemudian kita jalankan menggunakan sintaks seperti di bawah ini:

> dokumen <- readLines("C:/Users/Shendy/UAS BIML/reviewtextbaru.csv")
> dokumen

Maka hasilnya akan muncul seperti gambar di bawah ini:

Langkah selanjutnya, kita membuat vektor yang akan menjadi Corpus. Corpus adalah kumpulan dokumen teks yang menangkap penggunaan bahasa dalam bentuk tertulis atau lisan untuk dokumen diatas. Untuk membuatnya kita dapat menggunakan sintaks sebagai berikut:

> dokumen <- Corpus(VectorSource(dokumen))
> dokumen

Maka hasilnya akan muncul seperti gambar di bawah ini:

Berdasarkan output di atas, kumpulan dokumen teks yang terdapat di dalam vektor tersebut terdiri dari 10 data. Kemudian dilanjutkan analisis sebagai berikut:

> str(dokumen)

Maka hasilnya akan muncul seperti gambar di bawah ini:

Apabila perintah str(dokumen) tidak muncul seperti tampilan di atas, maka dapat menggunakan perintah dokumen <- Corpus(VectorSource(dokumen)) atau sama seperti pada sintaks sebelumnya, maka kita dapat mencobanya satu per satu. Misalkan dokumen pertama terlihat seperti di bawah ini:

> dokumen[[1]]

Maka hasilnya akan muncul seperti gambar di bawah ini:

Berikutnya, kita akan menghitung kemunculan setiap kata untuk mengidentifikasi topik yang sedang populer atau trending. Disini kita menggunakan fungsi DocumentTermMatrixdari package data teks, kemudian kita juga dapat membuat matriks dokumen dalam bentuk tabel yang berisi frekuensi kata dengan menggunakan sintaks seperti pada gambar berikut:

> dokumenDTM <- DocumentTermMatrix(dokumen,      control=list(wordLengths=c(2,inf))  
> dokumenDTM

Sehingga hasilnya akan seperti berikut:

Berdasarkan hasil yang diperoleh bahwa dari 10 dokumen terdapat 237 kata yang berbeda. Setelah itu kita mengubah objek dari matriks kata-kata dalam dokumen atau “dokumenDTM” ke dalam bentuk tipe data string menggunakan fungsi str() sebagai berikut:

> str(dokumenDTM)

Maka hasilnya akan muncul seperti gambar di bawah ini:

Dapat kita lihat pada output di atas bahwa objek sudah berubah menjadi bentuk karakter atau string. Selain itu, kita juga dapat melihat semua kata-kata yang ada dengan menggunakan sintaks sebagai berikut:

> dokumenDTM$dimnames$Terms

Kemudian muncul semua kata yang terdapat di dalam sebuah review sebagai berikut:

Berdasarkan output di atas berisikan informasi tentang seluruh kata di sebuah ulasan yang disajikan dalam bentuk matriks. Selanjutnya, kita akan mencoba untuk melihat seberapa sering atau frekuensi kemunculan sebuah kata sebanyak 3 kali dan 4 kali atau lebih yang terdapat di dalam matriks dengan menggunakan sintaks sebagai berikut:

> dokumenfreq<-findFreqTerms(dokumenDTM,3)
> dokumenfreq
> dokumenfreq<-findFreqTerms(dokumenDTM,4)
> dokumenfreq

Maka diperoleh hasil seperti di bawah ini:

Berdasarkan output di atas, pada perintah pertama menampilkan kata-kata yang memiliki frekuensi kemunculan sebanyak 3 kali. Sedangkan pada perintah kedua menampilkan kata-kata yang memiliki frekuensi kemunculan sebanyak 4 kali. Kemudian, kita membuat matriks dokumen dalam bentuk tabel yang berisi frekuensi kata dengan menggunakan sintaks seperti pada gambar berikut:

> dokkuDTM <- TermDocumentMatrix(dokumen)  
> dokkuDTM

Maka akan diperoleh matriks sebagai berikut:

> dokkuDTM
<<TermDocumentMatrix (terms: 219, documents: 10)>>
Non-/sparse entries: 262/1928
Sparsity : 88%
Maximal term length: 12
Weighting : term frequency (tf)

Kemudian, kita membuat data frame dari matriks dokumen yang berisi frekuensi kata sebelumnya dengan menggunakan sintaks seperti di bawah ini:

> em <- as.matrix(dokkuDTM)
> em

Maka diperoleh hasil seperti di bawah ini:

> em <- as.matrix(dokkuDTM)
> em
Docs
Terms 1 2 3 4 5 6 7 8 9 10
"1,""it 1 0 0 0 0 0 0 0 0 0
#genthonghomestay 1 0 0 0 0 0 0 0 0 0
(yia) 1 0 0 0 0 0 0 0 0 0
1,5 1 0 0 0 0 0 0 0 0 0
airport 1 0 0 0 0 0 0 0 0 0
best 1 0 0 0 0 0 0 0 0 0
borobudur 1 1 0 0 1 0 1 0 0 0
central 1 0 0 0 0 0 2 0 0 0
from 2 0 0 0 0 0 0 0 0 0
historical 1 0 0 0 0 0 0 0 0 0
hour 1 0 0 0 0 0 0 0 0 0
however 1 0 0 0 0 0 0 0 0 0
hrs 1 0 0 0 0 0 0 0 0 0
indonesia 1 0 0 0 0 0 0 0 0 0
java 1 0 0 0 0 0 0 0 0 0
located 1 0 0 0 0 0 0 0 0 0
magelang 1 0 0 0 0 0 0 0 0 0
motorbike 1 0 0 0 0 0 0 0 0 0
nearby 1 0 0 0 0 0 0 0 0 0
new 1 0 0 0 0 0 0 0 0 0
not 1 0 0 0 0 0 2 0 0 0
one 1 0 1 0 1 0 0 0 0 0
only 1 0 0 0 0 0 0 0 0 0
part 1 0 0 0 0 0 0 0 0 0
places 1 0 0 0 0 0 0 0 0 0
regency 1 0 0 0 0 0 0 0 0 0
so 1 0 0 0 0 0 0 0 0 0
stay 1 0 0 0 0 0 0 0 0 0
the 3 0 2 0 2 0 13 0 1 0
village 1 0 0 0 0 0 0 0 0 0
yogyakarta 1 0 0 0 0 0 0 0 0 0
"2,""we're 0 1 0 0 0 0 0 0 0 0
amazing 0 1 0 0 0 0 0 0 0 0
for 0 1 1 0 0 1 1 1 1 1
glad 0 1 0 0 0 0 0 0 0 0
more 0 1 0 0 0 0 0 0 0 0
review!read 0 1 0 0 0 0 0 0 0 0
temple 0 1 1 0 1 0 3 0 0 0
thank 0 1 0 0 0 1 0 0 0 1
that 0 1 0 0 0 0 4 0 0 0
trip 0 1 0 0 0 0 0 0 0 0
you 0 1 0 0 0 1 0 1 0 1
your 0 2 0 0 0 1 0 1 0 1
"3,""borobudur 0 0 1 0 0 0 0 0 0 0
about 0 0 1 0 0 0 0 0 0 0
ancient 0 0 1 0 0 0 0 0 0 0
and 0 0 1 0 1 0 7 1 1 1
been 0 0 1 0 0 0 0 0 0 0
biggest 0 0 1 0 0 0 0 0 1 0
buddhist 0 0 1 0 0 0 2 0 0 0
considered 0 0 1 0 0 0 0 0 0 0
here 0 0 1 0 0 0 0 0 0 0
it 0 0 1 0 0 0 0 0 0 0
monument 0 0 1 0 0 0 0 0 0 0
more 0 0 1 0 0 0 0 0 0 0
proud 0 0 1 0 1 0 0 0 0 0
seven 0 0 1 0 0 0 0 0 0 0
site 0 0 1 0 0 0 0 0 0 0
than 0 0 1 0 0 0 0 0 0 0
times 0 0 1 0 0 0 0 0 0 0
very 0 0 1 0 0 0 2 0 0 0
widely 0 0 1 0 0 0 0 0 0 0
wonders 0 0 1 0 0 0 0 0 0 0
world\u0092s 0 0 2 0 0 0 0 0 0 0
"4,""wonderful!""" 0 0 0 1 0 0 0 0 0 0
"5,""i 0 0 0 0 1 0 0 0 0 0
clean 0 0 0 0 1 0 0 0 0 0
government 0 0 0 0 1 0 0 0 0 0
have 0 0 0 0 1 0 1 0 0 0
high 0 0 0 0 1 0 0 0 0 0
maintain 0 0 0 0 1 0 0 0 0 0
must 0 0 0 0 1 0 1 0 0 0
visit!""" 0 0 0 0 1 0 0 0 0 0
wonders 0 0 0 0 1 0 0 0 0 0
world 0 0 0 0 1 0 0 0 0 0
"6,""yay! 0 0 0 0 0 1 0 0 0 0
revie 0 0 0 0 0 1 0 0 0 0
"7,""with 0 0 0 0 0 0 1 0 0 0
thank 0 0 0 0 0 0 1 0 0 0
(mound) 0 0 0 0 0 0 1 0 0 0
(roughly) 0 0 0 0 0 0 1 0 0 0
(six 0 0 0 0 0 0 1 0 0 0
2,672 0 0 0 0 0 0 1 0 0 0
504 0 0 0 0 0 0 1 0 0 0
525 0 0 0 0 0 0 1 0 0 0
9th 0 0 0 0 0 0 1 0 0 0
absolute 0 0 0 0 0 0 1 0 0 0
absolutely 0 0 0 0 0 0 1 0 0 0
all 0 0 0 0 0 0 1 0 0 0
also 0 0 0 0 0 0 1 0 0 0
animals 0 0 0 0 0 0 1 0 0 0
apparent 0 0 0 0 0 0 1 0 0 0
approached 0 0 0 0 0 0 1 0 0 0
are 0 0 0 0 0 0 1 0 0 0
assignments 0 0 0 0 0 0 1 0 0 0
aware 0 0 0 0 0 0 2 0 0 0
beautiful 0 0 0 0 0 0 1 0 0 0
became 0 0 0 0 0 0 4 0 0 0
brother 0 0 0 0 0 0 1 0 0 0
[ reached getOption("max.print") -- omitted 119 rows ]

Berikutnya, mengurutkan vektor dari yang terkecil hingga terbesar pada kolom yang terdiri dari kata dan nama baris untuk matriks menggunakan sintaks sebagai berikut:

> ve <- sort(rowSums(em),decreasing=TRUE)
> ve

Maka diperoleh hasil seperti di bawah ini:

> ve <- sort(rowSums(em),decreasing=TRUE)
> ve
the and for
21 12 7
temple that your
6 5 5
borobudur you became
4 4 4
were central not
4 3 3
one thank buddhist
3 3 3
very did this
3 3 3
was with from
3 3 2
yogyakarta. biggest proud
2 2 2
world have must
2 2 2
aware buddha indonesian
2 2 2
our site them
2 2 2
there top view
2 2 2
while "1,""it #genthonghomestay
2 1 1
(yia). 1,5 airport
1 1 1
best historical hour
1 1 1
however, hrs indonesia
1 1 1
java. located magelang
1 1 1
motorbike nearby new
1 1 1
only part places
1 1 1
regency so stay
1 1 1
village yogyakarta "2,""we're
1 1 1
amazing glad more"""
1 1 1
review! trip "3,""borobudur
1 1 1
about ancient been
1 1 1
considered here it
1 1 1
monument more seven
1 1 1
site than times
1 1 1
widely wonders "4,""wonderful!"""
1 1 1
"5,""i clean government
1 1 1
high maintain visit!
1 1 1
wonders world "6,""yay!
1 1 1
review "7,""with 'thank
1 1 1
(mound) (roughly) (six
1 1 1
2,672 504 525
1 1 1
9th absolute absolutely
1 1 1
all also animals
1 1 1
apparent approached are
1 1 1
assignments beautiful brother
1 1 1
can captivity century
1 1 1
challenging children circular
1 1 1
class climb communication
1 1 1
completely consists conversations
1 1 1
could darnedest decorated
1 1 1
dome dome. during
1 1 1
each elephants english
1 1 1
entrance/exit evident excursion
1 1 1
experience, explore grandeur
1 1 1
group had happy
1 1 1
help incline inside
1 1 1
itself jogja language
1 1 1
large largest leaving
1 1 1
limited list lot
1 1 1
much near nine
1 1 1
note other panels
1 1 1
peddlers people perforated
1 1 1
performance platforms popular
1 1 1
pushy relief ruin
1 1 1
school seated see
1 1 1
sit song square
1 1 1
stacked stair statues
1 1 1
statues stupa surrounded
1 1 1
temple their they
1 1 1
this three time
1 1 1
topped traditional treated
1 1 1
undertaking us visit
1 1 1
wanted well which
1 1 1
with world worth
1 1 1
you "8,""thank review
1 1 1
visit "9,""its better
1 1 1
budhist climbed exercize
1 1 1
good like pyramid
1 1 1
temple well would
1 1 1
"10,""yes! review visit
1 1 1

Setelah itu, kita ingin melihat 7 kata terbesar yang paling sering muncul dapat menggunakan sintaks seperti di bawah ini:

> de <- data.frame(word = names(ve),freq=ve) 
> head(de, 15)

Sehingga diperoleh output sebagai berikut:

> de <- data.frame(word = names(ve),freq=ve) 
> head(de, 15)
word freq
the the 21
and and 12
for for 7
temple temple 6
that that 5
your your 5
borobudur borobudur 4
you you 4
became became 4
were were 4
central central 3
not not 3
one one 3
thank thank 3
buddhist buddhist 3

Berikutnya, kita akan membuat awan kata atau word cloud. Awan kata merupakan salah satu cara paling populer untuk memvisualisasikan dan menganalisis data kualitatif. Awan kata adalah gambar yang terdiri dari kata kunci yang ditemukan dalam badan teks, dengan ukuran setiap kata menunjukkan frekuensinya dalam badan teks tersebut. Gunakan bingkai data frekuensi kata (tabel) yang dibuat sebelumnya untuk menghasilkan kata cloud. Untuk menghasilkan awan kata kita dapat menggunakan sintaks seperti di bawah ini:

> wordcloud(words = de$word, freq = de$freq, min.freq = 1,           
max.words=50, random.order=FALSE, rot.per=0.35,
colors=brewer.pal(8, "Dark2"))

Maka akan muncul awan kata pada gambar di bawah ini:

Berdasarkan gambar di atas ditampilkan semua kata-kata yang muncul pada review pengunjung Candi Borobudur yang ada dihalaman website. Kata cloud menunjukkan kata tambahan yang sering muncul dan mungkin menarik untuk dilakukan analisis lebih lanjut. Semakin besar ukuran huruf dari kata, maka semakin banyak review yang menggunakan kata tersebut. Selain itu, dapat memberikan lebih banyak konteks seputar kata-kata yang paling sering muncul dan membantu untuk mendapatkan pemahaman yang lebih baik tentang tema utama.

Selanjutnya, kita ingin diketahui asosiasi kata dari kata-kata yang sering muncul seperti “proud”, “temple”, dan “borobudur”. Korelasi adalah teknik statistik yang dapat menunjukkan apakah dan seberapa kuat pasangan variabel terkait. Teknik ini dapat digunakan secara efektif untuk menganalisis kata mana yang paling sering muncul terkait dengan kata yang paling sering muncul dalam respons survei, yang membantu untuk melihat konteks di sekitar kata-kata ini. Maka kita dapat menggunakan sintaks sebagai berikut:

> vee<-as.list(findAssocs(dokkudtm, terms =c("proud", "borobudur", "temple"),corlimit = c(0.15,0.15,0.15,0.15,0.15,0.15)))
> vee

Sehingga kita dapat melihat hasilnya seperti yang ditunjukkan pada gambar di bawah ini:

Berdasarkan gambar di atas ditunjukkan bahwa kata mana yang paling sering dikaitkan dengan tiga kata teratas dan nilai ambang batas atau corlimit sebesar 0.15 yang telah saya tetapkan. Dari gambar di atas dapat disimpulkan bahwa, misalnya kata “bangga” sangat berkorelasi dengan kata “borobudur” sebesar 0.67. Hal ini menunjukkan bahwa sebagian besar tanggapan mengatakan bahwa kata “bangga” dengan kata “borobudur” memiliki asosiasi atau keterkaitan yang erat, serta bisa juga diinterpretasikan dengan asosiasi kata yang lainnya.

Sekian dulu terkait gambaran tentang ulasan para pengunjung terhadap Candi Borobudur.

Terima kasih dan tetap semangat menjalankan aktivitasnya teman-teman.

Wassalamu’alaikum wr.wb.

Referensi:

[1] https://algorit.ma/blog/data-science/pengertian-text-mining-dan-nlp/

[2] https://www.red-gate.com/simple-talk/sql/bi/text-mining-and-sentiment-analysis-with-r/

[3] https://medium.com/@986110101/text-mining-using-r-28ada2abb883

--

--