Word Embedding Bahasa Indonesia menggunakan Fasttext (Part 1.5)

Updated 11 Juli 2019: Fasttext released version 0.9.1

Pada artikel sebelumnya saya sempat menuliskan bagaimana menggunakan Gensim untuk me-load pre-trained model word embedding FastText. Ternyata metode tersebut “kebetulan” mudah digunakan untuk data bahasa Indonesia. Ketika kita memilih bahasa lain yang memiliki ukuran data lebih besar, menggunakan Gensim bisa jadi memunculkan masalah karena untuk me-load pre-trained model FastText, Gensim membutuhkan resource RAM yang cukup tinggi

Sebagai contoh jika kita coba me-load pre-trained model bahasa Inggris di Google Colab yang memiliki kapasitas RAM 12GB, Google Colab akan crash karena notebook kita menggunakan sumberdaya melebihi yang disediakan.

Berikut contoh program untuk me-load model bahasa Inggris menggunakan Gensim (detail sintaks program sebelumnya sudah sempat saya bahas di post sebelumnya)

Dan hasilnya, RAM kita yang 12GB itu secara perlahan akan habis digunakan. Lalu berakhir Google Colab kita akan mengalami crash dengan pesan berikut:

Untuk itu ada cara lain yang ingin saya bahas singkat di post ini bagaimana cara me-load pre-trained model Fasttext jika RAM kita terbatas

Menggunakan Fasttext Python Library

Seperti yang telah saya singgung di artikel sebelumnya, terdapat dua library yang dapat kita gunakan saat ingin menerapkan FastText di Python. Yang pertama adalah menggunakan Gensim, dan yang kedua adalah menggunakan package resmi dari FastText. Dokumentasinya dapat dibaca di halaman github ini.

Sedikit trivia, sebenarnya package FastText hanya tersedia untuk bahasa C++ dan dijalankan menggunakan command line. Sedangkan versi Python ini awalnya dibuat lebih dulu oleh orang Indonesia, yakni Bayu Aldiansyah. Lalu package ini dilanjutkan pengembangannya oleh tim Facebook AI Research.

Proses Instalasi

Di versi terbaru, yakni 0.9.1, Proses instalasi cukup dilakukan melalui pip dengan menjalankan perintah di bawah.

Setelah terinstall, kita dapat me-load library fastText pada program python kita menggunakan perintah

Yang menurut saya kurang dari package ini adalah dokumentasinya yang masih sederhana. Saya perlu beberapa kali membaca kode sumber aslinya untuk melihat fitur-fitur yang ada pada package ini.

Load Pre-trained Model

Untuk proses me-load pre-trained model, package python fastText juga sama meminta kita untuk menyiapkan file *.bin nya bukan file *.vec nya. (bedanya apa? bisa baca post sebelumnya) Ya, walapun kita sebenarnya bisa saja mengconvert file *.vec menjadi *.bin. Sintaks untuk me-load adalah berikut:

Proses loading akan membutuhkan waktu lama, tapi tenang, RAM yang akan digunakan totalnya akan lebih sedikit dibanding saat menggunakan Gensim. Total RAM yang saya gunakan untuk me-load menggunakan package python FastText hanya sekitar 7GB

Sehingga proses mengubah kata menjadi vektor pun dapat dilakukan tanpa mengalami crash. Untuk dokumentasi lengkap fungsi-fungsi yang ada bisa lihat di file kode sumbernya. Misalnya, untuk mendapatkan vektor dari sebuah kata kita cukup menginputkan kata tersebut layaknya dictionary pada Python:

Selain itu, menggunakan Python FastText ini kita tidak hanya bisa mendapatkan vektor dari sebuah kata, tetapi juga seluruh kalimat, menggunakan method get_vector_sentence:

Sekian, semoga bermanfaat.

Mengenal Google Colab

Apa itu Google Colab?

Seperti Google Drive, Google Doc, dan sebagainya, Google Colab adalah salah satu produk Google berbasis cloud yang bisa kita gunakan secara gratis. Perbedaannya adalah Google Colab dibuat khusus untuk para programmer atau researcher yang mungkin kesulitan untuk mendapatkan akses komputer dengan spek tinggi. Google Colab adalah coding environment bahasa pemrograman Python dengan format “notebook” (mirip dengan Jupyter notebook), atau dengan kata lain Google seakan meminjami kita komputer secara gratis! untuk membuat program oleh Google.

Saya sendiri beberapa kali telah menggunakan Google Colab untuk beragam keperluan dan merasakan banyak manfaatnya, beberapa manfaat yang saya rasakan:

  • Free GPU! Google Colab memudahkan kita untuk menjalankan program pada komputer dengan spek tinggi (GPU Tesla, RAM ~12GB, Disk ~300GB yang masih bisa sambung dengan Google Drive, akses internet cepat untuk download file besar) dan running dalam waktu yang lama (Google Colab mengizinkan kita untuk merunning program hingga 12 jam). Karenanya, bagi teman-teman yang ingin belajar Deep Learning tidak perlu khawatir lagi akan terhalang sulitnya mendapatkan akses komputer dengan spek tinggi.
  • Colaborate! Google Colab juga memudahkan kita berkolaborasi dengan orang lain dengan cara membagi kodingan secara online (mirip Google Doc). Kita bisa lebih mudah bereksperimen secara bersamaan, atau sekadar menggunakan fitur ini untuk mempelajari codingan orang lain yang telah rapi (karena format notebook)
  • Mudah berintegrasi! Google Colab terbilang sangat fleksibel dalam hal integrasi. Kita dapat dengan mudah menghubungkan Google Colab dengan jupyter notebook di komputer kita (local runtime), menghubungkan dengan Google Drive, atau dengan Github
  • Fleksibel! Salah satu yang saya favoritkan adalah kita bisa dengan mudah merunning deep learning program via HP! ya karena pada esensinya Google Colab hanya perlu running di browser, kita bisa mengawasi proses training (atau bahkan coding) via browser smartphone kita selama smartphone kita terhubung dengan Google Drive yang sama.

Bagimana cara menggunakannya?

Seperti Aplikasi Google pada umumnya, yang kita butuhkan adalah akun Google dan silakan ke https://colab.research.google.com/. Setelah itu kita akan disuguhkan tampilan sebagai berikut:

tampilan google colab

Untuk membuat notebook baru, cukup klik New Python 3 Notebook (atau Python 2 tergantung apa yang akan digunakan) lalu kita akan dibawa ke halaman yang mirip dengan Jupyter Notebook. Nantinya, setiap notebook yang kita buat akan disimpan di Google Drive kita.

tampilan google colab 2

Pengaturan GPU

Jika kita ingin menjalankan program Python kita menggunakan GPU (atau bahkan TPU), kita cukup perlu klik “Edit > Notebook Settings”, lalu pada bagian “Hardware Accelerator” pilih GPU. Saat tulisan ini dibuat GPU yang disediakan adalah Nvidia Tesla dan sudah terinstall Cuda (software “penghubung” komputasi menggunakan GPU) versi terbaru.

mengatur gpu google colab

Hal-hal lain seputar Google Colab

Di bagian ini saya akan menjelaskan catatan-catatan tambahan penggunaan Colab yang tidak wajib kalian tahu, tapi siapa tahu akan bermanfaat nantinya.

Pip Package Installation

Ketika kita butuh instal python package di Colab, kita bisa melakukan instalasi menggunakan pip.

Jika diperhatikan perintahnya sama seperti perintah instalasi pip pada umumnya, hanya saja bedanya di awali dengan tanda !. Tanda tersebut digunakan sebagai penanda bahwa perintah yang akan kita jalankan adalah command line. Kita juga bisa menggunakan tanda ! untuk perintah terminal lain seperti !wget untuk mendownload dataset, !gzip untuk mengextract file zip, !cp untuk mengcopy file, dan sebagainya.

Menghubungkan dengan Google Drive

Google Colab akan mereset notebook beserta semua temporary filenya maksimal 12 jam sekali. Karenanya akan lebih baik jika file yang akan kita gunakan atau kita hasilkan tersimpan dengan rapi di Google Drive. Kita bisa melakukan hal tersebut dengan menjalankan program di bawah

Jika perintah di atas dijalankan, maka kita akan diberikan URL yang akan mengantarkan kita ke halaman permohonan akses Google Drive. Jika ktia sudah mengizinkan, kita akan diberikan kode yang dapat dituliskan di kolom kecil di akhir output tersebut.

Setelah terhubung, maka akan tampak daftar file di bagian kiri Notebook

Untuk mengakses file-file tersebut, kita arahkan proses load / save ke path drive/My Drive/FOLDERTUJUAN

Mengupload file ke Colab

Alternatif lain jika tidak ingin menghubungkan Google Colab ke Google Drive adalah dengan mengupload langsung file yang diperlukan ke Colab. Colab menyediakan tempat penyimpanan file sementara yang akan direstart (dihapus) dalam rentangan waktu tertentu.

Upload file ke Google Colab dengan perintah berikut:

Jika perintah di atas di-run akan memunculkan kotak dialog untuk mengupload file. Perintah di atas cukup praktis untuk mengupload file-file kecil (bukan dataset besar, lebih mudah diletakkan di drive)

Pengaturan tema

Bagi yang suka coding dengan “night mode”, Colab juga menyediakan pilihan untuk mengubah tema notebooknya menjadi gelap. Pengubahan tema dilakukan di “tools” > “preferences” > “site”

dark google colab

Selain itu Colab juga menyediakan beberapa “hiburan” lain untuk diatur semisal memunculkan kucing (“kitty mode”) atau anjing (“corgy mode”) di atas layar atau juga percikan api (“power level”) jika mengetik panjang. Ini semua bisa ditemukan di “tools” > “preferences” > “miscellaneous”

Penutup

Saya pribadi sangat merasa terbantu hingga saat ini dengan adanya Google Colab. Saya jadi tidak perlu repot izin pinjam komputer lab atau mengusulkan pembelian komputer spek tinggi di kantor. Saya sudah menggunakan Colab untuk beberapa projek Deep Learning yang tidak terlalu besar, dan sampai saat ini kesannya positif, lumayan untuk belajar atau bahkan untuk menghasilkan model yang baik di kasus-kasus sederhana. Batasan 12 jam running juga tidak terlalu menghalangi karena dengan spek komputer yang sudah baik, proses running jadi tidak perlu selama itu kok.

Selamat mencoba! dan semoga bermanfaat!

Word Embedding Bahasa Indonesia menggunakan Fasttext (Part 1)

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:

Lalu import di program python menggunakan perintah:

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:

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

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:

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 Part 1.5

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

Template Curriculum Vitae untuk LaTeX

Beberapa waktu lalu saya penasaran dengan tampilan Curriculum Vitae / CV/ Resume yang baik. Di internet ada banyak tampilan dengan beragam format, tapi kali ini saya tertarik untuk membuat CV dengan LaTeX.

Pilihan pertama saya jatuh pada CV buatan Thomas Jansson. Templatenya (file resume.cls) bisa didownload langsung di halaman aslinya atau di daftar template Sharelatex.

Tampilan akhir CV dengan template oleh Thomas Jansson

Jika kalian perhatikan, desainnya sudah sangat baik, elegan, dan terkesan profesional. Cocok untuk CV para profesional yang panjang ataupun para freshgraduate yang belum banyak pengalaman. Hanya saja ada yang kurang menurut saya, yakni warna. Template aslinya hanya menghasilkan CV berwarna hitam putih.

Note: Bagian selanjutnya dari artikel ini akan menjelaskan pengalaman saya mengedit template LaTeX untuk menambahkan theme color pada template CV. Jika ingin langsung menggunakan template yang telah saya edit sehigga dapat berwarna, silakan download file resume.cls di repository berikut.

Mengedit LaTeX template

Berdasarkan banyak tips dalam pemberian warna di CV maka saya berusaha untuk tidak terlalu banyak mewarnai area CV, hanya meng-highlight bagian-bagian yang saya rasa penting untuk diberi warna, yakni teks judul dan teks subjudul pada sisi samping.

Untuk mengedit LaTeX template, kita akan mengedit file resume.cls yang tadi telah kita download. Pertama-tama, tambahkan package yang menyediakan pewarnaan teks pada bagian akhir:

Saya berikan parameter tambahan dvipsnames sehingga kita memperoleh lebih banyak pilihan warna yang memiliki “nama” (jadi tidak perlu menginputkan kode heksadesimal).

Selanjutnya utuk mempermudah penggunaan warna, saya membuat variabel yang menyimpan warna menggunakan perintah \colorlet:

Variabel themecolor adalah variabel yang akan kita gunakan untuk menyimpan warna template yang akan kita gunakan. Sedangkan MidnightBlue adalah warna tema yang saya gunakan untuk CV tersebut.

Note: Jika ingin mengganti warna template CV, ubah MidnightBlue menjadi warna lain sesuai selera

Selanjutnya kita cukup menyisipkan warna template kita ke bagian yang ingin kita beri warna, yakni judul dan subjudul di sisi samping. Di template, untuk mengedit kedua bagian tersebut kita dapat mengedit style yang digunakan, yakni mysidestyle dan mytitle.

Jika diperhatikan, di sini untuk mewarnai text saya menggunakan perintah textcolor{}. Sebenarnya ada dua cara yang dapat digunakan yakni dengan color{} atau textcolor{}, tetapi cara pertama akan membuat eror pada template (text tidak lagi teralinea dengan rapi)

Setelah selesai, template resume.cls sudah akan dapat memberikan warna pada bagian-bagian yang kita tentukan. Jika sebelumnya sudah pernah menggunakan template dari Thomas Janssen, perubahan ini seharusnya tidak akan mengubah apapun kecuali pemberian warna.

Hasil template CV dengan warna tema MidnightBlue

featured image credit: https://www.philippewiget.com


simple neural net

Neural Net in 4 lines! using Scikit-Learn MLPClassifier

See the code below:

That’s right, those 4 lines code can create a Neural Net with one hidden layer! 😐

Scikit-learn just released stable version 0.18. One of the new features is MLPClassifer and you can see in the code above, it’s powerful enough to create a simple neural net program.

That code just a snippet of my Iris Classifier Program that you can see on Github. Of course, in practice, you still need to create loader, pre-process, pre-training, or other modules. But, if you see other python libraries like Keras, Lasagne, or Theano, I think this is the easiest way to create a simple neural net. I said “simple” because when you need to create more complex model that need more complex algorithm or many addons, I think it’ll become difficult to use MLPClassifier. But, for some simple project, I think I’ll choose this scikit tool 🙂

Program Explanation

Line 1: you need to load MLPClassifier

Line 2: we create an object called ‘mlp’ which is a MLPClassifier. We set hidden_layer_size to (10) which means we add one hidden layer with 10 neurons. Then we set solver as ‘sgd’ because we will use Stochastic Gradient Descent as optimizer. Then we set learning_rate_init to 0.01, this is a learning rate value (be careful, don’t confuse with alpha parameter in MLPClassifer). Then the last, we set 500 as the maximum number of training iteration.

Line 3: Train the model

Line 4: Test the model

That’s it! and my first run I got more than 90% accuration in Iris Dataset 🙂 try it!

And actually, you can create “Deeper” neural net with add more layers easily, just change hidden_layer_sizes. For example, hidden_layer_sizes=(10,10,10) will create 3 hidden layer with 10 neuron each.

source image: Flickr