Akhdani Tech Talk 2021 Series #4 – Deteksi Emosi pada teks Chat

Deteksi Emosi pada teks Chat

Oleh: Fildah A., Ikhsan H. Frasetiawan H.

  • Masalah dan Ide

    Bentuk komunikasi teks saat ini merupakan salah satu yang tidak bisa dipisahkan dari kehidupan kita, meskipun ada banyak aspek non verbal yang terkadang tidak mampu ditunjukkan melalui komunikasi teks. Dengan perkembangan AI hingga kini, sangat memungkinkan untuk menggali informasi non verbal dari sebuah teks seperti emosi agar tercipta suatu bentuk komunikasi teks yang lebih komprehensif. Kali ini tim techtalk akan membuat sebuah sistem prediksi emosi sederhana menggunakan machine learning dari data teks.

  • Requirements

  • Python versi 3
  • Modul sklearn
  • Modul nltk corpora
  • Flask
  • Tahap Implementasi

    1. Mencari dataset yang sesuai

    Untuk melakukan sebuah proses supervised learning, dataset yang diperlukan untuk proses training nanti adalah labeled dataset. Terdapat banyak dataset yang sudah dilabeli emosi tersedia secara gratis di internet, misalnya di https://www.kaggle.com/.
    Dataset yang dipilih untuk percobaan kali ini merupakan data tweet dalam Bahasa Inggris yang sudah dilabeli dengan berbagai macam emosi seperti senang, sedih, marah, khawatir, bosan, netral. Untuk menyederhanakan proses training dan prediksi, dipakai hanya data-data yang memiliki label senang, sedih dan netral.

image9Gambar 1. Snippet code untuk load dataset

2. Preprocessing data

Untuk mengoptimalkan proses ekstraksi fitur dan akurasi prediksi, perlu dilakukan ‘pembersihan’ dari kata-kata yang tidak menambah/memiliki makna maupun pengubahan kata menjadi kata dasar. Tahap-tahap preprocessing data meliputi beberapa hal berikut.

  • Memilih data dengan label happiness, sadness dan netral
  • tweet_id sentiment content
    1 1956967666 sadness layin n bed headache ughh waitin call
    2 1956967696 sadness funeral ceremony gloomy friday
    4 1956968416 neutral dannycastillo want trade someone houston ticke...
    6 1956968487 sadness sleep im thinking old friend want married damn...
    8 1956969035 sadness charviray charlene love miss
    ... ... ... ...
    39992 1753918881 neutral jasimmo oo showing french skill lol thing good...
    39993 1753918892 neutral haha yeah twitter many us know ppl care
    39994 1753918900 happiness succesfully following
    39995 1753918954 neutral
    39998 1753919043 happiness wassup beautiful follow peep new hit single ww...
    
    [19012 rows x 3 columns]
  • Penyeragaman huruf kapital menjadi huruf kecil (lowercase)
  •  tweet_id sentiment content
    1 1956967666 sadness layin n bed with a headache ughhhh...waitin on...
    2 1956967696 sadness funeral ceremony...gloomy friday...
    4 1956968416 neutral @dannycastillo we want to trade with someone w...
    6 1956968487 sadness i should be sleep, but im not! thinking about ...
    8 1956969035 sadness @charviray charlene my love. i miss you
    ... ... ... ...
    39992 1753918881 neutral @jasimmo ooo showing of your french skills!! l...
    39993 1753918892 neutral @sendsome2me haha, yeah. twitter has many uses...
    39994 1753918900 happiness succesfully following tayla!!
    39995 1753918954 neutral @johnlloydtaylor
    39998 1753919043 happiness @niariley wassup beautiful!!! follow me!! peep...
    
    [19012 rows x 3 columns]
  • Menghilangkan tanda baca
  •  tweet_id sentiment content
    1 1956967666 sadness layin n bed with a headache ughhhh waitin on...
    2 1956967696 sadness funeral ceremony gloomy friday
    4 1956968416 neutral dannycastillo we want to trade with someone w...
    6 1956968487 sadness i should be sleep but im not thinking about ...
    8 1956969035 sadness charviray charlene my love i miss you
    ... ... ... ...
    39992 1753918881 neutral jasimmo ooo showing of your french skills l...
    39993 1753918892 neutral sendsome2me haha yeah twitter has many uses...
    39994 1753918900 happiness succesfully following tayla
    39995 1753918954 neutral johnlloydtaylor
    39998 1753919043 happiness niariley wassup beautiful follow me peep...
    
    [19012 rows x 3 columns]
  • Menghilangkan stopwords
  •  tweet_id sentiment content
    1 1956967666 sadness layin n bed headache ughhhh waitin call
    2 1956967696 sadness funeral ceremony gloomy friday
    4 1956968416 neutral dannycastillo want trade someone houston ticke...
    6 1956968487 sadness sleep im thinking old friend want married damn...
    8 1956969035 sadness charviray charlene love miss
    ... ... ... ...
    39992 1753918881 neutral jasimmo ooo showing french skills lol things g...
    39993 1753918892 neutral sendsome2me haha yeah twitter many uses know p...
    39994 1753918900 happiness succesfully following tayla
    39995 1753918954 neutral johnlloydtaylor
    39998 1753919043 happiness niariley wassup beautiful follow peep new hit ...
    
    [19012 rows x 3 columns]
  • Mengubah kata ke bentuk kata dasar
  • tweet_id sentiment content
    1 1956967666 sadness layin n bed headache ughhhh waitin call
    2 1956967696 sadness funeral ceremony gloomy friday
    4 1956968416 neutral dannycastillo want trade someone houston ticke...
    6 1956968487 sadness sleep im thinking old friend want married damn...
    8 1956969035 sadness charviray charlene love miss
    ... ... ... ...
    39992 1753918881 neutral jasimmo ooo showing french skill lol thing goo...
    39993 1753918892 neutral sendsome2me haha yeah twitter many us know ppl...
    39994 1753918900 happiness succesfully following tayla
    39995 1753918954 neutral johnlloydtaylor
    39998 1753919043 happiness niariley wassup beautiful follow peep new hit ...
    
    [19012 rows x 3 columns]

image7Gambar 2. Snippet code untuk preprocessing data

3. Ekstraksi fitur

Mesin melakukan pembelajaran melalui suatu proses kalkulasi tertentu yang memetakan antara nilai input dan output dalam bentuk numerik. Dalam percobaan ini data yang akan dibaca tersedia dalam bentuk teks, sehingga perlu dilakukan pengubahan untuk data input (konten teks) maupun outputnya (label) dari teks menjadi nilai numerik.

3.1. Untuk label, proses transformasi dilakukan dengan cara mengubah label menjadi nilai 0…n sesuai banyaknya jenis label berbeda.

image8Gambar 3. Snippet code untuk encoding label

3.2. Untuk data konten teks, dilakukan 2 metode berbeda untuk mengekstraksi fitur-fitur yang dimiliki teks menjadi bentuk numerik yaitu CountVectorizer dan TF-IDF

image5Gambar 4. Snippet code untuk ekstraksi fitur

*CountVectorizer adalah sebuah metode mengubah data teks dengan menghitung banyaknya kemunculan sebuah kata dalam dokumen teks dan kemudian dari nilai hasil kemunculan tiap kata tersebut diubah menjadi bentuk vektor

*TF-IDF adalah sebuah metode mengubah data teks dengan memberikan bobot/nilai terhadap kata berdasarkan seberapa penting kata tersebut dianggap memberikan makna pada kalimat.

4.Melakukan training dan test

Sebelum melakukan training data dan test, dipisahkan terlebih dahulu antara data training dan tes dari dataset yang tersedia dengan rasio 9:1. Ada beberapa model yang dilakukan untuk percobaan, yaitu multinomial naive bayes dan linear svm.

image6Gambar 5. Snippet code untuk split dataset dan fit model

*Multinomial Naive Bayes adalah suatu model klasifikasi berdasarkan teorema bayes dengan mengasumsikan bahwa setiap aspek/fitur dianggap setara.
*Linear SVM adalah model klasifikasi dengan ide untuk mencari sebuah garis pemisah antara kelompok-kelompok vektor

image1Gambar 6. Hasil akurasi model

Model dengan akurasi tertinggi dipilih dan disimpan ke dalam bentuk objek untuk kemudian dipakai melakukan prediksi. Proses menyimpan model menggunakan joblib dari python.

image4Gambar 7. Snippet code dump model menggunakan joblib

5. Membuat web app dengan Flask

Flask merupakan microframework web app untuk python. Model terlebih dahulu di load, lalu dilakukan proses prediksi menggunakan model dan vocab hasil training.

image3Gambar 8. Snippet code app.py

image2Gambar 9. Menjalankan web app

6. Melakukan prediksi menggunakan input random

Setelah web app berhasil dijalankan, selanjutnya kita coba melakukan prediksi dengan input yang kita buat sendiri dengan cara mengetikkan pesan ke dalam textbox yang tersedia.

image11Gambar 10. Tampilan input teks untuk prediksi emosi

image10Gambar 11. Tampilan hasil prediksi

  • Saran pengembangan selanjutnya

  1. Sistem prediksi dengan Bahasa Indonesia
    Pengembangan sistem prediksi dalam Bahasa Indonesia membutuhkan dataset berlabel dan serangkaian langkah preprocessing untuk Bahasa Indonesia. Pada proses pencarian dataset sebelumnya, kami sempat menemukan dataset dengan Bahasa Indonesia. Namun, kami belum sempat eksplorasi lebih jauh mengenai library/modul preprocessing dari python apakah sudah tersedia untuk Bahasa Indonesia.
  2. Disambungkan dengan sosial media
    Sistem prediksi emosi berkaitan erat dengan kegiatan komunikasi teks. Dalam kegiatan sehari-hari kita tentu paling sering melakukan komunikasi teks melalui sosial media. Sistem prediksi emosi mungkin bisa dimanfaatkan untuk meningkatkan kualitas respon chatbot atau sejenisnya. Tentu saja harus dengan pengembangan model ML lebih lanjut agar prediksi bisa lebih akurat.

Sumber :
https://medium.com/the-research-nest/applied-machine-learning-part-3-3fd405842a18
https://towardsdatascience.com/develop-a-nlp-model-in-python-deploy-it-with-flask-step-by-step-744f3bdd7776
https://towardsdatascience.com/naive-bayes-classifier-81d512f50a7c
https://towardsdatascience.com/https-medium-com-pupalerushikesh-svm-f4b42800e989