Spaces:
Runtime error
Runtime error
from tqdm import tqdm | |
from itertools import islice | |
from youtube_comment_downloader import * | |
from transformers import AutoTokenizer, AutoModelForSequenceClassification, pipeline | |
import matplotlib.pyplot as plt | |
import csv | |
import streamlit as st | |
import pandas as pd | |
import base64 | |
# Inisialisasi model dan tokenizer | |
pretrained= "mdhugol/indonesia-bert-sentiment-classification" | |
model = AutoModelForSequenceClassification.from_pretrained(pretrained) | |
tokenizer = AutoTokenizer.from_pretrained(pretrained) | |
sentiment_analysis = pipeline("sentiment-analysis", model=model, tokenizer=tokenizer) | |
label_index = {'LABEL_0': 'positive', 'LABEL_1': 'neutral', 'LABEL_2': 'negative'} | |
st.title("Youtube Comment Sentimen Analisis") | |
st.write("Program ini akan menganalisis komentar dalam sebuah video di youtube menggunakan sentiment analysis, tidak termasuk komentar dalam komentar dan khusus untuk komentar bahasa indonesia") | |
# Input URL video | |
video_url = st.text_input("Masukkan URL video YouTube:") | |
# Input jumlah komentar yang ingin diambil | |
num_comments = st.number_input("Jumlah komentar yang ingin diambil:", min_value=1, value=10) | |
# Fungsi untuk analisis sentimen | |
def analisis_sentimen(text): | |
result = sentiment_analysis(text) | |
label = label_index[result[0]['label']] | |
score = result[0]['score'] * 100 | |
return label, score | |
if st.button("Mulai Analisis"): | |
# Inisialisasi YoutubeCommentDownloader | |
downloader = YoutubeCommentDownloader() | |
# Mendapatkan komentar | |
comments = downloader.get_comments_from_url(video_url, sort_by=SORT_BY_POPULAR) | |
# Membuka file CSV untuk menulis | |
with open('comments.csv', mode='w', encoding='utf-8', newline='') as file: | |
# Membuat objek writer | |
writer = csv.DictWriter(file, fieldnames=['cid', 'text', 'time', 'author', 'channel', 'votes', 'photo', 'heart', 'reply']) | |
# Menulis header | |
writer.writeheader() | |
# Menulis data komentar | |
for comment in tqdm(islice(comments, num_comments)): | |
# Menghapus kolom 'time_parsed' dari komentar | |
comment.pop('time_parsed', None) | |
writer.writerow(comment) | |
st.success(f"Komentar berhasil diunduh dan disimpan dalam file 'comments.csv'") | |
# Membaca data dari file CSV | |
comments_df = pd.read_csv('comments.csv') | |
#analisis sentimen | |
st.info("Memulai analisis sentimen....") | |
# List untuk menyimpan hasil analisis sentimen | |
hasil_analisis = [] | |
# Membaca data dari file CSV | |
with open('comments.csv', mode='r', encoding='utf-8') as file: | |
reader = csv.DictReader(file) | |
for row in tqdm(reader): | |
comment_text = row['text'] | |
label, score = analisis_sentimen(comment_text) | |
hasil_analisis.append((comment_text, label, score)) | |
# Menampilkan hasil analisis sentimen | |
st.subheader("Hasil Analisis Sentimen") | |
#st.write(hasil_analisis) | |
# Menampilkan histogram | |
labels, scores = zip(*[(label, score) for _, label, score in hasil_analisis]) | |
plt.hist(labels, bins=30, color='blue', alpha=0.7, edgecolor='black') | |
plt.xlabel('Skor Sentimen') | |
plt.ylabel('Jumlah Komentar') | |
plt.title('Distribusi Sentimen Komentar') | |
st.pyplot(plt) | |
# Menghitung jumlah dan persentase | |
jumlah_positif = labels.count('positive') | |
jumlah_negatif = labels.count('negative') | |
jumlah_netral = labels.count('neutral') | |
total_komentar = len(labels) | |
persentase_positif = (jumlah_positif / total_komentar) * 100 | |
persentase_negatif = (jumlah_negatif / total_komentar) * 100 | |
persentase_netral = (jumlah_netral / total_komentar) * 100 | |
st.write(f"Total Komentar: {total_komentar}") | |
st.write(f"Persentase Komentar Positif: {persentase_positif:.2f}% / {jumlah_positif} Komentar") | |
st.write(f"Persentase Komentar Negatif: {persentase_negatif:.2f}% / {jumlah_negatif} Komentar") | |
st.write(f"Persentase Komentar Netral: {persentase_netral:.2f}% / {jumlah_netral} Komentar") | |
# Menampilkan tabel dengan menggunakan st.table() | |
st.subheader("Data Komentar") | |
st.table(comments_df) | |