Setelah pada artikel sebelumnya kita sudah belajar bagaimana cara membuat model sentiment analysis dengan algoritma machine learning. Kita juga sudah mencoba untuk melakukan prediksi dengan teks yang kita masukkan sendiri. Namun, menggunakan terminal untuk melakukan analisis tentu akan sulit dilakukan dan dipahami oleh sebagian orang. Dalam artikel ini, kita akan membuat aplikasi web sederhana untuk analisis sentimen menggunakan Streamlit. Dengan aplikasi ini kita bisa memilih model yang ingin mereka gunakan, dan melakukan prediksi sentimen berdasarkan teks yang dimasukkan, semuanya ditampilkan dengan cara yang lebih interaktif.
Baca juga : https://emhaihsan.hashnode.dev/sentiment-analysis-data-twitter-menggunakan-machine-learning
Membuat Aplikasi Streamlit
Pada artikel ini, kita akan menggunakan model yang sudah dilatih dan disimpan pada artikel sebelumnya, anda bisa langsung mengunduh contoh model yang sudah dilatih di sini. Susun direktori agar memiliki struktur seperti berikut:
project
|-model/
|----tfidf_vectorizer.pkl
|----naive_bayes_model.pkl
|----svm_model.pkl
|----logistic_regression_model.pkl
|-app.py
Kita memasukkan model untuk vectorizer dan prediksi ke dalam folder model
kemudian buat app.py
yang berisikan kode untuk membuat aplikasi streamlit sederhana. Berikut tahapannya:
1. Import Libraries
Kita mengimpor library yang diperlukan seperti streamlit
, joblib
, re
, nltk
, dan lainnya. nltk
digunakan untuk pemrosesan teks, sedangkan joblib
digunakan untuk memuat model yang telah dilatih.
import streamlit as st
import joblib
import re
import nltk
from nltk.corpus import stopwords
from nltk.stem import PorterStemmer
# Download stopwords from NLTK
nltk.download('stopwords')
2. Fungsi untuk Pemrosesan Teks
Fungsi preprocess_text
digunakan untuk membersihkan teks input. Fungsi ini sama persis dengan yang kita lakukan saat melatih model. Fungsi ini menghapus URL, tanda baca, mengonversi teks menjadi huruf kecil, membagi teks menjadi kata-kata, menghapus stopwords, dan melakukan stemming menggunakan Porter Stemmer.
# Function for text preprocessing
def preprocess_text(text):
text = re.sub(r'http\S+', '', text) # Remove URLs
text = re.sub(r'[^a-zA-Z\s]', '', text) # Remove punctuation
text = text.lower() # Convert to lowercase
text = text.split() # Split into words
ps = PorterStemmer()
text = [ps.stem(word) for word in text if not word in set(stopwords.words('english'))] # Remove stopwords and perform stemming
text = ' '.join(text)
return text
3. Memuat Vektorizer dan Model
Kita memuat vektorizer TF-IDF dan model yang telah dilatih sebelumnya (Naive Bayes, SVM, dan Logistic Regression) menggunakan joblib.load
.
# Load the vectorizer and models
vectorizer = joblib.load('model/tfidf_vectorizer.pkl')
nb_model = joblib.load('model/naive_bayes_model.pkl')
svm_model = joblib.load('model/svm_model.pkl')
lr_model = joblib.load('model/logistic_regression_model.pkl')
4. Layout Aplikasi Streamlit
Bagian ini mengatur antarmuka aplikasi dengan judul, area teks input, dan opsi pemilihan model.
# App title
st.title("Twitter Sentiment Analysis App")
st.write("Enter the text you want to analyze for sentiment:")
# User input text
input_text = st.text_area("Input text here")
# Model selection
st.write("Select models for sentiment analysis:")
use_nb = st.checkbox('Naive Bayes')
use_svm = st.checkbox('SVM')
use_lr = st.checkbox('Logistic Regression')
Pertama, judul aplikasi ditetapkan menggunakan st.title("Twitter Sentiment Analysis App")
, yang akan menampilkan teks "Sentiment Analysis App" sebagai judul utama aplikasi. Kemudian, menggunakan st.write("Enter the text you want to analyze for sentiment:")
, aplikasi menampilkan instruksi kepada pengguna untuk memasukkan teks yang ingin dianalisis sentimennya.
Selanjutnya, aplikasi menyediakan area teks input menggunakan input_text = st.text_area("Input text here")
, di mana pengguna dapat memasukkan teks yang akan dianalisis. Area teks ini memungkinkan pengguna untuk memasukkan input dalam bentuk paragraf atau beberapa kalimat sekaligus. Setelah itu, aplikasi menampilkan pilihan model untuk analisis sentimen dengan menggunakan st.write("Select models for sentiment analysis:")
, diikuti dengan tiga kotak centang (st.checkbox
), masing-masing untuk model Naive Bayes, SVM, dan Logistic Regression. Pengguna dapat memilih satu atau lebih model yang ingin digunakan untuk analisis dengan mencentang kotak-kotak ini. Variabel use_nb
, use_svm
, dan use_lr
akan bernilai True
jika kotak centang yang bersesuaian dipilih oleh pengguna, dan False
jika tidak.
5. Prediksi dan Tampilkan Hasil
Bagian ini menangani logika untuk memproses teks input, melakukan prediksi menggunakan model yang dipilih, dan menampilkan hasil prediksi kepada pengguna.
if st.button("Analyze"):
if not input_text:
st.write("Please enter the text for analysis.")
elif not (use_nb or use_svm or use_lr):
st.write("Please select at least one model for analysis.")
else:
# Process the input text
input_text_processed = preprocess_text(input_text)
input_text_vect = vectorizer.transform([input_text_processed])
st.write(f"**Input Text:** {input_text}")
# Prediction using Naive Bayes
if use_nb:
nb_prediction = nb_model.predict(input_text_vect)[0]
nb_prob = nb_model.predict_proba(input_text_vect)[0]
st.write(f"**Naive Bayes Prediction:** {'Positive' if nb_prediction == 1 else 'Negative'} (Confidence: {nb_prob[nb_prediction]:.2f})")
# Prediction using SVM
if use_svm:
svm_prediction = svm_model.predict(input_text_vect)[0]
st.write(f"**SVM Prediction:** {'Positive' if svm_prediction == 1 else 'Negative'}")
# Prediction using Logistic Regression
if use_lr:
lr_prediction = lr_model.predict(input_text_vect)[0]
lr_prob = lr_model.predict_proba(input_text_vect)[0]
st.write(f"**Logistic Regression Prediction:** {'Positive' if lr_prediction == 1 else 'Negative'} (Confidence: {lr_prob[lr_prediction]:.2f})")
Pertama, kondisi if st.button("Analyze"):
memeriksa apakah tombol "Analyze" telah ditekan. Jika tombol ditekan, langkah berikutnya adalah memeriksa apakah teks input telah dimasukkan oleh pengguna dengan menggunakan if not input_text:
. Jika tidak ada teks yang dimasukkan, pesan "Please enter the text for analysis." akan ditampilkan. Selanjutnya, aplikasi memeriksa apakah setidaknya satu model telah dipilih untuk analisis dengan menggunakan elif not (use_nb or use_svm or use_lr):
. Jika tidak ada model yang dipilih, pesan "Please select at least one model for analysis." akan ditampilkan.
Jika kedua kondisi tersebut terpenuhi (teks dimasukkan dan setidaknya satu model dipilih), aplikasi melanjutkan untuk memproses teks input. Teks diproses menggunakan fungsi preprocess_text(input_text)
, yang membersihkan dan mempersiapkan teks untuk analisis. Teks yang telah diproses kemudian diubah menjadi vektor menggunakan vectorizer.transform([input_text_processed])
. Setelah itu, teks input asli ditampilkan kembali kepada pengguna dengan menggunakan st.write(f"**Input Text:** {input_text}")
.
Selanjutnya, aplikasi melakukan prediksi sentimen menggunakan model yang dipilih oleh pengguna. Jika model Naive Bayes dipilih (if use_nb:
), aplikasi melakukan prediksi dengan model Naive Bayes dan menampilkan hasil prediksi beserta tingkat kepercayaan (confidence) menggunakan st.write(f"**Naive Bayes Prediction:** {'Positive' if nb_prediction == 1 else 'Negative'} (Confidence: {nb_prob[nb_prediction]:.2f})")
. Proses yang sama dilakukan untuk model SVM (if use_svm:
) dan Logistic Regression (if use_lr:
), di mana hasil prediksi ditampilkan kepada pengguna.
Menjalankan Aplikasi
Untuk menjalankan aplikasi, simpan kode di atas dalam file app.py
dan jalankan perintah berikut di terminal:
streamlit run app.py
Penutup
Dalam artikel ini, kita telah membahas cara membangun aplikasi web untuk analisis sentimen menggunakan Streamlit. Aplikasi ini memungkinkan pengguna untuk memilih model yang ingin mereka gunakan dan melakukan prediksi sentimen berdasarkan teks yang dimasukkan. Dengan aplikasi ini, pengguna dapat dengan mudah menganalisis sentimen teks secara real-time. Terima kasih telah membaca artikel ini, Selamat Belajar!
Source Code : Github