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}%)')