Explore Analyst Data Use NLP

Yudistira Dwi Permana
4 min readDec 11, 2023

--

haloo teman-teman, saya coba untuk menuliskan pengalaman saya dalam mengeksplorasi data menggunakan metode NLP, sebelum kita lebih lanjut kita bahas sedikit apa sih NLP itu berdasarkan yang ada di wikipedia NLP (Natural language processing) adalah cabang ilmu komputer, linguistik, dan eitss baca sendiri aja ada kok di wikipedia hehe jadi sederhananya adalah program pengolahan bahasa manusia oleh mesin..

oke kalo sudah berkenalan teorinya maka langkah selanjutnya saatnya saya membagikan pengalaman saya dalam explorasi data menggunakan NLP. Untuk hal pertama yang temen temen lakukan tentunya harus menyiapkan dataset yang akan di explorasi, referensi : Kaggle, Google Dataset, UCI ML. oh ya disini saya menggunakan google colab ya :). Clear ? kita lanjut ya.

Untuk step pertama membaca dataset yang kita explorasi, untuk caranya adalah kita bakalan mount gdrive kita ke google colab.

from google.colab import drive
drive.mount('/content/drive')

ketika sudah kita auth akun email drive yang kita pakai, lalu kita upload dataset dan buat satu folder khusus agar memudahkan temen-temen untuk mencari lokasi folder yang akan dipakai. nah kenapa si menggunakan cara ini karena pengalaman saya ketika kita menaruh langsung kedalam path/folder local yang disediakan pada google colab ketika project sessionnya terminate maka dataset yang kita upload bakalan hilang, dan cara diatas sebenarnya salah satu alternatif saja, temen temen bisa explorasi sendiri yaa :))

df = pd.read_csv('/content/drive/MyDrive/../Dataset/Corona_NLP_test.csv')

nah potongan kode diatas adalah ketika kita akan membaca dataset, oh ya berikut dataset yang saya gunakan ya : dataset. Berikut untuk cara mendapatkan alamat path yang telah kita buat foldernya di gdrive kita :

Gambar 1.1 Copy Path File

Setelah sudah dibaca datasetnya lalu kita cari nilai column yang tidak kita perlukan atau biasa dibilang teknik ini adalah teknik data cleaning gunanya apasi ? agar data yang nanti kita learning atau yang kita analisis tidak menyebabkan noise. caranya yang saya gunakan seperti berikut :

df = df.drop(columns=['UserName', 'ScreenName', 'Location', 'TweetAt'])

oke ketika sudah di drop hanya tersisa dua column, lalu disini saya melihat masih terdapat duplicate category pada column sentiment “Extremely negative”dan “negative” untuk menghilangkan itu saya mendefinisikan ulang..

def sentiment_categories(category):
if category=='Extremely Negative' or category=='Negative':
return 'Negative'
elif category=='Neutral':
return 'Neutral'
else:
return 'Positive'

df['Sentiment']=df['Sentiment'].apply(sentiment_categories)

nah potongan .apply diatas merupakan aksi untuk merubah nilai column sentiment menjadi def yang telah saya buat.

setelah saya definisikan saya mendetailkan nilai positive, negative, dan neutral menjadi bernilai 1 ketika kondisi terpenuhi, bernilai 0 jika kondisi tidak terpenuhi.

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

akhirnya dataframe yang akan di explore sudah siap, langkah selanjutnya adalah saya mendefinisikan deskripsi dan label yang akan di klasifikasi

description = df_baru['OriginalTweet'].values
label = df_baru[['Negative', 'Neutral', 'Positive']].values

lalu saya membagi validation set sebesar 20% dari total data dengan menggunakan sklearn seperti ini

description_latih, description_test, label_latih, label_test = train_test_split(description, label, test_size=0.2)

setelah melakukan split data lalu saya gunakan tokenizer untuk memproses larik deskripsi diatas menjadi token ( numerik )

tokenizer = Tokenizer(num_words=10000, oov_token='x')
tokenizer.fit_on_texts(description_latih)

sekuens_latih = tokenizer.texts_to_sequences(description_latih)
sekuens_test = tokenizer.texts_to_sequences(description_test)

padded_latih = pad_sequences(sekuens_latih, maxlen=30, padding='post', truncating='post')
padded_test = pad_sequences(sekuens_test)

nah untuk parameter num_words diatas adalah jumlah kata yang akan dikonversi menjadi token atau numerik. parameter maxlen adalah sebuah larik yang sudah dikonversi menjadi token. ingat kembali ketika saya mengklasifikasi gambar hanya input gambar dengan size yang sama yang bisa ditraining begitu pula dengan text klasifikasi itulah fungsi pad sequen agar menjadikan panjang kalimat sama panjang.

and last but not least doing is making the layerss :) oke its very important use embedding because what ? kunci dari klasifikasi teks adalah layer embedding karena memungkinkan memahami model yang akan ditraining. kurang lebih potongan kode seperti berikut :

model = tf.keras.Sequential([
tf.keras.layers.Embedding(input_dim=8000, output_dim=32),
tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(64, recurrent_dropout=0.2, return_sequences=True)),
tf.keras.layers.LSTM(64),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(32, activation='relu'),
tf.keras.layers.Dropout(0.5),
tf.keras.layers.Dense(3, activation='softmax')
])

model.compile(loss='categorical_crossentropy',optimizer="adam",metrics=['accuracy'])

kurang lebih embedding dengan tokenizer sama yaa butuh input panjang kalimat dan untuk mengoptimalkan saya menggunakan layer dropout dan bidirectional layer. karena disini mengklasifikasi text dengan 3 kategori maka kita gunakan categorical crossentropy untuk temen temen yang menggunakan dua kategori bisa menggunakan “binary_crossentropy” dan terakhir menggunakan adam sebagai optimizer. and the lasttt stepp !! kita lihat seberapa akurasi dan validasi model yang kita latih :

num_epochs = 30
history = model.fit(padded_latih, label_latih, epochs=num_epochs,
validation_data=(padded_test, label_test),
batch_size=128,
steps_per_epoch=25,
validation_steps=5,
verbose=2)

dan setelah saya training kita akan melihat bahwa akurasi pada data test lebih besar dibanding dengan akurasi pada data train. Kenapa bisa ? oke kita lanjutkan dulu untuk membuat plot history modelnya dulu ya dengan kode berikut :

plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['train', 'test'], loc='upper right')
plt.show()
Gambar 1.2 Plot History Model

dan setelah saya selidiki ternyata dataset yang gunakan overfitting kurang seimbang atau yang saya dapatkan solusi pada googling ternyata “get more data” yang artinya adalah ganti dataset huaahh capek capek yaah sudah dioptimalkan dengan bidirectional layer ternyata hasilnya masih overfitting.

--

--