fixdemo / app.py
isan2001's picture
Update app.py
9b44656
raw
history blame contribute delete
No virus
5.65 kB
import tensorflow as tf
from transformers import BertTokenizer
from transformers import TFBertForSequenceClassification
from Sastrawi.Stemmer.StemmerFactory import StemmerFactory # Import Sastrawi
import streamlit as st
import re
from PIL import Image
# Fungsi untuk memuat model BERT dan tokenizer
PRE_TRAINED_MODEL = 'indobenchmark/indobert-base-p2'
bert_tokenizer = BertTokenizer.from_pretrained(PRE_TRAINED_MODEL)
bert_model = TFBertForSequenceClassification.from_pretrained(PRE_TRAINED_MODEL, num_labels=2)
bert_model.load_weights('model.h5')
# Inisialisasi stemmer dari Sastrawi
stemmer = StemmerFactory().create_stemmer() # Membuat stemmer Sastrawi
def preprocess_text(text):
# Menggunakan Sastrawi untuk stemming
stemmed_text = stemmer.stem(text.lower())
stemmed_text = re.sub(r'\d+', '', stemmed_text) # Menghapus angka
stemmed_text = re.sub(r'\s+', ' ', stemmed_text) # Menghapus spasi berlebihan
stemmed_text = re.sub(r'[^\w\s]', '', stemmed_text)# Menghapus simbol dan tanda baca
stemmed_text = re.sub(r'[^\x00-\x7F]+', '', stemmed_text) # ascii
stopwords = ['dan', 'atau', 'juga', 'yang', 'untuk', 'karena', 'juga', 'tapi', 'yg', 'lg', 'ini', 'sih', 'saya', 'nih', 'ni', 'aku', 'ya', 'kami', 'lagi', 'udh', 'di', 'kita',
'terus', 'kok', 'jadi', 'tpi', 'tapi', 'sama', 'lain', 'sm', 'min', 'karna', 'ah', 'eh', 'oh', 'he','kamu', 'aku',
'diri', 'waduh', 'kan', 'itu', 'lalu', 'd', 'klo', 'pun', 'dr', 'nge', 'mah', 'ny',
'itu', 'dari', 'kite', 'yaa', 'si', 'lah', 'gua', 'gue', 'iki', 'wooii', 'woy',
'woi', 'gw', 'dari', 'bang', 'sya', 'ane', 'mulu', 'rb', 'org', 'oii', 'gtu', 'gya', 'nii', 'jga', 'duh', 'dah', 'deh', 'nang', 'p', 'cs' ,
'g', 'njii', 'lot', 'loh', 'x', 'lu', 'woe', 'yg', 'kak', 'aq', 'dong', 'kali', 'rill', 'wahh', 'trss', 'sya', 'dab', 'test', 'yok', 'kk',
'pak','rp', 'kok', 'kek', 'bosku', 'nya', 'bang', 'ka', 'gais', 'gih', 'oy', 'ki', 'ku', 'ke', 'ko', 'yah'
]
stemmed_text = ' '.join(word for word in stemmed_text.split() if word not in stopwords)
return stemmed_text
def predict_sentiment(text):
preprocessed_text = preprocess_text(text) # Pra-pemrosesan teks dengan Sastrawi
input_ids = tf.constant(bert_tokenizer.encode(preprocessed_text, add_special_tokens=True))[None, :]
logits = bert_model(input_ids)[0]
probabilities = tf.nn.softmax(logits, axis=1)
sentiment = tf.argmax(probabilities, axis=1)
return sentiment.numpy()[0], probabilities.numpy()[0]
menu = ["Home","Prediksi Analisis"]
choice = st.sidebar.selectbox("Menu", menu)
if choice == "Home":
st.title("Selamat Datang di Aplikasi Prediksi Sentimen Komentar Aplikasi Dana di Intagram Menggunakan BERT")
st.write("Ini merupakan aplikasi prediksi Komentar aplikasi Dana menggunakan model Pretrained BERT dari IndoBert. Aplikasi ini dapat memprediksi apakah komentar yang dilontarkan pada postingan akun instagram Dana bersifat positif atau negatif berdasarkan teks yang dimasukkan.")
image = Image.open("Logo_dana.png")
st.image(image, caption='Logo Dana')
st.write("DANA adalah dompet digital Indonesia yang dirancang untuk menangani semua transaksi tunai dan kartu digital online dan offline dengan kecepatan, kenyamanan dan keamanan yang terjamin. Talenta terbaik Indonesia akan terus mengembangkan dana sebagai dompet digital open platform yang dapat digunakan untuk mendukung segala aktivitas keuangan dan gaya hidup digital seluruh masyarakat Indonesia.")
st.write("Berdasarkan survei yang dilakukan oleh merdeka, dana menjadi aplikasi popular setelah gopay dan ovo yang dimana dana ini memiliki pertumbuhan terpesat dalam jumlah penggunaanya. Pada akun Instagram dana, dana sering kali melakukan kampanye agar pengguna mengetahui informasi terbarunya. Kampanye tersebut menuai banyak komentar yang bersifat membangun atau menjantuhkan, dari komentar tersebut dapat dimanfaatkan sebagai sebuah informasi")
st.write("Data komentar yang terkumpul sebanyak 1331 dari komentar pada postingan akun instagram diberikan label secara otomatis, mendapatkan 2 kategori yaitu positif dan negatif berikut jumlah dari masing-masing kategori.")
image = Image.open("SEBELUM OVR.png")
st.image(image, caption='Jumlah Positif dan Negatif')
st.write("Dalam penelitian, jumlah kategori akan diseimbangkan menggunakan random oversampling yang dapat dilihat pada gambar berikut :")
image = Image.open("sesudah over.png")
st.image(image, caption='Jumlah Positif dan Negatif sesudah Oversampling')
st.write("Random Oversampling ini dilakukan agar nantinya klasifikasi dilakukan dengan tepat dan tidak bias terhadap sampel mayoritas")
st.write("Masuk ke menu Prediksi Analisis untuk mencoba hasil penelitian yang dilakukan")
elif choice == "Prediksi Analisis":
st.title('Prediksi Sentimen menggunakan BERT')
# Input teks
text = st.text_area('Masukkan teks', '')
# Tombol untuk memprediksi sentimen
if st.button('Prediksi'):
if text.strip() == '':
st.warning('Masukkan teks terlebih dahulu.')
else:
sentiment, probabilities = predict_sentiment(text)
# Menghitung persentase probabilitas sentimen positif
positive_probability = probabilities[1] * 100
negative_probability = probabilities[0] * 100
st.write(f'HASIL PREDIKSI')
if sentiment == 0:
st.write(f'Negatif ({negative_probability:.2f}%)')
else:
st.write(f'Positif ({positive_probability:.2f}%)')