Word Embedding Bahasa Indonesia menggunakan Fasttext (dengan Gensim)

Mengenal Word Embedding

Word embedding mudahnya adalah istilah yang digunakan untuk teknik mengubah sebuah kata menjadi sebuah vektor atau array yang terdiri dari kumpulan angka.

Ketika kita akan membuat model machine learning yang menerima input sebuah teks, tentu machine learning tidak bisa langsung menerima mentah-mentah teks yang kita miliki. Cara “tradisional” untuk membaca teks tersebut adalah sebagai berikut:

  1. Buat kamus kata dengan cara mendaftar semua kata yang ada di dataset
  2. Setiap menerima sebuah string kata, string tersebut diubah menjadi sebuah integer dengan memberinya nomor. Penomoran ini bisa ditentukan berdasarkan urutan di kamus kata yang kita miliki. Misalnya pada ilustrasi di bawah, string “Makan” menjadi angka 3, string “Lari” menjadi angka 5, dst.
  3. Angka-angka tersebut kita ubah lagi menjadi sebuah vektor (array 1 dimensi) yang memiliki panjang sepanjang banyak kata yang kita miliki di kamus. Array tersebut hanya akan bernilai 1 atau 0 (disebut one hot encoding). Nilai 1 diposisikan pada indeks yang merupakan nomor kata tersebut sedangkan elemen lainnya bernilai 0. Contohnya untuk kata “makan”, dengan banyak kosakata yang kita miliki adalah 100 kata, maka dari kata tersebut kita akan memperoleh sebuah vektor dengan panjang 100 yang berisi 0 semua kecuali pada posisi ke 3 yang bernilai 1.
Ilustrasi mengubah string menjadi one-hot encoding

Nah coba saja bayangkan kamus kita ukurannya mencapai 10,000 kata, maka untuk setiap katanya akan di-convert menjadi vektor ukuran 10,000 yang hampir semua elemennya bernilai 0 semua. Metode ini selain kurang efisien dalam memori juga tidak memberikan banyak informasi.

Dengan metode word embedding kita dapat mengubah kata menjadi sebuah vektor yang berisi angka-angka dengan ukuran yang cukup kecil untuk mengandung informasi yang lebih banyak. Informasi yang diperoleh akan cukup banyak sampai-sampai vektor kita akan dapat mendeteksi makna, seperti kata “marah” dan “mengamuk” itu lebih memiliki kedekatan nilai ketimbang kata “marah” dengan “bahagia”.

Apa itu FastText?

FastText adalah library yang dikeluarkan oleh Facebook yang dapat digunakan untuk word embedding. Sebenarnya, FastText sendiri adalah pengembangan dari library Word2Vec yang telah lebih lama terkenal sebagai library untuk word embedding.

FastText memiliki keunggulan dibanding Word2Vec. Salah satunya adalah kemampuan FastText untuk menangani kata yang tidak pernah kita jumpai sebelumnya (Out Of Vocabulary word atau dikenal OOV). Misalnya kata-kata yang tidak baku seperti “Pengoptimalisasian” tetap akan diperoleh vektornya. Library Word2Vec ataupun teknik one hot encoding tradisional yang seperti dijelaskan sebelumnya akan menghasilkan eror ketika menerima kata yang tidak pernah ada di kamus.

FastText memberikan opsi untuk menggunakan salah satu dari dua algoritma utama, yakni CBOW dan Skipgram. Kedua algoritma tersebut menggunakan bantuan Neural network untuk mendapatkan model terbaik yang mampu merepresentasikan sebuah kata dalam vektor.

PreTrained FastText Bahasa Indonesa

Ada banyak cara menggunakan library FastText untuk kasus Bahasa Indonesia, cara paling mudah adalah dengan menggunakan Pretrained model, atau model yang telah dilatih oleh seseorang sehingga kita tinggal menggunakannya tanpa harus melatihnya terlebih dahulu.

Model resmi (terdapat lebih dari 150 bahasa) bisa di download di sini. Model tersebut dibuat berdasarkan paper oleh Edouard Grave, dkk yang berjudul Learning Word Vectors for 157 Languages. Bersyukurnya, bahasa Indonesia ada di antara 157 bahasa tersebut.

Saat akan mendownload, kalian akan sadar terdapat 2 jenis model yang disediakan oleh FastText, yakni cc.id.300.vec.gz dan cc.id.300.bin.gz. Jika diperhatikan sekilas dari nama filenya, tampak simbol id berarti itu adalah model bahasa Indonesia dan angka 300 menunjukkan besar dimensi vektornya.

Untuk bagian vec/bin menunjukkan tipe model tersebut, vec menunjukkan model tersebut hanyalah berupa text file yang berisi kamus daftar vector untuk setiap kata (perlu membuat program sendiri untuk mengatasi OOV), sedangkan bin menunjukkan file tersebut adalah file binary siap pakai dengan termasuk di dalamnya file .vec, algoritma untuk mengatasi OOV, catatan hyperparameter untuk melatih ulang, dsb.

Perlu diketahui, FastText hanya menyediakan pretrained model berupa model binary FastText (.bin) atau text file kumpulan kata beserta vektornya (.vec). Untuk menggunakan model atau text file tersebut pada proses word embedding kita akan menggunakan library lain lagi, yakni Gensim.

Menggunakan Gensim

Bagi pengguna Python, sebenarnya terdapat dua libray besar yang bisa kita gunakan untuk word embedding menggunakan FastText, yang pertama adalah library Python FastText bawaan asli, dan yang kedua adalah Gensim, library yang lebih umum untuk word embedding namun juga telah support FastText.

Di sini kita akan menggunakan Gensim untuk menggunakan model FastText. Install terlebih dahulu menggunakan perintah berikut:

pip install --upgrade gensim

Lalu import di program python menggunakan perintah:

from gensim.models.fasttext import FastText

Dalam Gensim saat ini cara paling mudah untuk me-load pretrained model FastText adalah menggunakan `load_fasttext_format` (lihat bagian Catatan). Fungsi tersebut membutuhkan file *.bin dari pretrained model. Kita bisa download terlebih dahulu file *.bin tersebut (~4-5GB) dari halaman resmi FastText.

Setelah berhasil terdownload, unzip file tersebut terlebih dahulu, lalu kita bisa memanggil model tersebut dengan perintah berikut:

from gensim.models.fasttext import FastText
model = FastText.load_fasttext_format('cc.id.300.bin')

Dan kita bisa uji model yang telah kita load dengan kode berikut:

print("algoritmatik" in model.wv.vocab) # mengecek apakah ada kata "algoritmatik" di kamus
print(model.wv.most_similar("algoritmatik")) # mencari kata terdekat dari kata "algoritmatik"

# output:
# False
# [('algoritmas', 0.8505093455314636), ('algoritma.', 0.826854944229126),...]

Dapat dilihat pada program di atas kata “algoritmatik” tidak ada di kamus model yang kita gunakan (False), tetapi FastText tetap bisa menghasilkan nilai vektor untuk kata tersebut sehingga bisa dicari kata mirip terdekatnya (algoritma).

Untuk melihat nilai vektor dari kata “algoritmatik” kita bisa memunculkan dengan cara:

print(model.wv["algoritmatik"])

Penutup

Salah satu kekurangan menggunakan pretrained model adalah ukuran yang luar biasa besar (~7GB setelah di ekstrak), hal ini membuat kita pengguna komputer yang memiliki RAM kecil kesulitan untuk menggunakannya.

Kita bisa menggunakan Google Colab untuk menangani masalah tersebut, tetapi ada metode lain yang bisa kita gunakan, yakni kita coba melatih model kita sendiri. Dengan melatih sendiri kita bisa lebih mengatur ukuran model menyesuaikan kebutuhan. InsyaAllah proses melatih word embedding akan berlanjut di Part 2, baca juga kelanjutan penggunaan Fasttext dengan library aslinya di sini atau tutorial kami tentang extend training model fasttext di sini.

Catatan Seputar Gensim:

Di versi terbaru Gensim (> 3.7.2), kita disarankan menggunakan dua metode lain untuk me-load pretrained model, yakni menggunakan `load_facebook_vectors` atau `load_facebook_model`. Kedua fungsi tersebut merupakan fungsi yang telah diperbarui dari fungsi `load_fasttext_format` sehingga seharusnya lebih cepat.

Namun, ketika tulisan ini di tulis masih ada sebuah bug yang membuat belum bisa digunakannya fungsi tersebut. Jika bug ini sudah diperbaiki insyaAllah akan ada update untuk tulisan ini

Sumber featured image Pexels.com

About the author

Rian Adam

Student at University of Central Florida; Lecturer at Universitas Islam Indonesia; Machine Learning Enthusiast;

View all posts

2 Comments

Leave a Reply