|
|
import streamlit as st |
|
|
import torch |
|
|
from transformers import AutoTokenizer, AutoModelForSequenceClassification |
|
|
import torch.nn.functional as F |
|
|
|
|
|
|
|
|
st.set_page_config( |
|
|
page_title="Emotion Mining - Tom Lembong Case", |
|
|
page_icon="π¬", |
|
|
layout="wide" |
|
|
) |
|
|
|
|
|
|
|
|
MODEL_PATH = "model" |
|
|
LABELS = ["SADNESS", "ANGER", "HOPE", "DISAPPOINTMENT", "SUPPORT"] |
|
|
|
|
|
|
|
|
@st.cache_resource(show_spinner=True) |
|
|
def load_model(path): |
|
|
tokenizer = AutoTokenizer.from_pretrained(path) |
|
|
model = AutoModelForSequenceClassification.from_pretrained(path) |
|
|
model.eval() |
|
|
return tokenizer, model |
|
|
|
|
|
tokenizer, model = load_model(MODEL_PATH) |
|
|
|
|
|
|
|
|
st.sidebar.title("π¬ Emotion Mining") |
|
|
st.sidebar.markdown("Masukkan komentar Instagram terkait kasus **Tom Lembong** dan dapatkan klasifikasi emosi.") |
|
|
|
|
|
input_text = st.sidebar.text_area("π Komentar Instagram", height=150) |
|
|
predict_btn = st.sidebar.button("π Klasifikasikan") |
|
|
|
|
|
|
|
|
st.title("π Emotion Mining - Kasus Tom Lembong") |
|
|
|
|
|
with st.expander("βΉοΈ Tentang Dataset", expanded=True): |
|
|
st.markdown(""" |
|
|
**Latar Belakang Kasus:** |
|
|
Tom Lembong, mantan Menteri Perdagangan, pada tahun 2024 ditetapkan sebagai tersangka kasus korupsi impor gula. |
|
|
Ia sempat dijatuhi hukuman, namun kemudian mendapat abolisi dari Presiden. |
|
|
Kasus ini menimbulkan berbagai emosi publik di media sosial, khususnya Instagram. |
|
|
|
|
|
**Tujuan Dataset:** |
|
|
Mengklasifikasikan komentar publik ke dalam **5 kategori emosi**: |
|
|
- π’ **SADNESS** β komentar sedih atau prihatin |
|
|
- π‘ **ANGER** β komentar marah atau mengecam |
|
|
- π **HOPE** β komentar penuh harapan atau doa |
|
|
- π **DISAPPOINTMENT** β rasa kecewa atau frustrasi |
|
|
- π€ **SUPPORT** β dukungan atau semangat |
|
|
|
|
|
**Evaluasi:** |
|
|
Model dievaluasi menggunakan **Macro F1-Score**, agar performa tetap seimbang meskipun distribusi label tidak merata. |
|
|
""") |
|
|
|
|
|
st.markdown("---") |
|
|
|
|
|
|
|
|
if predict_btn: |
|
|
if not input_text.strip(): |
|
|
st.warning("β οΈ Masukkan komentar terlebih dahulu!") |
|
|
else: |
|
|
|
|
|
inputs = tokenizer(input_text, return_tensors="pt", truncation=True, padding=True, max_length=128) |
|
|
|
|
|
|
|
|
with torch.no_grad(): |
|
|
outputs = model(**inputs) |
|
|
probs = F.softmax(outputs.logits, dim=-1).squeeze().tolist() |
|
|
|
|
|
|
|
|
pred_idx = int(torch.argmax(outputs.logits)) |
|
|
pred_label = LABELS[pred_idx] |
|
|
|
|
|
|
|
|
col1, col2 = st.columns([1, 2]) |
|
|
|
|
|
with col1: |
|
|
st.markdown("### π Hasil Prediksi") |
|
|
st.success(f"**Emosi:** {pred_label}") |
|
|
|
|
|
with col2: |
|
|
st.markdown("### π Distribusi Probabilitas") |
|
|
st.bar_chart({label: prob for label, prob in zip(LABELS, probs)}) |
|
|
|
|
|
st.markdown("---") |
|
|
st.caption("Made with β€οΈ by Akmal | Powered by HuggingFace & Streamlit") |
|
|
|