Model Text Similarity Menggunakan BERT Berbasis Bahasa Indonesia
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.