PENDEKATAN BERT
SKRIPSI
DWI FIMOZA
161401131
SKRIPSI
DWI FIMOZA
161401131
SKRIPSI
Saya mengakui bahwa skripsi ini adalah hasil karya saya sendiri, kecuali
beberapa kutipan dan ringkasan yang masing-masing telah disebutkan
sumbernya
Dwi Fimoza
161401131
Puji dan syukur penulis ucapkan ke hadirat Allah SWT, karena rahmat dan
kuasa-Nya, penulis dapat menyelesaikan penyusunan skripsi ini sebagai syarat
untuk memperoleh gelar Sarjana Komputer, pada Program Studi S-1 Ilmu
Komputer Fakultas Ilmu Komputer dan Teknologi Informasi Universitas
Sumatera Utara.
Last but not least, terima kasih kepada Dwi Fimoza yang akhirnya
mampu mengalahkan segala rasa takut dan cemas. Semoga Allah SWT
melimpahkan berkah kepada semua pihak yang telah memberikan bantuan,
Penulis
ABSTRACT
This study aims to analyze the sentiment in Indonesia Language towards the
Gundala movie reviews on YouTube. However, sentiment analysis on YouTube
comments are varying from positive, negative, and neutral comments which
requires some automation in terms of classifying comments based on the
polarity of sentiment. Sentiment analysis using traditional machine learning
algorithms such as Naïve Bayes, SVM, etc cannot understand the context of
comments in depth about the semantic of words because it only learns the given
patters such as the frequency of occurrence of words. We need a transfer
learning approach such as BERT (Bidirectional Encoder Representations from
Transformers) which produces a bidirectional language model. The dataset used
to do sentiment analysis goes through a pre-processing step which consists of
case folding, data cleaning, tokenization, stop words removal, stemming, and
normalization, using libraries from NLTK and Sastrawi. In this study, the
hyperparameters used were 10 epochs, learning rate of 2e-5, and a batch size
16. In sentiment analysis, we will be using a multilingual-cased-model
BERTBASE model and it was carried out with three experiments. During this
experiment, the accuracy gained in first experiment is 66%, while the second
experiment was 68%, and the third experiment was 66%. So, the average
accuracy obtained is 66,7%.
PENDAHULUAN
Saat ini industri film Indonesia sedang berkembang dengan sangat pesat.
Perkembangan ini ditunjukkan dengan data dari Pusat Pengembangan Film
Kemendikbud (Pusbang) yang menyebutkan bahwa jumlah film Indonesia tengah
menunjukkan tren pertumbuhan dalam lima tahun terakhir. Pada tahun 2018
terdapat 201 film Indonesia yang diproduksi oleh para seniman. Sedangkan pada
tahun 2014, hanya ada 109 film. Badan Ekonomi Kreatif mencatat jumlah penonton
film Indonesia pada tahun 2018 mencapai lebih dari tiga kali lipat pencapaian pada
tahun 2015, yaitu lebih dari 60 juta penonton. Lebih lanjut, Pusbang Film
Kemendikbud juga menyebutkan bahwa jumlah film Indonesia yang mencapai
penonton di atas 1 juta pun terus naik. Pada tahun 2018 saja terdapat 14 film yang
berhasil mencapai penonton di atas 1 juta. Data tersebut menunjukkan bahwa minat
masyarakat Indonesia terhadap film lokal semakin meningkat. Namun dengan
segala pencapaian tersebut, film Indonesia belum menjadi tuan rumah di negaranya
sendiri.
Permasalahan tersebut dapat terjadi karena berbagai hal, salah satunya adalah
anggapan bahwa film Indonesia tidak memiliki kualitas sebaik film asing.
Berdasarkan survei yang dilakukan pada tahun 2019 oleh IDN Times, sebuah
perusahaan media berita dan hiburan multiplatform, sebanyak 50,3% penonton
mengkritisi jalan cerita yang mudah untuk ditebak. Teknis dalam film seperti
sinematografi, scoring atau bahkan kecocokan peran dan pemain juga muncul
sebagai alasan sebanyak 27,4%. Alasan membosankan juga menjadi pertimbangan
sebesar 15% serta akting pemain yang tidak memuaskan muncul sebanyak 7,3%.
Berdasarkan latar belakang, maka pada penelitian yang akan dilakukan penulis
menggunakan metode deep learning dengan language model yaitu BERT atau
YouTube sebagai salah satu sosial media berbasis sharing video dapat
dimanfaatkan untuk analisis sentimen suatu produk atau jasa. Film Gundala yang
rilis di tahun 2019 merupakan salah satu film Indonesia yang banyak memperoleh
perhatian dari penonton. Untuk mengetahui komentar penonton tentang film
Gundala dapat dilihat di komentar pada YouTube yang memutar trailer film
tersebut. Namun, komentar pada YouTube bervariasi dari komentar positif, negatif,
maupun netral. Untuk itu dibutuhkan suatu otomatisasi dalam mengklasifikasikan
komentar berdasarkan polaritas sentimennya. Analisis sentimen dapat dilakukan
dengan metode algoritma machine learning tradisional seperti Naïve Bayes, SVM,
dan lain-lain. Namun, algoritma tersebut tidak dapat memahami tentang semantik
kata yang ada karena hanya mempelajari pola-pola yang diberikan. Untuk mencapai
hasil yang lebih baik, maka dibutuhkan sebuah pendekatan transfer learning seperti
BERT (Bidirectional Encoder Representations from Transformers). Berdasarkan
hal ini maka dilakukan penelitian ini membahas analisis sentimen terhadap
komentar dalam Bahasa Indonesia pada film Gundala yang diperoleh dari kolom
komentar YouTube dengan BERT.
1. Data diperoleh dari komentar pada video YouTube trailer film bergenre action
dan Sci-Fi yaitu Gundala dengan jumlah komentar sekitar 10.000 komentar
dengan rentang waktu 20 Juli 2019 – 12 Agustus 2020.
2. Data hanya menggunakan bahasa Indonesia.
3. Hanya membagi opini ke dalam 3 jenis klasifikasi yaitu negatif, netral, dan
positif.
4. Jumlah annotator yang melakukan labelisasi adalah 5 orang.
5. Tidak memisahkan data yang dibuat oleh robot ataupun haters.
6. Ukuran model BERT yang digunakan adalah BERTBASE.
Tujuan penelitian adalah mendapatkan penilaian dari opini para pengguna sosial
media YouTube mengenai film Indonesia berjudul “Gundala” dengan
menggunakan BERT (Bidirectional Encoder Representations from Transformers)
1. Studi Pustaka
Pada tahap ini, dilakukan pengumpulan berbagai referensi dan sumber-sumber
ilmu seperti jurnal, artikel, buku, makalah, paper, situs-situs internet dan
seterusnya mengenai sentiment analysis, deep learning, BERT, dan lain-lain.
2. Identifikasi Masalah
Pada tahap ini, dilakukan identifikasi masalah pada analisis sentimen. Masalah
yang akan diidentifikasi adalah sebuah film Indonesia dengan genre Sci-Fi
dengan judul Gundala.
3. Analisis Sistem
Pada tahap ini, dilakukan pengumpulan data dengan menggunakan web
scraping dari YouTube.
4. Perancangan dan Implementasi Sistem
Pada tahap ini, dilakukan perancangan sesuai dengan hasil dari analisis sistem
dan melakukan implementasi dari hasil analisis dan perancangan yang telah
dibuat.
Sistematika penulisan dari skripsi ini terdiri dari lima bagian utama untuk diketahui
yaitu sebagai berikut:
BAB 1: Pendahuluan
Bab ini berisi tahapan awal penelitian yaitu dimulai dari latar belakang rumusan
masalah, batasan masalah, tujuan penelitian, dan manfaat penelitian, metodologi
penelitian, dan sistematika penulisan.
Bab ini berisi teori-teori yang berkaitan dengan permasalahan yang dibahas dalam
penelitian ini yaitu teori Perfilman, Natural Language Processing, Analisis
Sentimen, Machine Learning, Neural Network, Deep Learning, BERT
(Bidirectional Encoder Representations from Transformers).
Bab ini berisi tentang analisis sentimen terhadap film Indonesia berjudul “Gundala”
pada YouTube dengan menggunakan model Bahasa BERT untuk
mengklasifikasikan sentimen menjadi tiga kategori yaitu negatif, netral, dan positif.
Analisis sistem yang meliputi analisis masalah dan analisis kebutuhan dalam
arsitektur umum sistem dan perancangan sistem.
Bab ini menjelaskan tentang hasil penelitian yang telah dilakukan dan penjelasan
implementasi sistem berdasarkan analisis masalah dan kebutuhan sistem, skenario
pengujian terhadap sistem yang telah dibangun dan pembahasan hasil pengujian
sistem.
Bab ini berisi tentang kesimpulan dari keseluruhan hasil penelitian beserta saran-
saran yang diajukan dan diharapkan dapat dikembangkan untuk penelitian
selanjutnya.
LANDASAN TEORI
2.1 Perfilman
Menurut Kamus Besar Bahasa Indonesia, perfilman adalah pokok (hal) yang
bersangkutan dengan film. Film sendiri memiliki definisi sebuah lakon (cerita)
gambar hidup. Berdasarkan Undang-Undang Nomor 33 Tahun 2009 tentang
Perfilman, film sebagai media komunikasi massa merupakan saran pencerdasan
kehidupan bangsa, pengembangan potensi diri, pembinaan akhlak mulia, pemajuan
kesejahteraan masyarakat, serta wahana promosi Indonesia di dunia Internasional
sehingga film dan perfilman Indonesia perlu dikembangkan dan dilindungi.
Pada perkembangannya, kualitas film Indonesia mulai diakui oleh tak hanya
bangsa Indonesia tetapi juga dunia. Salah satunya adalah film Gundala. Gundala
adalah karakter superhero yang diciptakan oleh Harya Suraminata pada tahun 1969.
Pada tahun 2019, film Gundala pun dirilis dengan Joko Anwar sebagai sutradara.
Sebagai film science-fiction, film ini memiliki popularitas yang besar. Ketika
trailer dan teaser resminya diunggah di YouTube, Gundala berhasil menjadi salah
satu video yang trending saat itu. Selain itu, film ini juga berhasil menembus jumlah
penonton sebanyak satu juta hanya dalam 7 hari saja, dengan jumlah penonton akhir
yaitu 1.699.433 juta penonton. Pada Festival Film Indonesia 2019, Gundala juga
mendapatkan 9 nominasi dan berhasil pula memenangkan beberapa kategori seperti
kategori Penata Suara Terbaik, Pengarah Sinematografi Terbaik, dan Penata Efek
Visual Terbaik (Herfianto, 2020).
Natural Language Processing atau Pengolahan Bahasa Alami adalah salah satu
cabang ilmu Kecerdasan Buatan yang mempelajari dan mengembangkan
bagaimana komputer dapat mengerti, memahami, dan memproses bahasa alami
dalam bentuk teks atau tuturan kata. NLP menganalisa bahasa manusia sedemikian
rupa sehingga komputer dapat memahami bahasa alami seperti halnya manusia
(Ghosh et al., 2012). NLP adalah salah satu bidang antar disiplin yang
menggabungkan komputasi linguistik, ilmu komputasi, ilmu kognitif, dan
kecerdasan buatan. Pada umumnya, NLP banyak diaplikasikan di berbagai hal
seperti speech recognition, pemahaman bahasa lisan, sistem dialog, analisis
leksikal, mesin penerjemah, knowledge graph, analisis sentimen, sistem pintar dan
peringkasan bahasa alami.
Sebuah sistem NLP dapat dimulai dari tingkat kata untuk menentukan struktur
dan sifat morfologis (seperti part-of-speech atau makna) dari kata; kemudian dapat
beralih ke tingkat kalimat untuk menentukan urutan kata, tata bahasa, dan arti dari
seluruh kalimat. Kemudian ke konteks dan keseluruhan domain. Kata atau kalimat
yang diberikan mungkin memiliki makna atau konotasi yang berbeda dalam
konteks tertentu, yang terkait dengan banyak kata atau kalimat lain dalam konteks
yang diberikan.
Machine learning atau pembelajaran mesin adalah salah satu bidang ilmu di
Kecerdasan Buatan. Machine learning, sesuai dengan namanya, bertujuan untuk
membuat mesin dilatih dengan banyak contoh atau dataset yang berhubungan
dengan tugas yang dibutuhkan. Mesin mempelajari pola-pola yang diberikan
berdasarkan dataset dan menghasilkan sebuah rule sendiri. Sehingga ketika suatu
data dimasukkan ke dalam mesin, mesin sudah dapat mengenali data tersebut.
Secara umum, machine learning terbagi menjadi empat kategori besar yaitu
supervised learning, unsupervised learning, self-supervised learning, dan
reinforcement learning (Chollet, 2018). Supervised learning adalah pendekatan
yang paling sering digunakan. Supervised learning membuat mesin belajar dari
dataset yang sudah diberi label atau anotasi. Sedangkan unsupervised learning
merupakan kebalikannya, dengan memberikan dataset yang tidak diberi label. Self-
supervised learning adalah sebuah supervised learning tetapi tanpa dataset yang
dilabeli oleh annotator. Dataset yang digunakan tetap menggunakan label akan
tetapi label diperoleh dari input data yang menggunakan algoritma heuristic
Neural Network atau jaringan syaraf tiruan adalah salah satu teknik machine
learning yang populer dengan mensimulasikan mekanisme pembelajaran yang
terinspirasi dari bagaimana cara sistem syaraf manusia atau makhluk biologis
lainnya. Sistem saraf terdiri dari sel yang disebut dengan neuron. Neuron-neuron
tersebut saling terhubung dengan satu sama lain menggunakan axon dan dendrites.
Sinapsis adalah penghubung antara axon dan dendrites (Aggarwal, 2018).
Secara umum terdapat dua jenis arsitektur neural network, yaitu feed-forward
network dan recurrent/recursive network.
Setiap layer diikuti dengan sebuah activation function, sebuah fungsi matematis
yang digunakan untuk memetakan output dari satu layer ke input dari layer
selanjutnya. Salah satu activation function adalah softmax function. Softmax
activation function memastikan bahwa jumlah dari vector output adalah tepat 1.
Output node dengan probabilitas tertinggi kemudian dipilih sebagai label prediksi
untuk kalimat yang menjadi input (Munikar et al., 2019). Activation function ini
cocok untuk jaringan yang membutuhkan output dengan label yang sudah
ditentukan. Misalkan pada sebuah network yang dilatih untuk mengidentifikasi
kucing dan tikus. Jika suatu input untuk identifikasi kucing memiliki output vector
0.65, jaringan melihat kucing dengan kepastian sebesar 65%. Softmax hanya
berfungsi jika terdapat satu jawaban saja (Osinga, 2018). Output node dengan
𝑒 𝑧𝑖
𝑠𝑜𝑓𝑡𝑚𝑎𝑥(𝑧)𝑖 = ∑𝐾
𝑧𝑗 ………………………………………………………(2.1)
𝑗=1 𝑒
Dengan 𝑖 = 1, . . ., 𝐾 di mana:
Saat proses training dilakukan, jaringan akan menampilkan loss. Jika nilai loss
ini tidak menurun setelah beberapa iterasi, hal itu menandakan jaringan tidak
mempelajari apapun dari proses yang sudah dilewati. Oleh karena itu, dibutuhkan
sebuah loss function untuk mengatur output dari neural network agar sesuai dengan
apa yang diinginkan (optimisasi). Loss function mengambil prediksi yang diberikan
oleh neural network dan target (apa yang ingin dihasilkan oleh jaringan) dan
menghitung distance score, sehingga dapat memperoleh seberapa baik jaringan
(Chollet, 2018). Hasil dari loss function kemudian digunakan sebagai sinyal
feedback untuk mengatur nilai weights sedikit sehingga dapat mengurangi loss
score. Cross-entropy loss adalah salah satu loss function yang umumnya digunakan
pada neural network dan pada umumnya sering dipasangkan dengan softmax
(Aggarwal, 2018). Loss function ini merupakan hasil perhitungan antara dua
distribusi probabilitas untuk variabel acak yang diberikan. Cross-entropy loss
menghitung kemampuan model klasifikasi yang memberi output probabilitas
dengan nilai di antara 0 sampai 1. Loss function ini cocok digunakan ketika output
yang diberikan berupa probabilitas (Chollet, 2018).
di mana:
Salah satu algoritma optimasi yang sering digunakan adalah Adam. Adam atau
Adaptive Moment Estimation Algorithm (Kingma & Ba, 2015) menghitung estimasi
momen dan menggunakannya untuk mengoptimasi fungsi. Adam merupakan
kombinasi dari dua algoritma yaitu AdaGrad dan RMSProp. AdaGrad akan
mempertahankan learning rate per parameter yang meningkatkan performa pada
masalah dengan gradien yang renggan dan RMSProp juga mempertahankan
learning rate per parameter yang diadaptasi berdasarkan rata-rata besaran gradien
untuk weight (seberapa cepat berubah). Algoritma ini akan menghitung rata-rata
eksponensial weighted bergerak kemudian mengkuadratkan gradien yang dihitung.
Alih-alih mengadaptasi learning rate parameter berdasarkan rata-rata momen
pertama seperti di RMS Prop, Adam juga menggunakan rata-rata momen kedua.
Dengan menggunakan model dan dataset yang besar, Adam dapat secara efektif
menyelesaikan masalah-masalah deep learning praktikal (Kingma & Ba, 2015).
Hal ini membuat Adam optimizer menjadi metode yang efisien secara komputasi,
membutuhkan sedikit memori, tidak berbeda dengan gradien dengan skala
diagonal, cocok untuk masalah yang menggunakan data dan/atau parameter yang
besar (Kingma & Ba, 2015).
a. Encoder
Encoder berfungsi untuk membaca seluruh input teks sekaligus. Encoder
terdiri dari stack (tumpukan) dari N = 6 layers yang identik. Setiap layer
memiliki dua sub-layer yaitu self-attention layer dan feed-forward neural
network. Dengan self-attention layer, encoder dapat membantu node untuk
tidak hanya fokus kepada kata yang sedang dilihat tetapi juga untuk
mendapatkan konteks semantik dari kata tersebut. Setiap posisi di encoder
dapat menangani semua posisi di layer sebelumnya di encoder.
b. Decoder
Decoder berfungsi untuk menghasikan urutan output yang berupa prediksi.
Decoder juga terdiri dari stack (tumpukan) dari N = 6 layers yang identif.
Setiap layer terdiri dari dua sub-layer seperti yang ada pada encoder, dengan
tambahan attention layer di antara dua layers tersebut untuk membantu node
saat ini mendapatkan key content yang membutuhkan attention (Vaswani
et al., 2017) dengan melakukan multi-head attention pada output dari
encoder. Sama dengan di encoder, self-attention layer di decoder membuat
setiap posisi di decoder dapat menangani semua posisi sebelumnya dan
posisi saat itu.
1. Setiap input kata yang memasuki encoder diubah menjadi sebuah list vector
menggunakan embeddings. Karena self-attention layer tidak membedakan
urutan kata-kata pada sebuah kalimat, positional encoding ditambahkan untuk
menunjukkan posisi dari tiap kata. Tiap vektor dari input kata memiliki ukuran
512. Proses ini hanya terjadi di encoder yang berada paling bawah, sehingga
encoder lainnya akan menerima output dari encoder yang pertama.
2. Input vektor melewati dua layer yang ada pada tiap encoder yaitu self-attention
layer dan feed-forward neural network. Pada self-attention layer dibuat tiga
vektor dari masing-masing input vektor yaitu Query, Key, dan Value vector.
Ketiga vektor ini dibuat dengan mengalikan embedding. Dimensi dari tiap
vektor adalah 64. Setelah itu, nilai self-attention dari tiap kata dihitung dengan
mengalikan query vector dan key vector seperti yang ada pada Gambar 2.4.
Sebagai representasi input pada BERT, terdapat tiga embedding layers yaitu:
1. Token embeddings adalah layer pertama yang token masuki, yaitu
representasi vektor dari tiap token. Setiap token dalam input akan dipetakan
ke representasi vektor berdimensi tinggi dari token yang diberikan. Tiap
token diganti menjadi id yang didapatkan berdasarkan vocabulary.
Untuk melatih sebuah model bahasa, classifier perlu dilatih dengan sedikit
perubahan pada model BERT selama fase pelatihan (training) yang disebut fine-
tuning. Seperti yang dipaparkan oleh Devlin dan rekan-rekannya, terdapat
rekomendasi hyperparameters yang dapat di-fine-tuning untuk mencapai hasil yang
maksimal. Fine-tuning sangat mudah dilakukan karena mekanisme self-attention di
Transformer membuat BERT bisa membuat model untuk berbagai tugas, baik pada
kalimat tunggal (single sentence) atau kalimat berpasangan, dengan menukar
masukan dan keluaran yang sesuai.
Bab ini akan membahas tentang analisis dan perancangan sistem yang
digunakan dalam proses analisis sentimen terhadap film Indonesia dengan metode
aspect-based dan Bidirectional Encoder Representations from Transformers.
Metode yang diajukan dalam analisis sentimen terhadap film Indonesia dengan
metode Bidirectional Encoder Representations from Transformers terdiri dari
beberapa langkah seperti yang tertera pada Gambar 3.1.
3.2 Scraping
Penelitian ini menggunakan data yang diperoleh dari YouTube yang diambil dari
komentar-komentar yang diberikan pengguna di video dengan judul Official Trailer
GUNDALA (2019) yang diunggah pada 20 Juli 2019 pada akun resmi perusahaan
produksinya yaitu Screenplay Films. Video tersebut dipilih karena merupakan
video yang memilih jumlah penayangan dan komentar yang paling banyak.
Scraping dilakukan dengan menggunakan Chrome Driver yang disediakan library
Selenium. ChromeDriver berfungsi untuk mencari elemen yang menunjukkan
komentar pada YouTube. Elemen yang dicari menggunakan XPATH. Dataset
kemudian disimpan lalu melalui proses sentence splitting untuk memisahkan data
dalam teks menjadi per kalimat. Kalimat dipisah menggunakan salah satu fungsi
pada nltk, yaitu sent_tokenize. Sentence splitting dilakukan karena seringkali pada
suatu komentar terdapat lebih dari dua kalimat dan memiliki sentimen yang berbeda
pula. Dataset yang sudah melalui proses tersebut kemudian disimpan dalam bentuk
excel worksheet (.xlsx).
Komentar Sentimen
Ini film paling keren yang pernah kutonton setelah the raid 2
Keren abis neh harus nonton ini ni 2
Cuma saran superhero biasanya badannya kekar2... ga kurus2 0
NO coment .. krn blm lht film nya 1
alur ceritanya gak jelas... 0
Jadi tidak sabar untuk melihat sekuel dari Gundala 👍👍. 2
Gatau lagi udh berapa kali gw nonton ini trailer, semoga menjadi 2
langkah awal untuk kesuksesan industri film Indonesia BCU
universe
Pada penelitian ini, preprocessing dilakukan untuk mengubah dataset yang tidak
terstruktur menjadi terstruktur sehingga mempermudah data untuk diproses dengan
melakukan beberapa tahapan yaitu case folding, data cleaning, tokenisasi,
stopwords removal, stemming, dan normalisasi Bahasa tidak baku. Selain itu,
Pada tahap ini, kalimat-kalimat pada dataset dibersihkan dari segala sesuatu yang
dapat mempengaruhi hasil dari analisis seperti kata dengan karakter yang berulang
dua atau lebih, link, username (@username), hashtag (#), angka, simbol-simbol,
spasi berlebih, tanda baca, dan angka. Untuk melakukan data cleaning, penulis
menggunakan regular expression untuk dicocokkan dengan yang akan dihapus.
Contoh tahap data cleaning dapat dilihat pada Tabel 3.3.
Stopwords Tala
1
https://github.com/masdevid/ID-Stopwords
3.4.5 Stemming
Stemming adalah proses yang dilakukan untuk mengubah kata yang memiliki
imbuhan menjadi kata dasarnya (root form) dengan menghapus imbuhan seperti
prefiks, sufiks, dan konfiks. Pada tahap ini, stemming dilakukan dengan
menggunakan library Sastrawi. Contoh tahap stemming yang dapat dilihat pada
Tabel 3.7.
2
https://github.com/nasalsabila/kamus-alay
3
https://github.com/huggingface/transformers
Pada penelitian ini, model yang digunakan adalah multilingual yang berarti data
terdiri dari 100 bahasa dengan menggunakan dataset dari Wikipedia. Model bert-
multilingual-base-cased sendiri memiliki sebanyak 119.547 kata. Vocabulary
tersebut terdiri dari empat hal, yaitu:
1. Seluruh kata
2. Sub kata yang muncul di depan kata atau terpisah, seperti karakter “em” pada
“embeddings” diberi vektor yang sama dengan karakter “em” yang ada pada
“go get em”
3. Sub kata yang tidak berada di depan kata, yang diawali dengan ##.
4. Karakter individual seperti ‘a’, ‘b’, ‘c’, dan seterusnya.
BERT menerima panjang yang tetap dan sama untuk setiap inputnya. BERT
telah menentukan panjang urutan kalimat maksimumnya, yaitu 512 karena encoder
pada Transformer hanya menghasilkan output dengan dimensi 512 saja. Jika
panjang kalimat lebih dari panjang maksimum yang telah ditentukan, kalimat akan
1. Setiap kalimat ditokenisasi menjadi per kata atau sub kata menggunakan
WordPiece. Untuk melakukan tokenisasi pada sebuah kata, tokenizer akan
memeriksa apakah tiap kata pada kalimat terdapat pada vocabulary. Jika tidak
ada, tokenizer akan memecah kata menjadi sub-sub kata yang kemungkinan
kemunculannya pada vocabulary paling besar. Jika tokenizer juga tidak
menemukan sub kata pada vocabulary, kata tersebut dipecah menjadi per
karakternya. Akan tetapi, jika semua kata diubah menjadi sub kata atau
karakter individual, akan terjadi overload. Kata-kata yang tidak ada pada
vocabulary akan diganti dengan token [UNK] atau unknown. Namun jika
semua kata diubah menjadi token tersebut, banyak informasi yang akan
hilang. Oleh karena itu, kata-kata dapat dipecah menjadi sub kata dengan
simbol ##. BERT melakukan ini karena dua hal yaitu pertama untuk
mempercepat processing dan mengurangi jumlah parameters yang harus
dilatih, dan kedua untuk mengatasi masalah out-of-vocabulary.
Gambar 3.2 menunjukkan tahap pertama sebuah kalimat diubah menjadi
sebuah token-token kata dan sub kata. Misalkan kalimat input-nya adalah
“Film fiksi yang mendidik”. Saat dilakukan pengecekan, ternyata kata “fiksi”
dan “mendidik” tidak ada pada vocabulary. Sehingga, kata “fiksi” dipecah
menjadi sub kata yaitu “fik” dan “##si” di mana token pertama lebih sering
muncul (prefiks) pada vocabulary sedangkan token kedua diawali dengan ##
untuk menunjukkan bahwa token tersebut adalah sufiks yang mengikuti sub
kata lainnya. Hal tersebut juga terjadi pada kata “mendidik” yang dipecah
menjadi “men”, “##did”, dan “##ik”.
Untuk memastikan apakah hasil prediksi dari tiap probabilitas adalah 1, maka
semua probabilitas dijumlahkan.
Berdasarkan Tabel 3.11, dapat dilihat bahwa terdapat kalimat “Film ini bagus”.
Kemudian dengan proses tokenisasi yang ada pada BERT, kalimat tersebut
ditokenisasi menggunakan WordPiece. Jika kata tidak terdapat pada vocabulary
atau Out-of-Vocabulary (OOV), kata akan dipisah menjadi sub kata (sub words).
Misalkan pada kata “bagus” tidak terdapat pada vocabulary, sehingga kata “bagus”
dipisah menjadi sub kata yaitu “bag” dan “##us”. Tanda pagar (#) pada awal kata
menunjukkan bahwa sub kata “##us” adalah bagian dari kata sebelumnya yaitu
“bag”. Urutan kalimat tersebut kemudian ditambahkan token-token khusus yaitu
[CLS], [SEP], dan [PAD]. Token [PAD] ditambahkan karena panjang kalimat tidak
mencapai panjang maksimum yang sudah ditentukan yaitu 8. Setelah memecah
kalimat menjadi token-token, indeks dari vocabulary disesuaikan dengan tiap token
yang ada pada kalimat yang disebut sebagai token ids. Untuk memperoleh token
ids, tiap token dicocokkan pada indeks kata tersebut pada vocabulary yang
digunakan. Pada vocabulary, token [CLS] memiliki id 101, [SEP] memiliki id 103,
dan seterusnya. Attention mask bersifat optional, berfungsi untuk memberi tahu
model token mana yang harus diperhatikan dan tidak perlu diperhatikan. Attention
mask akan menunjukkan posisi dari indeks yang diberi padding sehingga model
tidak perlu memproses token tersebut. Seperti yang diketahui, terdapat token
[PAD]. Untuk mengatasinya, digunakan angka 1 dan 0 untuk membedakan antara
kalimat dengan padding-nya. Angka 1 menunjukkan kalimat input yang harus
diperhatikan oleh model sedangkan angka 0 menunjukkan token yang berisi
padding yang ditambah dan tidak memiliki makna lebih. Seperti pada contoh
kalimat di atas, attention mask dari kalimat input adalah [1, 1, 1, 1, 1, 1, 0,
0].
True Class
Positive Netral Negative
True Positive False Positive False Positive
Positive
(TP) (FNt) (FP)
Predicted Class
Kategori pada confusion matrix terdiri dari empat kategori, yaitu True
Positive (TP), False Positive (FP), True Neutral (TNt), False Neutral (FNt), True
Negative (TN), dan False Negative (FN). True Positive adalah kalimat memiliki
sentimen positif dan hasil prediksinya juga menunjukkan sentimen positif. False
Positive (FP) adalah kalimat yang memiliki sentimen positif tetapi hasil prediksinya
menunjukkan sentimen netral atau negatif. True Neutral (TNt) adalah kalimat
memiliki sentimen netral dan hasil prediksinya juga menunjukkan sentimen netral.
False Neutral (FNt) adalah kalimat yang memiliki sentimen netral tetapi hasil
prediksinya menunjukkan sentimen positif atau negatif. True Negative (TN) adalah
kalimat yang memiliki sentimen negatif dan hasil prediksinya juga menunjukkan
hasil negatif. False Negative (FN) adalah kalimat yang memiliki sentimen negatif
tetapi hasil prediksinya menunjukkan sentimen netral atau positif.
𝑇𝑃 + 𝑇𝑁𝑡 + 𝑇𝑁
𝐴𝑐𝑐𝑢𝑟𝑎𝑐𝑦 = ……………………………………...(3.1)
𝑇𝑃 + 𝐹𝑃 + 𝑇𝑁𝑡 + 𝐹𝑁𝑡+ 𝑇𝑁 + 𝐹𝑁
𝑇𝑃
𝑃𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 𝑃𝑜𝑠𝑖𝑡𝑖𝑣𝑒 = …………………………………………………...(3.2)
𝑇𝑃+𝐹𝑃
𝑇𝑃
𝑅𝑒𝑐𝑎𝑙𝑙𝑃𝑜𝑠𝑖𝑡𝑖𝑣𝑒 = …………………….………………………........(3.3)
𝑇𝑃 + 𝐹𝑁+𝐹𝑁𝑡
𝑃𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 ∗ 𝑅𝑒𝑐𝑎𝑙𝑙
𝐹 − 𝑚𝑒𝑎𝑠𝑢𝑟𝑒 = 2 ∗ 𝑃𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 + 𝑅𝑒𝑐𝑎𝑙𝑙………………………………………....(3.4)
Pada bab ini akan dijelaskan tentang hasil analisis sentimen dengan BERT
sesuai dengan analisis dan perancangan sistem yang telah dijabarkan pada Bab 3.
Tahap preprocessing pada penelitian ini terdiri dari beberapa proses yaitu case
folding, data cleaning, tokenisasi, stopwords removal, stemming, dan normalisasi.
4.4.3 Tokenisasi
4.4.6 Normalisasi
Pada tahap normalisasi Bahasa tidak baku, penulis menggunakan Kamus Alay
(Aliyah Salsabila et al., 2019). Karena beberapa kata tidak terdapat pada kamus
tersebut, penulis kemudian membuat kamus tambahan yang diambil dari kata-kata
tidak baku yang ada pada dataset. Gambar 4.12 menunjukkan kamus tidak baku
yang dibuat penulis. Sedangkan Gambar 4.13 menunjukkan Kamus Alay. Hasil dari
menggunakan normalisasi kata tidak baku dengan kamus yang dibuat penulis dapat
dilihat pada Gambar 4.14 sedangkan dengan Kamus Alay dapat dilihat pada
Gambar 4.15.
Agar dapat melakukan training, dibutuhkan sebuah data loader untuk tiap masing-
masing dataset dibuat agar dapat melakukan iterasi. Tujuannya adalah untuk
menjaga memori saat training, sehingga seluruh dataset tidak perlu dimasukkan ke
dalam memori di saat bersamaan. Oleh karena itu dibutuhkan juga blocks untuk
membuat Data Loader yang nantinya akan menghasilkan komentar-komentar yang
sudah ditokenisasi. Komentar dan sentimen memiliki maksimal panjang 130 kata.
Untuk melakukan analisis sentimen, layer tambahan digunakan. Layer untuk
analisis sentimen menggunakan dropout dengan probabilitas 0.1 (Devlin et al.,
2019). Penulis juga melakukan fine-tuning dengan menggunakan hyperparameters
sebagai berikut dengan mengambil beberapa rekomendasi untuk BERT:
1. Batch size: 16
2. Epoch: 10
3. Learning rate: 2e-5 (0.00005)
Pemilihan hyperparameters ditentukan karena beberapa hal. Batch size sebesar
16 dipilih karena semakin besar batch size, semakin lama pula waktu yang
dibutuhkan untuk menyelesaikan satu batch (Osinga, 2018). Selain itu, penggunaan
learning rate 2e-5 dipilih karena dapat membuat BERT mengatasi masalah
catastrophic forgetting (Sun et al., 2019), yaitu suatu masalah di mana pemahaman
yang diperoleh dari pre-training dihapus ketika sedang mempelajari informasi atau
data yang baru.
Setelah melalui proses perulangan per epoch pada model, hasil yang
mendapatkan nilai akurasi terbaik disimpan. Gambar 4.21 menunjukkan hasil
perbandingan antara akurasi yang didapat saat training dan validasi dari tiap
percobaan.
4.7 Evaluasi
5.1 Kesimpulan
Berdasarkan hasil pengujian dari implementasi model Bahasa BERT dalam
melakukan analisis sentimen, maka diperoleh kesimpulan sebagai berikut.
5.2 Saran
Adapun saran yang dapat dipertimbangkan untuk penelitian selanjutnya adalah:
Abdul, S., Qiang, Y., Basit, S., & Ahmad, W. (2019). Using BERT for Checking
the Polarity of Movie Reviews. International Journal of Computer
Applications, 177(21), 37–41. https://doi.org/10.5120/ijca2019919675
Aliyah Salsabila, N., Ardhito Winatmoko, Y., Akbar Septiandri, A., & Jamal, A.
(2019). Colloquial Indonesian Lexicon. Proceedings of the 2018 International
Conference on Asian Language Processing, IALP 2018, 226–229.
https://doi.org/10.1109/IALP.2018.8629151
Devlin, J., Chang, M. W., Lee, K., & Toutanova, K. (2019). BERT: Pre-training of
deep bidirectional transformers for language understanding. NAACL HLT
2019 - 2019 Conference of the North American Chapter of the Association for
Computational Linguistics: Human Language Technologies - Proceedings of
the Conference, 1(Mlm), 4171–4186.
Ghosh, S., Roy, S., & Bandyopadhyay, S. K. (2012). A tutorial review on Text
Mining Algorithms. International Journal of Advanced Research in Computer
and Communication Engineering, 1(4), 223–233. www.ijarcce.com
Jurafsky, D., & Martin, J. H. (2019). Speech and language processing. In Prentice
Hall, 3rd Edition. https://doi.org/10.4324/9780203461891_chapter_3
Kingma, D. P., & Ba, J. L. (2015). Adam: A method for stochastic optimization.
3rd International Conference on Learning Representations, ICLR 2015 -
Conference Track Proceedings, 1–15.
Koto, F., Rahimi, A., Lau, J. H., & Baldwin, T. (2020). IndoLEM and IndoBERT:
A Benchmark Dataset and Pre-trained Language Model for Indonesian NLP.
http://arxiv.org/abs/2011.00677
Pekel, E., & Kara, S. S. (2017). A Comprehensive Review for Artifical Neural
Network Application to Public Transportation. Sigma Journal of Engineering
and Natural Sciences, 35(1), 157–179.
Sun, C., Qiu, X., Xu, Y., & Huang, X. (2019). How to Fine-Tune BERT for Text
Classification? Lecture Notes in Computer Science (Including Subseries
Lecture Notes in Artificial Intelligence and Lecture Notes in Bioinformatics),
11856 LNAI(2), 194–206. https://doi.org/10.1007/978-3-030-32381-3_16
Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N.,
Kaiser, Ł., & Polosukhin, I. (2017). Attention is all you need. Advances in
Neural Information Processing Systems, 2017-Decem(Nips), 5999–6009.
Wilie, B., Vincentio, K., Winata, G. I., Cahyawijaya, S., Li, X., Lim, Z. Y.,
Soleman, S., Mahendra, R., Fung, P., Bahar, S., & Purwarianti, A. (2020).
IndoNLU: Benchmark and Resources for Evaluating Indonesian Natural
Language Understanding. http://arxiv.org/abs/2009.05387
Xu, H., Liu, B., Shu, L., & Yu, P. S. (2019). BERT post-training for review reading
comprehension and aspect-based sentiment analysis. NAACL HLT 2019 - 2019
Conference of the North American Chapter of the Association for
Computational Linguistics: Human Language Technologies - Proceedings of
the Conference, 1, 2324–2335.
Xu, S., Li, Y., & Wang, Z. (2017). Bayesian Multinomial Na ï ve Bayes Classi fi er
to Text Classi fi cation. 15. https://doi.org/10.1007/978-981-10-5041-1
Yanuar, M. R., & Shiramatsu, S. (2020). Aspect Extraction for Tourist Spot Review
in Indonesian Language using BERT. 2020 International Conference on
Artificial Intelligence in Information and Communication, ICAIIC 2020, 298–
302. https://doi.org/10.1109/ICAIIC48513.2020.9065263
chrome_path = "webdrivers/chromedriver"
page_url = https://www.youtube.com/watch?v=8rauD1vxMCw&t=2s
driver = webdriver.Chrome(executable_path=chrome_path)
driver.get(page_url)
time.sleep(5)
title = driver.find_element_by_xpath('//*[@id="container"]/h1/yt-
formatted-string').text
SCROLL_PAUSE_TIME = 5
CYCLES = 600
html = driver.find_element_by_tag_name('html')
html.send_keys(Keys.PAGE_DOWN)
html.send_keys(Keys.PAGE_DOWN)
time.sleep(SCROLL_PAUSE_TIME * 3)
for i in range(CYCLES):
html.send_keys(Keys.END)
time.sleep(SCROLL_PAUSE_TIME)
comment_elems = driver.find_elements_by_xpath('//*[@id="content-
text"]')
comment_elems = driver.find_elements_by_xpath('//*[@id="content-
text"]')
header = ['Comment']
filename = "youtube_gundala.csv"
with open(filename, 'w', encoding="utf-16") as file:
csv_writer = csv.writer(file, delimiter='\n')
csv_writer.writerow(header)
csv_writer.writerow(all_comments)
sentences.append((row[1], sentence))
3. BERT
nama_sentimen = ['negative', 'neutral', 'positive']
ax = sns.countplot(df.Sentiment)
plt.xlabel('Opini terhadap Gundala')
ax.set_xticklabels(nama_sentimen);
# preprocessing
def text_preprocessing(text):
text = text.lower()
text = re.sub(r"(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-
]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-
9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-
9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})", "", text)
text = re.sub(r"@[^\s]+[\s]?", '', text)
text = re.sub(r'\.{2,}', ' ', text)
text = re.sub(r'\d+', ' ', text)
text = re.sub(r'#(\S+)', r'\1', text)
text = re.sub(r'\s+', ' ', text)
text = re.sub(r"([xX;:]'?[dDpPvVoO3)(])", '', text)
text = re.sub(r'[\!\"\”\$\%\&\'\(\)\*\+\,\-
\.\/\:\;\<\=\>\?\[\\\]\^\_\`\{\|\}\~]', ' ', text)
text = re.sub(r'\n', ' ', text)
return text
txt_stopwords = pd.read_csv("stopword_list_tala.txt",
names=["stopwords"], header=None) # panggil stopword listnya
list_stopwords = stopwords.words('indonesian')
list_stopwords.remove("sangat")
list_stopwords.remove("sekali")
list_stopwords.extend(txt_stopwords["stopwords"][0].split(' '))
list_stopwords = set(list_stopwords)
lst_text = word_tokenize(text)
factory = StemmerFactory()
stemmer = factory.create_stemmer()
text = lst_text
return text
normalize_word_dict = {}
normalize_word_dict[row[0]] = row[1]
def normalisasi_kata(text):
normalize_word_dict_dua = {}
normalize_word_dict_dua[row[0]] = row[1]
PRE_TRAINED_MODEL_NAME = 'bert-base-multilingual-cased'
tokenizer = BertTokenizer.from_pretrained(PRE_TRAINED_MODEL_NAME)
BATCH_SIZE = 16
MAX_LEN = 130
max_len = 130
EPOCHS = 10
self.reviews =
self.targets = targets
self.tokenizer = tokenizer
self.max_len = max_len
def __len__(self):
return len(self.reviews)
review = str(self.reviews[item])
target = self.targets[item]
encoding = self.tokenizer.encode_plus(
review,
add_special_tokens=True,
max_length=self.max_len,
return_token_type_ids=False,
padding='max_length',
return_attention_mask=True,
return_tensors='pt',
return {
'review_text': review,
'input_ids': encoding['input_ids'].flatten(),
'attention_mask': encoding['attention_mask'].flatten(),
ds = GPReviewDataset(
reviews=df.Comment.to_numpy(),
targets=df.Sentiment.to_numpy(),
tokenizer=tokenizer,
max_len=max_len
return DataLoader(
ds,
batch_size=batch_size,
num_workers=4
class SentimentClassifier(nn.Module):
super(SentimentClassifier, self).__init__()
self.bert = BertModel.from_pretrained(PRE_TRAINED_MODEL_NAME)
self.drop = nn.Dropout(p=0.1)
_, pooled_output = self.bert(
input_ids=input_ids,
attention_mask=attention_mask
output = self.drop(pooled_output)
return self.out(output)
model = SentimentClassifier(len(nama_sentimen))
model = model.to(device)
attention_mask = data['attention_mask'].to(device)
optimizer = AdamW(model.parameters(),
correct_bias=False)
scheduler = get_linear_schedule_with_warmup(
optimizer,
num_warmup_steps=0,
num_training_steps=total_steps
loss_fn = nn.CrossEntropyLoss().to(device)
def train_epoch(
model,
data_loader,
loss_fn,
optimizer,
device,
scheduler,
n_examples
):
model = model.train()
losses = []
correct_predictions = 0
for d in data_loader:
input_ids = d["input_ids"].to(device)
attention_mask = d["attention_mask"].to(device)
targets = d["targets"].to(device)
outputs = model(
input_ids=input_ids,
attention_mask=attention_mask
losses.append(loss.item())
loss.backward()
nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
optimizer.step()
scheduler.step()
optimizer.zero_grad()
model = model.eval()
losses = []
correct_predictions = 0
with torch.no_grad():
for d in data_loader:
input_ids = d["input_ids"].to(device)
attention_mask = d["attention_mask"].to(device)
targets = d["targets"].to(device)
outputs = model(
input_ids=input_ids,
attention_mask=attention_mask
losses.append(loss.item())
history = defaultdict(list)
best_accuracy = 0
print('-' * 10)
model,
train_data_loader,
loss_fn,
optimizer,
device,
scheduler,
len(df_train)
model,
val_data_loader,
loss_fn,
device,
len(df_val))
print()
history['train_acc'].append(train_acc)
history['train_loss'].append(train_loss)
history['val_acc'].append(val_acc)
history['val_loss'].append(val_loss)
torch.save(model.state_dict(), 'best_model_state.bin')
best_accuracy = val_acc
plt.title('Training history')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend()
plt.ylim([0, 1]);
test_acc, _ = eval_model(
model,
test_data_loader,
loss_fn,
device,
len(df_test)
review_texts = []
predictions = []
prediction_probs = []
real_values = []
with torch.no_grad():
for d in data_loader:
texts = d["review_text"]
input_ids = d["input_ids"].to(device)
attention_mask = d["attention_mask"].to(device)
targets = d["targets"].to(device)
outputs = model(
input_ids=input_ids,
attention_mask=attention_mask
review_texts.extend(texts)
predictions.extend(preds)
real_values.extend(targets)
predictions = torch.stack(predictions).cpu()
prediction_probs = torch.stack(prediction_probs).cpu()
real_values = torch.stack(real_values).cpu()
model,
test_data_loader
print(classification_report(y_test, y_pred,
target_names=nama_sentimen))
def show_confusion_matrix(confusion_matrix):
hmap.yaxis.set_ticklabels(hmap.yaxis.get_ticklabels(),
rotation=0, ha='right')
hmap.xaxis.set_ticklabels(hmap.xaxis.get_ticklabels(),
rotation=30, ha='right')
plt.ylabel('True sentiment')
plt.xlabel('Predicted sentiment');
cm = confusion_matrix(y_test, y_pred)
show_confusion_matrix(df_cm)
Education
Universitas Sumatera Utara, Majoring Computer Science Sept 2016 – Present
GPA 3.8 / 4.00; expected graduation in January 2021
Working Experience
Unilever Leadership Internship Programme (ULIP) Feb 2020 – May 2020
Intern in E-RTM, Customer Development.
• Collected and summarized sales report from 8 (eight) provinces in Sumatera with more
than 125.000 outlets and 100 distributors.
• Created an improved dashboard to maximize the summary from salesman, distributors, and
area.
Ilmu Komputer Laboratory Center (IKLC) July 2018 – Jan 2020
Laboratory Assistant
• The courses that have taught are Web Programming, Semantic Web, Computer Graphic
and Visualization, Advanced Database Management System, etc.
• Responsible for 7 classes so far, develop learning modules for each class, and assists the
students.
• Graded the assignments and exams of all the students.
Kantor Pelayanan Kekayaan Negara dan Lelang Medan July 2019 – Aug 2019
Internship in General Subsection
• Analyzed, designed, and created an information system using PHP programming language
and MySQL
• Made a web-based information system to archive documents based on the regulations of
Ministry of Finance for Directorate General of State Assets and Auctions.
Organizational Experience
Ilmu Komputer Laboratory Center (IKLC) Oct 2018 – Jan 2019
Assessment Division
• Formulated, distributed, and compiled the students' grades from every laboratory assistant.
• Ensured all classes' assessments match with the curriculum and submitted them into the
system on time.
Muslim Student Activity Unit Al Khuwarizmi USU May 2017 – April 2018
Syiar Division (Public Relations)
• Made digital designs for events handled by Muslim Student Activity Unit Al-Khuwarizmi
USU and contents to post on social media.
Achievements
1st Winner, Website User Interface Festival Ajisaka 2019 Nov 2019
Department of Communication, Universitas Gadjah Mada
• Conceptualized how to encourage Gen-Z to reduce the usage of the single plastic
• Created and designed the interface of microsite named Baik Berplastik.
XL Future Leaders Batch 6 Awardee Nov 2017 – Nov 2019
CSR Initiative by PT XL Axiata Tbk
Projects
MinerMet Feb 2019 – Nov 2019
Researcher Team
• Collaborated with others to create an IoT project as a solution for problems occur in the
mining site.
• Designed the workflow using Photoshop.
• Finalized the concept for the exhibition held by PT XL Axiata Tbk.
SINAR – Sistem Informasi Pengarsipan July 2019 – Aug 2019
UI/UX Designer
• Responsible for designing the system's prototype to fit what the user needs and built the
user interface using Bootstrap and jQuery.
Zahra Wedding Organizer Mar 2017 – July 2017
Backend Programmer
• Built the website using native PHP programming language, HTML, JavaScript, and
MySQL database for end of semester’s project.
Skills
• Software: Microsoft Office (Word, Excel, Power Point, Outlook), Adobe Photoshop,
Adobe XD
• Programming: Python, HTML/CSS, PHP, Java
• Languages: Indonesian (native), English (fluent)