Friday, March 29, 2019

Word Embedding dan Implementasinya dalam Python (Keras)

Tulisan ini merupakan implementasi dari tulisan sebelumnya, "Vektor dari Kata dan GloVe Embedding". Word embedding merupakan representasi dari kata. Dua teknik yang paling umum dipakai dalam word embedding telah dipaparkan sebelumnya: vektor kata dan GloVe embedding. Tulisan ini adalah implementasi dari teknik tersebut dengan menggunakan bahasa pemrograman Python dan modul Keras.

Misalkan kita punya kumpulan lima kata-kata baik dan enam kata-kata jelek seperti dibawah. Kata-kata baik kita labelkan dengan angka "1" sedangkan kata-kata jelek kita labelkan dengan angka "0".

import numpy as np
kata = ["Bagus!", "Ampuh!", "cantik!", "Mantap!", "Cakep!", 
        "Jelek", "Rusak", "Nol", "Omong kosong", "Busuk", "Tidak"]
label = np.array ([1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0])

Kemudian kata-kata di atas kita rubah menjadi integer
# merubah kata menjadi integer
from keras.preprocessing.text import one_hot
vocab_size = 50
encoded_docs = [one_hot(d, vocab_size) for d in kata]
print(encoded_docs)

Karena panjang maksimal dari elemen kata adalah dua buah (yakni kata "Omong kosong"), kita jadikan kata-kata lainnya memiliki panjang dua buah kata.

from keras.preprocessing.sequence import pad_sequences
max_length = 2
padded_docs = pad_sequences(encoded_docs, maxlen=max_length, padding='post')
print(padded_docs)
.
Hasilnya adalah sebagai berikut,
array([[ 3,  0],
       [24,  0],
       [26,  0],
       [40,  0],
       [44,  0],
       [34,  0],
       [13,  0],
       [20,  0],
       [14,  7],
       [43,  0],
       [49,  0]], dtype=int32)
Jika tanpa pad_sequene, maka nilai '0' tidak akan tercetak pada array diatas. Sama dengan mencetak variable 'encoded_docs'

Kita sekarang sudah siap untuk mencari word embedding dari kata-kata yang kita definisikan di atas tadi.
Kita buat model JSTnya sebagai berikut,
from keras.models import Sequential
from keras.layers import Embedding, Flatten, Dense
model = Sequential()
model.add(Embedding(vocab_size, 8, input_length=max_length))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
# compile model
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])
# lihat rincian model
print(model.summary())

Kemudian, kita latih sebagai berikut,
# fit/latih model
model.fit(padded_docs, label, epochs=50, verbose=0)
# evaluasi model
loss, accuracy = model.evaluate(padded_docs, label, verbose=0)
print('Accuracy: {}'.format(accuracy*100))

Hasilnya adalah sebagai berikut,
Accuracy: 90.909094

Jadi, dengan word embedding ini, kata-kata baik dan kata-kata jelek dapat dikenali dengan baik. Ini masih contoh yang sangat sederhana, namun dapat diaplikasikan pada kasus yang lebih luas. Misalnya pada sentiment analysis di twitter.


Referensi;
https://mubaris.com/posts/word2vec/
Related Posts Plugin for WordPress, Blogger...