ANALISIS SENTIMEN MENGGUNAKAN POSITIVE-NEGATIVE COUNTS DI PYTHON
Analisis Sentimen adalah salah satu projek yang menarik di bidang Pemrosesan Bahasa Alami (Natural Language Processing). Sentimen Analisis sangat dibutuhkan oleh perusahaan-perusahaan seperti e-commerce maupun perusahaan-perusahaan yang proses bisnisnya menggunakan bantuan teknologi di dalamnya. Sentimen analisis digunakan untuk membantu perusahaan mengetahui seberapa baik dan berapa banyak peminat produk mereka. Kadangkala juga digunakan sebagai masukan untuk memperbaiki produk, bahkan banyak juga digunakan dalam penelitian sederhana, contohnya untuk mengetahui respon masyarakat tentang perkembangan covid-19 dan sebagainya. Tanpa basa-basi lagi, pada tulisan kali ini kita akan membuat sebuah mesin cerdas (supaya diminati) untuk mengklasifikasikan apakah kalimat yang dimasukan bersifat positif atau negatif. Kita akan menggunakan bahasa pemrograman python dan jupyter notebook sebagai code editornya. Persyaratan yang paling utama untuk mengikuti tulisan ini adalah teman-teman harus familiar dengan bahasa python dan beberapa package python untuk machine learning. Kita tidak akan menggunakan framework seperti tensorflow maupun pytorch, saya akan berusaha untuk memulai semuanya dari awal sehingga ketika beralih ke framework teman-teman sudah mengerti apa dibalik framework tersebut.
Untuk melakukan sentimen analisis, ada beberapa hal yang akan kita lakukan yaitu menyiapkan corpus (kumpulan kalimat-kalimat), per-processing data dan disimpan dalam vocabulary (kumpulan kata-kata), feature extraction, dan sebuah model untuk klasifikasi (kita akan menggunakan model logistic regression). Sederhananya, kita memiliki kalimat-kalimat yang nantinya akan di proses untuk mendapatkan kata-kata yang berguna dan dimasukan ke dalam vocabulary. Dikatakan berguna karena biasanya dalam sebuah kalimat terdapat kata-kata tambahan seperti kata hubung, koma, titik, tanda Tanya, tanda seru dan sebagainya yang tidak terlalu penting. Kata-kata atau tanda-tanda tersebut akan dihapus agar data-data yang dilatih tidak terlalu banyak. Setelah diproses datanya, kita akan melakukan feature extractor. Komputer hanya bisa menerima inputan berupa angka, sehingga kita harus merubah setiap kata-kata menjadi angka. Hal inilah yang akan kita lakukan pada tahap feature extractor. Setelah itu kita akan melatih mesin kita menggunakan algoritma logistic regression. Algoritma ini dipilih karena sederhana dan mudah dicerna oleh awam. Let’s get started.
Langkah pertama yang akan kita lakukan adalah mengimport beberapa library yang berguna dalam pemrosesan data. Jika teman-teman belum memiliki, saya sarankan untuk mendownloadnya terlebih dahulu melalui jupyter notebook, pip maupun code editor yang dipakai. nltk atau natural language toolkit adalah library yang sangat berguna dalam pemrosesan data seperti menghapus stopwords (kata-kata tidak terlalu penting), stemming (mengembalikan kata ke bentuk aslinya) dan sebagainya. NLTK juga menyiapkan dataset yang akan kita gunakan yaitu dataset twitter atau twitter_samples. Lalu kita juga memiliki fungsi tambahan yang sudah dibuat yaitu process_tweet, build_freqs.
Inti dari kedua fungsi disamping adalah untuk memproses data agar dapat di baca oleh komputer lebih mudah. def process_tweet() adalah fungsi untuk memproses kata-kata yang tidak terlalu penting untuk dilatih. Karena data-data kita diambil dari aplikasi twitter, maka hastag adalah tanda-tanda yang tidak penting dalam kalimat, hashtag juga tidak terlalu berguna dalam memprediksi kata-kata. Dalam fungsi ini juga akan dilakukan proses penghapusan stopword, punctuation, stemming. Sedangkan pada fungsi def build_freq() akan menghitung frekuensi setiap kata-kata yang muncul pada kata-kata yang kita miliki. Kata-kata tersebut akan disimpan dalam bentuk dictionary python.
Kita bisa lihat pada gambar diatas, kalau tanda-tanda seperti hastag dan url telah hilang ketika dilakukan pemrosesan tweet. Biasanya pada kasus asli, kita harus melakukan pemrosesan tweet sendiri dan harus menyesuaikan dengan kasus kita secara spesifik.
Selanjutnya kita akan menyiapkan data-data untuk keperluan training dan testing. Pembagian untuk test set = 20% dan train set = 80% mengikuti tradisi umum atau pembagian yang sering dipakai yaitu 80/20. Hasi akhir pembagiannya adalah data untuk training adalah 8000 data sedangkan data untuk testing adalah 2000 data, sehingga total keseluruhan adalah 10000 data.
Kemudian kita akan membuat label sendiri. Ini adalah hal yang tidak direkomendasikan, karena pada kasus nyata pada supervised learning kita memiliki data sekaligus dengan labelnya. Tetapi karena kita telah mengtahui, dan sudah dipisahkan oleh library NLTK data positif dan negatif, sehingga kita bisa dengan mudah melabelinya. Yang positif diberi label 1, sedangkan negative diberi label 0. Kita menggunakan fungsi pada numpy yaitu ‘np. Ones dan np zeros’ lalu menggabungkan mereka dalam satu matriks dan disimpan dalam variable y_train dan y_test.
Pada gambar dibawah kita membangun fungsi sigmoid kita sendiri dan fungsi gradient descent. Biasanya pada framework keras, tensorflow, dan pytorch sudah menyediakan fungsi tersebut. Fungsi sigmoid adalah jantung dari algoritma logistic regression. Singkatnya fungsi yang digunakan logistif regression adalah sigmoid. Sigmoid berfungsi untuk mengubah data-data yang linear menjadi non-linear yang dapat menghasilkan keluaran bersifat kategori. Sederhananya, dalam kasus sentiment analisis, kita bisa menggunakan sigmoid untuk memprediksi apakah keluaran yang dihasilkan berupa sentiment yang positif (1) ataupun negative (0), biasa disebuh binary classification problem. Setelah mendefinisikan fungsi, kita akan membangun modelnya. Model yang dibangun, kita masukan ke dalam fungsi dengan nama gradientDescent(). Pada fungsi ini, dibutuhkan parameter x (input kita), y (label kita), lr(seberapa cepat mesin mencari solusi optimal), dan num_iter(berapa kali perulangan yang akan dilakukan dalam mencari solusi optimal). Langkah pertama dalam perulangan adalah mengalikan input kita dengan sesuatu nilai (theta). Selalu nilai tersebut akan bersifat linear. Oleh karena itu, kita akan mentranform ke non-linear dengan sigmoid. Sigmoid akan mengembalikan rentang nilai antara 0–1. Setelah mendapatkan nilai untuk iterasi pertama, kita akan menghitung kesalahan yang dimiliki parameter (theta), setelah diketahui kesalahannya, lalu diupdate parameternya, dan diharapkan dapat menurunkan tingkat kesalahannya. Fungsi ini mengembalikan nilai kesalahannya terakhir –hanya untuk pengecekan, dan theta atau parameter yang digunakan untuk prediksi.
Kemudian kita akan membuat fungsi untk mengekstrak features-features atau kata ke dalam angka sehingga bisa dipahami oleh komputer. Cara terbaik untuk melakukannya adalah dengan teknik positive dan negative count.
Kita pada awalnya sudah memiliki vocabulary, yaitu ketika kita melakukan process_tweet, kemudian kita juga sudah memiliki frequensi dari tiap-tiap kata yang muncul. Misalnya pada gamar diatas, kata Happy pada positif berjumlah 2, sedangkan negative tidak mengandung kata happy. Kata-kata tersebut akan dijumlahkan, dengan mencocokan setiap kalimat yang ingin diprediksi.
Misalnya, kalimat yang ingin diprediksi adalah “I am sad, I am not learning NLP”. Kita melihat pada vocabulary, teryata hanya kata happy dan because yang tidak ada di kalimat yang ingin diprediksi. Sehingga, kalimat yang ada sajalah yang dijumlahkan. Pada tahap ini, frequensi dari tiap-tiap kata tersebut akan di buat ke dalam tiga dimensi, dengan cara menjumlahkan semua kata yang muncul pada setiap kelas. Dimensi pertama adalah bias, dimensi kedua adalah penjumlahan dari positive, dan ketiga adalah penjumlahan dari negative yang muncul. Setiap kata yang ingin diprediksi harus melewati tahap ini, kemudian baru bisa diprediksi.
Tahap yang paling penting adalah training model. Hal pertama yang dilakukan adalah kita menyiapkan satu matriks X, supaya memastikan dimensi dari kata yang ada hanya tiga dimensi. Lalu kita melakukan perulangan untuk memasukan setiap data training kita dan frekuensi dari setiap kata, kemudia di ekstrak. Sekarang feature X sudah berisi vector 3 dimensi dengan setiap kata-kata sudah direpresentasikan dengan angka yang ada.
Jangan lupa untuk meng-kopi labelnya. Setelah itu, kita memanggil model kita yaitu gradientDescent(), lalu masukan setiap parameter yang diperlukan kemudian di jalankan. Pada akhir dari training, ternyata cost kita atau tingkat kesalahannya adalah 2%, dengan demikian model yang kita gunakan sudah bagus. Ditampilkan juga bobotnya, yang akan menjadi kunci untuk prediksi kita.
Setelah model di training, kita akan melakukan testing model kita menggunakan data testing yang sudah kita bagi di awal-awal. Kita menyiapkan fungsi predict_tweet(), menerima kata-kata yang ingin diprediksi, frequensinya dan theta (weight dari bobot kita). Lalu di ekstrak, dan diprediksi menggunakan fungsi sigmoid. Kita akan menghitung akurasi atau ketepatan model kita bekerja dengan data-data testing. Setelah diprediksi, hasil dari prediksi akan masuk ke dalam kondisi, jika hasil dari prediksi adalah 0.5 maka akan disimpan angka 1 ke dalam y_hat atau tempat simpan setiap prediksinya kita yang berarti prediksi kita benar. Jika hasil prediksinya kurang dari 0.5 bahkan menghasilkan minus, maka akan mengembalikan angka 0 atau hasil prediksinya salah. Untuk menghitung akurasi, maka intusinya adalah akurasinya akan bagus jika rata-rata dari jawabn model kita sama dengan y_test atau label dari data testing atau jawaban dari data testing dengan kata lain hasil yang diprediksi model harus sama dengan jawaban aslinya. Dan pada akhirnya, model kita mencapai angka 0.99 atau 99% menjawab benar dan 1% menjawab salah.
Meskipun model kita mencapai angka yang sangat bagus dalam melakukan prediksi dengan data testing, tetapi model dikatakan sangat powerfull ketika model dapat memprediksi data-data yang tidak pernah dilihatnya. Oleh karena itu kita akan mencoba memprediksi menggunakan kata-kata sendiri.
Selamat!, kalian telah berhasil melakukan analisis sentimen menggunakan contoh data yang sangat sederhana. Kalau kalian masih bingung, silahkan kunjungi github saya untuk mendownload kodenya. Terima kasih sebelumnya.
Github: https://github.com/joanitolopo/sentimen-analisis
Twiter: https://twitter.com/LopoJoanito
LinkeIn: https://www.linkedin.com/in/joanito-agili-lopo-72629b1b2/
Sumber: Tulisan ini adalah dokumentasi dari kursus Natural Language Processing Specialization di deeplearning.ai