Dari dulu Manusia berkomunikasi dengan lisan, tulisan, bahkan dapat dengan menggunakan gerakan yang memanfaatkan visual. Lalu bagaimana jika komputer juga dapat berkomunikasi dengan manusia? Bukan dengan cara manusia yang memahami mesin, tetapi dengan membuat mesin yang memahami manusia. Membuat mesin dapat belajar dengan sendiri agar dapat berkomunikasi dengan manusia.

Natural Language Processing (NLP) adalah salah satu machine learning yang memanfaatkan data dalam bentuk kumpulan kata atau kalimat. Data tersebut akan digunakan untuk pelatihan mesin agar mesin dapat membaca, memahami, dan mengolah kembali tulisan manusia. Dengan kata lain, NLP bertujuan agar mesin dapat mempelajari bagaimana manusia berkomunikasi.

Setelah ini kita akan menggunakan NLP untuk membuat model yang dapat membedakan review positif dan review negatif dari sebuah film.


Mempersiapkan Data


Data akan diambil dari kaagle.com, yaitu data dari kumpulan review film dengan sentiment positif dan negatif untuk membedakannya.

Download data training nya disini

Masukan data yang berbentuk csv ke dalam variable dataframe dengan memberikan path data tersebut.

import panda as pd
df = pd.read_csv('/content/drive/My Drive/datasets/IMDB 50K Movie Reviews (TEST your BERT)/train.csv)

Coba kita tampilkan summary data tersebut, dan hasilnya seperti dibawah ini.

“Summary Data Movie dari Kaggle”
Summary Data Movie dari Kaggle

Pandas adalah library yang digunakan untuk memanipulasi dan menganalisis data. Fungsi read_csv() digunakan untuk memasukan data kedalam bentuk csv untuk diolah di langkah selanjutnya. Dengan menuliskan variable dataframe yang telah dimasukan dataset kedalamnya dapat menampilkan 5 data teratas dan 5 data terbawah.

Ubah bentuk data pada kolom sentiment menjadi bentuk angka untuk labeling setiap data.

cat = pd.get_dummies(df.sentiment)
df = pd.concat([df, cat], axis=1)
df = df.drop(columns='sentiment')

Ketika kita lihat datanya, terjadi perubahan kolom dari sentiment ke 2 kolom berbeda yaitu pos dan neg.

“Tambahan informasi kolom pos dan neg”
Tambahan informasi kolom pos dan neg

Fungsi get_dummies() digunakan untuk membuat kolom yang dipilih diubah ke dalam bentuk binary sebagai label. Membuat kolom baru dengan nama data yang berisi 1 atau 0. Setelah membuat data tersebut, dimasukan ke dalam dataframe dengan fungsi concat() dan menghilangkan kolom sebelumnya dengan fungsi drop().

Setelah itu kita akan menghitung jumlah kata yang terdapat pada kolom text dengan membuat fungsi sendiri. Fungsi penghitungan kata ini akan digunakan sebagai bentuk dari data. Hasil dari fungsi ini akan digunakan sebagai patokan dalam membuat input layer pada model.

from collections import Counter

def wordCount(text):
  count = Counter()
  for i in text.values():
    for word in i.split():
      count[word] += 1
  return count

text = df.text
counter = wordCount(text)

num_word = len(counter)
print(numword)
#280617

Jumlah kata yang ada pada keseluruhan datanya adalah 280617.


Memisah Data Ke Beberapa Bagian


Setelah data siap digunakan, data dipisah untuk mebedakan data untuk training dan data untuk testing. Setiap data pada training dan validation akan dipisah data teks dan labelnya.

from sklearn.model_selection import train_test_split

text = df['text'].values
y = df[['pos','neg']].values
text_train , text_test, y_train, y_test = train_test_split(text, y, test_size=0.2)

Fungsi train_test_split() akan memisahkan data secara otomatis dengan memberikan parameter data yang akan dibagi. Pada kode diatas data akan dibagi 80% untuk training dan 20% untuk testing.


Tokenisasi dan Pengurutan


Tokenisasi (Tokenizer) digunakan untuk mengubah setiap huruf pada setiap kata ke dalam angka tertentu seperti pada format ASCII.

from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences

tokenizer = Tokenizer(num_words=280617, oov_token='-')
tokenizer.fit_on_texts(text_train)
tokenizer.fit_on_texts(text_test)

Parameter oov_token akan digunakan apabila ada huruf yang tidak dapat ditokenisasi dengan baik. Huruf tersebut akan diubah menjadi karakter yang tadi kita tentukan ('-').

Pada tokenisasi terdapat masalah apabila sebuah kata memiliki jumlah dan huruf yang sama seperti “karus” dan “rusak”. Mesin akan membeca kedua kata tersebut adalah sama, maka dari itu kita membutuhkan Pengurutan (sequences).

Pengurutan (sequences) akan menampung setiap token yang ada ke dalam bentuk array. Dengan begitu masalah sebelumnya dapat terselesaikan.

seq_train = tokenizer.texts_to_sequences(text_train)
seq_test = tokenizer.texts_to_sequences(text_test)

Pada array yang dibuat dengan sequences memiliki panjang yang berbeda-beda dan membuat penginputan data akan menjadi sulit. Kita harus menyamakan panjang pada setiap sequences. Proses penyamaan panjang (resize) bisa disebut juga dengan padding.

Padding akan menyamakan panjang data pada setiap sequences.

pad_train = pad_sequences(seq_train,
                          maxlen=300,
                          padding='post',
                          truncating='post')

pad_test = pad_sequences(seq_test,
                         maxlen=300,
                         padding='post',
                         truncating='post')

Embedding Layer


Perancangan Model kali ini akan menggunakan Embedding yang merupakan inti dari klasifikasi teks kali ini. Embedding membuat model dapat memahami makna dari sebuah kata, dan mengelompokan kata yang maknya mirip agar berdekatan.

Seperti kata “keren”, “bagus”, dan “mantab” akan di kelompokan berdekatan karena memiliki makna positif.

from tensorflow.keras import layers
from tensorflow.keras import Sequential

model = Sequential([layers.Embedding(280617, 64, input_length=300),
                    layers.LSTM(64, dropout=0.1),
                    layers.Dense(128, activation='relu'),
                    layers.Dense(64, activation='relu'),
                    layers.Dense(2, activation='sigmoid')])
model.summary()

Pada kode diatas akan sebagai memasukan Embedding Layer sebagai input layer. Parameter pada input layer disesuaikan dengan bentuk data yang akan dimasukan.

“Hasil Summary Setelah Embedding Layer”
Hasil Summary Setelah Embedding Layer


Training Model


Sebelum melakukan training, compile terlebih dahulu model yang sudah dirancang tadi.

model.compile(loss='binary_crossentropy',
              optimizier='adam',
              metrics=['accuracy'])

Untuk parameter loss kita menggunakan "binary_crossentropy" karena kita hanya mengklasifikasikan 2 jenis yaitu review positif dan review negatif. Jika ingin menggunakan 3 jenis atau lebih klasifikasi dapat menggunakan "categorical_crossentropy".

Pada saat training menggunakan fit(), masukan data teks yang telah di padding beserta labelnya.

history = model.fit(pad_train, y_train,
                    epochs=10,
                    validation_data=(pad_test, y_test),
                    verbose=2)

Saat proses pelatihan kita dapat melihat sekilas akurasi, dan loss yang ada pada setiap epoch pada gambar dibawah ini.

“Akurasi Model Trainig”
Akurasi Model Trainig

Epoch sendiri adalah jumlah dari pelatihan yang dilakukan oleh model dalam sekali jalan. Jadi ketika kita memberikan parameter 10 pada epoch, maka model akan melatih data sebanyak 10 kali.


Model Evaluation


Untuk evaluasi pelatihan model, kita akan menggunakan matplotlib untuk membuat grafik histori dari pelatihan sebelumnya.

import matplotlib.pyplot as plt

plt.plot(history.history['accuracy'])
plt.plot(history.histroy['val_accuracy'])

plt.title('Model Accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')

plt.legend(['Train', 'Test'], loc='lower right')
plt.show()

Dan berikut adalah hasil nya!

“Diagram Akurasi Dengan Matplotlib”
Diagram Akurasi Dengan Matplotlib

Terlihat pada grafik, akurasi yang didapat saat pelatihan sempat naik hampir menyentuh 85% dan turun Kembali hingga di bawah 55%. Artinya model yang kita buat belum sempurna.

Untuk meningkatkan akurasi model, kita dapat memodifikasi rancangan model yang sebelumnya atau menambahkan epoch pada saat pelatihan. Epoch ditambahkan agar mesin mendapatkan waktu lebih untuk belajar.

. . .

Dalam pembuatan model machine learning trial-and-error sangat diperlukan agar mencapai bentuk yang sempurna. Seperti yang sudah anbi jelaskan di postingan yang lalu Tahapan Dalam Membuat Model Machine Learning.

Untuk hasil kode notebook nya akan saya post di github AnbiDev. Terima kasih. Dimana ada kemauan disana ada jalan.