Model Text Similarity Menggunakan BERT Berbasis Bahasa Indonesia

Reza Dwi Utomo
3 min readJan 3, 2022
Photo by Jørgen Håland on Unsplash

Motivasi

Perkembangan teknologi NLP (Natural Language Processing) bahasa Indonesia bisa dikatakan masih minim jika dibandingkan dengan NLP bahasa Inggris. Hal ini pula yang menjadi tantangan tersendiri pada saat saya hendak mengembangkan model NLP bahasa Indonesia.

Di lain sisi, perkembangan NLP beberapa tahun terakhir sangat pesat, terutama setelah pendekatan berbasis Attention ditemukan. Pendekatan inilah yang mendasari metode baru deep learning pada NLP, yaitu Transformers, yang mendegradasi pendekatan trandisional LSTM (Long Short Term Memory). Sekarang sudah ada begitu banyak varian dari arsitektur model Transformers. Salah satu yang terkenal adalah BERT (Bi-directional Encoder Representations from Transformers).

BERT adalah sebuah pretrained model yang di-training pada corpus berbahasa Inggris. ̶B̶a̶h̶a̶s̶a̶ ̶I̶n̶g̶g̶r̶i̶s̶ ̶l̶a̶g̶i̶,̶ ̶b̶a̶h̶a̶s̶a̶ ̶I̶n̶g̶g̶r̶i̶s̶ ̶l̶a̶g̶i̶. Jadi, kalau kita mau menggunakannya untuk bahasa Indonesia, kita harus siap modal GPU yang support CUDA (milik sendiri atau sewa di cloud — yang pasti harga untuk dua-duanya tidak murah) untuk men-training ulang model BERT tersebut dengan menggunakan corpus bahasa Indonesia. Untungnya, ada para pahlawan NLP Indonesia yang telah melakukan itu semua buat kita semua; dan kita cuma cukup pakai tanpa perlu bayar. Terima kasih kakak-kakak!

Dengan adanya BERT berbahasa Indonesia tersebut, alias IndoBERT, pada tulisan ini, kita akan coba mengembangkan model NLP untuk menangani text similarity.

Daftar Isi

  • Asumsi
  • Sekilas teori
  • Coding
  • Referensi

Asumsi

Sebelum kita membahas tulisan ini lebih lanjut, saya asumsikan para pembaca yang budiman memenuhi persyaratan di bawah ini:

  • memahami cara kerja model BERT
  • memahami konsep text similarity
  • memahami penggunaan library transformers (Hugging Face)
  • memahami penggunaan library PyTorch

Sekilas Teori

Biasanya, word embeddings yang berbasis Word2Vec atau GloVe-lah yang digunakan sebagai model untuk text similarity. Model tersebut digunakan untuk men-tokenize suatu token/kata/kalimat/teks agar menjadi bentuk representative vectors. Pada saat kita ingin mencek similarity antar dua teks, dengan menggunakan vectors dari masing-masing teks tersebut, kita bisa mencari nilai cosine similarity-nya.

Dengan menggunakan pendekatan yang serupa, kita juga bisa menggunakan model BERT untuk men-generate representative vectors dari suatu token/kata/kalimat/teks. Hal ini memungkinkan karena pada dasarnya, BERT merupakan sebuah word embeddings, namun lebih kompleks. Itu mengapa tidaklah heran bahwa jika kita ingin menggunakan model BERT untuk sebuah downstream task, kita perlu memasang sebuah head (yang sesuai dengan downstream-nya) pada model BERT tersebut lalu melakukan fine-tuning dengan training dataset yang relevan.

Selain itu, BERT juga merupakan sebuah Encoder dari model Transformers. Tujuan dari Encoder pada model Transformers adalah untuk meng-encode (alias mentransformasi dan menangkap pola) tokens. Tujuan ini sangat mirip fungsi utama word embeddings.

Coding

Oke, langsung saja kita praktikkan ke dalam coding Python. Pertama, berikut adalah libraries tambahan yang harus disiapkan:

  • torch (PyTorch)

kita cuma butuh function clamp.

  • transformers (Hugging Face)

dengan library ini, kita akan me-load model dan tokenizer dari IndoBERT.

  • sklearn (scikit-learn)

kita cuma butuh function cosine_similarity untuk men-calculate cosine similarity antara dua vector.

Kedua, mari kita buat ke dalam sebuah Python class. Di dalam class tersebut, kita akan men-define beberapa method:

  • load_pretrained

digunakan untuk me-load model dan tokenizer dari IndoBERT,

  • __cleaning

digunakan untuk melakukan beberapa text preprocessing sebelum masuk ke proses utama,

  • __process

digunakan untuk melakukan proses utama dalam men-generate word embeddings,

  • predict

digunakan untuk melakukan prediksi token similarity antara dua token yang diinput.

Untuk detail coding-nya, bisa dilihat di code snippet di bawah ini.

Setelah TokenSimilarity class di-define, sekarang kita instantiate class-nya sambil men-download modelnya. Kita akan menggunakan chekpoint model indobert-base-p2 dari HuggingFace.

model = TokenSimilarity()model.load_pretrained('indobenchmark/indobert-base-p2')

Lalu kita coba tes dengan beberapa kalimat di bawah.

token1 = 'lama lu bro'token2 = 'jangan terlalu lama'token3 = 'kehancuran melanda kota menyebabkan malapetaka'

Lalu lihat hasilnya.

print(model.predict(token1, token2))print(model.predict(token1, token3))

Antara token1 dengan token2, similarity probability yang dihasilkan adalah 0.66, sedangkan token1 dengan token3, dihasilkan nilai 0.28.

Referensi

Sebagai referensi, rekan-rekan pembaca bisa mendapatkan detail mengenai metode ini dari beberapa sumber di bawah.

--

--

Reza Dwi Utomo

An engineer specializing in data-driven analysis | Data Scientist | ML Engineer | AI Enthusiast | Find me on utomoreza.github.io