import os import streamlit as st import pandas as pd import plotly.express as px from processor import SentimentRAG import time # Page Config st.set_page_config( page_title="تحلیل هوشمند نظرات دیجی‌کالا", page_icon="📊", layout="wide", initial_sidebar_state="expanded" ) # Custom CSS for Professional UI st.markdown(""" """, unsafe_allow_html=True) @st.cache_resource def load_rag(): # Data is pre-prepared by GitHub Actions or handled via online fallback in SentimentRAG return SentimentRAG() def get_rag_instance_safe(): """Returns the RAG instance ONLY if it has already been initialized.""" if SentimentRAG._instance and hasattr(SentimentRAG._instance, 'initialized') and SentimentRAG._instance.initialized: return SentimentRAG._instance return None # Sidebar with st.sidebar: st.image("https://upload.wikimedia.org/wikipedia/commons/2/29/Digikala_logo.svg", width=200) st.title("کنترل پنل") st.markdown("---") st.info("این سیستم با ترکیب مدل‌های BERT و معماری RAG، تحلیل دقیقی از نظرات ارائه می‌دهد.") with st.expander("تنظیمات پیشرفته"): k_val = st.slider("تعداد نظرات مشابه (RAG)", 1, 5, 3) clear_cache = st.button("بازنشانی حافظه") if clear_cache: st.cache_resource.clear() st.rerun() # Header Section st.markdown("""

سامانه تحلیل هوشمند نظرات دیجی‌کالا

استخراج احساسات و تولید استدلال مبتنی بر داده (معماری RAG)

""", unsafe_allow_html=True) tab1, tab2 = st.tabs(["تحلیل متن", "داشبورد آماری"]) with tab1: col1, col2 = st.columns([3, 2], gap="large") with col1: st.markdown("### ورود اطلاعات") user_input = st.text_area( "نظر خود را برای تحلیل وارد کنید:", placeholder="مثال: این محصول عالی است اما بسته‌بندی آن ضعیف بود...", height=200, help="متن نظر را اینجا تایپ کنید." ) analyze_btn = st.button("شروع تحلیل") with col2: if analyze_btn and user_input: with st.spinner("در حال پردازش و تحلیل هوشمند..."): start_time = time.time() # Check if data exists locally to inform user if not os.path.exists("data/digikala_samples.csv"): st.warning("⚠️ دیتابیس محلی یافت نشد. در حال فراخوانی آنلاین داده‌ها...") rag = load_rag() score, confidence = rag.get_sentiment(user_input) explanation = rag.generate_explanation(user_input, score) similar = rag.retrieve_similar(user_input, k=k_val) elapsed = time.time() - start_time if score > 3: css_class, label = "positive", "مثبت" elif score < 3: css_class, label = "negative", "منفی" else: css_class, label = "neutral", "خنثی" st.markdown(f"""

وضعیت: {label}


امتیاز شدت: {score} از ۵

ضریب اطمینان: {confidence:.2%}

زمان پردازش: {elapsed:.2f} ثانیه
""", unsafe_allow_html=True) st.markdown("### دلیل و استدلال:") st.info(explanation) else: st.info("متن نظر را وارد کرده و دکمه تحلیل را بزنید تا نتایج اینجا نمایش داده شوند.") if analyze_btn and user_input: st.markdown("---") with st.expander("شواهد بازیابی شده (RAG Context)", expanded=False): for i, s in enumerate(similar, 1): st.write(f"**{i}.** {s}") with tab2: st.header("داده‌های مرجع") try: data_file = "data/digikala_samples.csv" df = None if os.path.exists(data_file): df = pd.read_csv(data_file) else: # ONLY attempt to retrieve from RAG if it is already initialized to avoid OOM/Bottlenecks rag_instance = get_rag_instance_safe() if rag_instance: df = rag_instance.df if df is not None: m1, m2, m3, m4 = st.columns(4) m1.metric("تعداد نظرات", len(df)) m2.metric("مدل", "bert-base") m3.metric("معماری", "RAG") m4.metric("زبان", "فارسی") c1, c2 = st.columns(2) with c1: df['length'] = df['text'].str.len() fig_hist = px.histogram( df, x="length", title="توزیع طول نظرات", color_discrete_sequence=['#ef4056'], labels={'length': 'طول متن'} ) fig_hist.update_layout(plot_bgcolor='white') st.plotly_chart(fig_hist, width='stretch') with c2: st.markdown("### پیش‌نمایش داده‌ها") st.dataframe(df.head(15), width='stretch') else: st.warning("دیتابیس نظرات یافت نشد. لطفاً منتظر بروزرسانی خودکار بمانید یا دکمه تحلیل (در زبانه اول) را بزنید تا داده‌ها بارگذاری شوند.") except Exception as e: st.error(f"⚠️ خطا در بارگذاری دیتابیس: {e}") # Footer st.markdown("---") st.markdown("""
(پروژه NLP - Taha Tehrani Nasab)
قدرت گرفته از Hugging Face Transformers & FAISS
""", unsafe_allow_html=True)