tutorial fasttext bahasa indonesia

Membuat Model Word Embedding Fasttext Bahasa Indonesia

Artikel ini adalah kelanjutan dari dua artikel sebelumnya, word embedding dengan Fasttext bagian 1 dan word embedding dengan Fasttext bagian 1.5. Pada artikel sebelumnya kita berfokus menggunakan pretrained model Fasttext Bahasa Indonesia menggunakan package gensim dan package Fasttext Python. Kali ini kita akan mencoba membuat model word embedding Fasttext Bahasa Indonesia sendiri menggunakan package Fasttext python.

Apa yang dibutuhkan?

Dalam membuat model word embedding Fasttext Bahasa Indonesia, yang kita butuhkan pertama adalah dataset. Untuk menghasilkan model yang baik, diperlukan dataset yang cukup besar. Karena ukuran dataset yang bisa sangat besar, disarankan menggunakan komputer dengan RAM berkapasitas besar, atau kalau saya pribadi menggunakan Google Colab.

Pada artikel ini kita akan menggunakan dataset dari Wikipedia bahasa Indonesia. Dataset ini cukup besar, saya hanya akan menggunakan sebagiannya saja. Dataset bisa didownload di link berikut:

https://dumps.wikimedia.org/idwiki/latest/idwiki-latest-pages-articles.xml.bz2

Karena itu adalah dataset semua artikel terakhir (latest) bahasa Indonesia yang ada di Wikipedia, maka ukuran dataset tersebut bisa terus bertambah setiap harinya (dataset wikipedia bahasa Inggris ukurannya telah mencapai >10GB), Saya menyediakan dataset Wikipedia bahasa Indonesia dengan ukuran ~500MB yang saya ambil pada tanggal 7 Agustus 2019. Dataset tersebut bisa didownload di sini.

Format dataset yang diminta Fasttext sebenarnya cukup sederhana yakni sebuah text file dengan encoding utf-8 berisi kalimat-kalimat bahasa Indonesia (bisa ditulis beberapa baris berbeda jika konteks dari teks berbeda). Jadi sangat mungkin untuk membuat dataset sendiri jika kesulitan menggunakan dataset yang terlalu besar.

Yang disiapkan juga ada beberapa package yang perlu diinstall. Proses pelatihan model akan dilakukan menggunakan package Fasttext python yang dapat diinstall melalui pip:

pip install fasttext

Kita juga masih membutuhkan package gensim untuk mengolah data Wikipedia yang belum sesuai format:

pip install gensim

Mengolah Dataset

Menggunakan Gensim kita bisa me-load dataset tanpa perlu mengekstraknya terlebih dahulu, menggunakan `WikiCorpus`:

from gensim.corpora import WikiCorpus

dataset = WikiCorpus("idwiki-latest-pages-articles.xml.bz2", lemmatize=False, dictionary={})

Kode di atas menggunakan dataset terbaru dari artikel di Wikipedia, jika menggunakan dataset yang saya sediakan ubah latest menjadi 0708201. Pastikan juga memberi nilai parameter lemmatize menjadi False dan dictionary dengan {}, karena jika tidak proses loading dataset akan sangat lama!

Data asli dari Wikipedia tidaklah sesuai fomat dengan data yang diminta Fasttext. Kita perlu melakukan pengolahan terlebih dahulu. Kode dibawah ini dijalankan untuk mengolah dataset menjadi format yang sesuai:

with open("wiki-id-formatted.txt", 'w', encoding="utf8") as output:
     counter = 0
     for text in wiki.get_texts():
         output.write(' '.join(text)+"\n")
         counter = counter + 1
         if i > 100000: # Hanya mengambil 100,000 artikel pertama
             break

Kode diatas akan membuat file baru bernama `wiki-id-formatted.txt` yang sesuai dengan format Fasttext. Artikel yang sama akan di tulis dalam satu baris yang sama. Saya menghentikan iterasi pada 100,000 artikel saja, hal ini untuk mempercepat proses pelatihan. Saat ini terdapat lebih dari 300,000 artikel Bahasa Indonesia di Wikipedia. Proses di atas di Google Colab berlangsung selama ~8 menit.

Proses Pelatihan

Setelah datasetnya siap, proses pelatihan model word embedding Fasttext Bahasa Indonesia tidaklah sulit. Cukup jalankan perintah di bawah:

import fasttext

model = fasttext.train_unsupervised('wiki-id-formatted.txt', model='skipgram')

Parameter `model=skipgram` adalah pilihan metode atau algoritma untuk membuat model. Selain skipgram, Fasttext juga menyediakan metode `cbow`. Ukuran dimensi secara default adalah 100, untuk mengubahnya tambahkan parameter `dim`, misalnya untuk dimensi 300, tambahkan menjadi:

model300 = fasttext.train_unsupervised('wiki-id-formatted.txt', model='skipgram', dim=300)

Proses pembuatan model dengan 100 dimensi di Google Colab, berlangsung sekitar 110 menit. Karena prosesnya lama, pastikan untuk menyimpan model yang telah jadi menggunakan fungsi `save_model`:

model.save_model("trained_model_id.bin")

Model Fasttext Bahasa Indonesia

Setelah selesai pelatihan maka model yang sudah jadi kini sudah bisa digunakan. Kita bisa mendapatkan vektor kata dengan pemanggilan seperti dictionary, misalnya untuk mendapatkan vektor kata “jakarta”:

vektor = model["jakarta"]<br>print(len(vektor))    # 100 dimensi

Perlu diingat, model word embedding yang kita buat adalah model dari Fasttext python. Model ini sedikit berbeda jika kita membuatnya menggunakan Gensim, model Fasttext Python tidak menyediakan banyak fungsi.

Misalnya di Gensim kita pernah tahu fungsi `most_similar` untuk mencari kata-kata yang berhubungan dengan kata yang kita inputkan, di model Fasttext fungsi itu harus dibuat sendiri. Kita bisa melakukan iterasi dari semua kata yang ada lalu mencari kata dengan cosine similarity nya paling besar.

import math

def vector_len(v):
    return math.sqrt(sum([x*x for x in v]))

def dot_product(v1, v2):
    return sum([x*y for (x,y) in zip(v1, v2)])

def cosine_similarity(v1, v2):
    return dot_product(v1, v2) / (vector_len(v1) * vector_len(v2))

def most_similar(x, top=10):
    v1 = model.get_word_vector(x)
    all_word = []
    for word in model.words:
        if word!=x:
            v2 = model.get_word_vector(word)
            all_word.append((cosine_similarity(v1,v2), word))

 most_similar("jakarta")

Fungsi `most_similar` diatas akan menghasilkan 10 kata yang memiliki kedekatan dengan kata “jakarta” tetapi bukan kata aslinya, haslinya adalah:

[(0.840801029057595, 'dijakarta'),  (0.8405423875198882, 'jakartakota'),  (0.8363113219529306, 'jakartaku'),  (0.7994977235893996, 'bekasi'),  (0.7958654673125232, 'dki'),  (0.791668330422451, 'djokjakarta'),  (0.7700237060903591, 'surabaya'),  (0.7686587449822566, 'yogjakarta'),  (0.7686000712386939, 'jakarte'),  (0.7649450769198526, 'bandung')]

Dan sesuai dengan teori word embedding, ada kata yang secara “bentuk” tidak mirip dengan “jakarta” tetapi memiliki kedekatan secara makna, seperti nama kota: “bekasi”, “surabaya”, dan “bandung”.

Jika ingin mendalami fungsi-fungsi apa saja yang dapat digunakan di model word embedding fasttext, bisa langsung baca dokumentasinya di repository githubnya. Sekian semoga bermanfat 🙂


Featured image: flickr

About the author

Rian Adam

Lecturer at Universitas Islam Indonesia; Machine Learning Enthusiast

View all posts

1 Comment

Leave a Reply