Melanjutkan Training Extend FastText Model

Artikel kali ini membahas bagaimana cara melanjutkan training atau extend Fasttext model yang sudah ada, dengan menambahkan dataset baru. Pada artikel sebelumnya, Word embedding dengan Fasttext bagian 1.5, telah dibahas cara menggunakan model pre-trained Fasttext word embedding dalam Bahasa Indonesia yang disediakan oleh Facebook. Manfaat dari extend model adalah kita bisa menambahkan kosa kata baru ke dalam vocabulary model pre-trained Fasttext, tanpa perlu train ulang dari awal.

Definisi model pre-trained di sini tidak terbatas pada model pre-trained yang disediakan Facebook, tapi bisa juga berupa model word embedding Fasttext yang sudah kita train sendiri sebelumnya. Namun untuk contoh, akan digunakan model pre-trained Fasttext Bahasa Indonesia dari Facebook.

  1. Load Pre-Trained Model FastText dari Facebook
  2. Cek Model Awal
  3. Menyiapkan Dataset
  4. Extend Model
  5. Cek Model Setelah di-Extend

1. Load Pre-Trained Model FastText dari Facebook

Fungsi untuk melakukan extend model ini hanya disediakan oleh library Gensim. Maka jika kita ingin meng-extend model pre-trained dari Facebook, sebelumnya kita perlu meload model tersebut dalam format Gensim. Penjelasan tentang pemakaian Gensim pernah dibahas pada artikel Word embedding dengan Fasttext bagian 1.

Pada contoh kode di bawah ini, saya menggunakan model FastText untuk Bahasa Indonesia dengan dimensi vektor 300, yang bisa didownload di Models for 157 language, dengan nama file “cc.id.300.bin“. Kemudian untuk memperingan proses, dimensi dirubah ke ukuran 50 dengan cara seperti yang tertulis juga di Adapt the dimension.

# Install gensim:
!pip install --upgrade gensim

# Load pre-trained FastText Facebook dim 50:
from gensim.models.fasttext import load_facebook_model
fb_model = load_facebook_model("cc.id.50.bin") 

2. Cek Model Awal

Sebelum lanjut, cek terlebih dahulu properti model awal yang akan di-extend, dengan memprint variabel objek model, contoh di bawah yakni fb_model. Terlihat bahwa model pre-trained yang saya gunakan memiliki vocab sebanyak 2 juta kata unik di dalamnya.

Kemudian, saya menentukan sebuah kata yang tidak ditemukan pada vocab model pre-trained, variabel term. Sebagai contoh di bawah ini saya gunakan kata Quran). Kata ini random saja saya pilih, yang penting kata tidak terdapat dalam vocab, sehingga nantinya bisa membuktikan bahwa kita berhasil melanjutkan proses extend training FastText.

# cek model awal
print(fb_model) # FastText(vocab=2000000, size=50, alpha=0.025)

# cek kata OOV (Out of Vocab)
import numpy as np
term = 'Quran)'
if term in fb_model.wv.vocab:
  print(True)
  print("Kata " + term + " sudah ada di Vocab"
else:
  print(False)
  print("Kata " + term + " belum ada di Vocab") 

# simpan vektor awal dari term
old_vect = np.copy(fb_model.wv[term])

Perlu diingat bahwa model pre-trained dari Facebook ini sudah memiliki vocab yang cukup banyak, karena diekstrak dari corpus wikipedia bahasa Indonesia yang cukup lengkap. Sehingga pada umumnya, kita tidak perlu lagi menambahkan corpus untuk melakukan task-task NLP sederhana.

3. Menyiapkan Dataset

Dataset baru yang saya gunakan yakni terjemahan Al-Quran bahasa Indonesia yang saya peroleh dari github Indonesian-NLP-resources , dan terdiri dari 6249 kalimat. Corpus ini kemudian disimpan ke dalam list new_sentences, dan tiap kalimat dipecah token kata-nya berdasarkan spasi yang juga disimpan dalam list. Sehingga struktur yang digunakan untuk menyimpan corpus ini adalah list of lists of tokens (string). Selain list of lists, kita bisa juga membaca corpus file secara langsung, yakni dengan parameter corpus_file pada dokumentasi FastText train Gensim.

Pada tahap ini saya tidak melakukan pre-processing apapun terhadap dataset baru, namun bisa juga jika kita ingin melakukannya untuk menyederhanakan ukuran vocab misalnya dengan lowercase, clear punctuation, dsb.

# https://github.com/kirralabs/indonesian-NLP-resources
# corpus Quran translate Indonesia
with open(path+'id.indonesian.txt') as f:
  # list of lists of tokens
  new_sentences = [line.rstrip().split() for line in f]

4. Extend Model

Proses extend training FastText menggunakan dua fungsi ini: model.build_vocab dan model.train. Fungsi build_vocab adalah fungsi untuk menambahkan vocab dari dataset baru ke vocab model. Jika kita print object fb_model setelah menjalankan fb_model.build_vocab, maka akan terlihat bahwa jumlah vocab sudah mengalami perubahan. Akan tetapi, proses ini sebenarnya hanya menambahkan key vocab, namun tidak merubah vektor embeddingnya.

Fungsi train adalah fungsi yang dibutuhkan untuk melakukan training lanjutan ke fb_model. Pada bagian ini terdapat parameter epochs, yang kita isikan dengan banyak epoch yang ingin di-set untuk melakukan training. Selain men-set nilai epoch sendiri, parameter ini bisa juga diisikan dengan fb_model.epochs, yang berarti jumlah epoch menyesuaikan model awal.

# Update vocabulary
fb_model.build_vocab(new_sentences, update=True)

# Extend training
print("Mulai training...")
fb_model.train(new_sentences, total_examples=len(new_sentences), epochs=2)
print("Selesai training...")

5. Cek Model Setelah di-Extend

Setelah proses training selesai, kita pastikan bahwa model berhasil melakukan extend training. Jika kata “Quran)” yang berasal dari dataset baru, ada dalam vocab model FastText dan nilai vektornya berubah, maka kita telah berhasil melakukan extend training pada pre-trained FastText model kita dengan dataset baru.

# Kalau True, term sekarang ada di vocabulary model
if term in fb_model.wv.vocab:
  print(True)
  print('Kata baru ' + term + ' sekarang ada di vocabulary')

# Kalau False, vektor sudah berubah
new_vect = fb_model.wv[term]
 # vektor term setelah train
if np.allclose(old_vect, new_vect, atol=1e-4):
  print(True)
  print('Vektor belum berubah, model belum belajar')
else:
  print(False) 
  print('Vektor berubah, model telah belajar')

About the author

Rochana Prih Hastuti

View all posts

Leave a Reply