import gradio as gr import logging from config import config from app import SentimentApp # Optimized Gradio Interface def create_interface(): """Create comprehensive Gradio interface with optimizations""" app = SentimentApp() with gr.Blocks(theme=gr.themes.Soft(), title="Multilingual Sentiment Analyzer") as demo: gr.Markdown("# 🌍 Multilingual Sentiment Analyzer") gr.Markdown("AI-powered sentiment analysis with SHAP & LIME explainable AI features") with gr.Tab("Single Analysis"): with gr.Row(): with gr.Column(): text_input = gr.Textbox( label="Enter Text for Analysis", placeholder="Enter your text in any supported language...", lines=5 ) with gr.Row(): language_selector = gr.Dropdown( choices=list(config.SUPPORTED_LANGUAGES.values()), value="Auto Detect", label="Language" ) theme_selector = gr.Dropdown( choices=list(config.THEMES.keys()), value="default", label="Theme" ) with gr.Row(): clean_text_cb = gr.Checkbox(label="Clean Text", value=False) remove_punct_cb = gr.Checkbox(label="Remove Punctuation", value=False) remove_nums_cb = gr.Checkbox(label="Remove Numbers", value=False) analyze_btn = gr.Button("Analyze", variant="primary", size="lg") gr.Examples( examples=app.examples, inputs=text_input, cache_examples=False ) with gr.Column(): result_output = gr.Textbox(label="Analysis Results", lines=8) with gr.Row(): gauge_plot = gr.Plot(label="Sentiment Gauge") probability_plot = gr.Plot(label="Probability Distribution") # FIXED Advanced Analysis Tab with gr.Tab("Advanced Analysis"): gr.Markdown("## Explainable AI Analysis") gr.Markdown("**SHAP and LIME analysis with FIXED implementation** - now handles text input correctly!") with gr.Row(): with gr.Column(): advanced_text_input = gr.Textbox( label="Enter Text for Advanced Analysis", placeholder="Enter text to analyze with SHAP and LIME...", lines=6, value="This movie is absolutely fantastic and amazing!" ) with gr.Row(): advanced_language = gr.Dropdown( choices=list(config.SUPPORTED_LANGUAGES.values()), value="Auto Detect", label="Language" ) num_samples_slider = gr.Slider( minimum=50, maximum=300, value=100, step=25, label="Number of Samples", info="Lower = Faster, Higher = More Accurate" ) with gr.Row(): shap_btn = gr.Button("SHAP Analysis", variant="primary") lime_btn = gr.Button("LIME Analysis", variant="secondary") gr.Markdown(""" **📊 Analysis Methods:** - **SHAP**: Token-level importance scores using Text masker - **LIME**: Feature importance through text perturbation **⚡ Expected Performance:** - 50 samples: ~10-20s | 100 samples: ~20-40s | 200+ samples: ~40-80s """) with gr.Column(): advanced_results = gr.Textbox(label="Analysis Summary", lines=12) with gr.Row(): advanced_plot = gr.Plot(label="Feature Importance Visualization") with gr.Tab("Batch Analysis"): with gr.Row(): with gr.Column(): file_upload = gr.File( label="Upload File (CSV/TXT)", file_types=[".csv", ".txt"] ) batch_input = gr.Textbox( label="Batch Input (one text per line)", placeholder="Enter multiple texts, one per line...", lines=10 ) with gr.Row(): batch_language = gr.Dropdown( choices=list(config.SUPPORTED_LANGUAGES.values()), value="Auto Detect", label="Language" ) batch_theme = gr.Dropdown( choices=list(config.THEMES.keys()), value="default", label="Theme" ) with gr.Row(): batch_clean_cb = gr.Checkbox(label="Clean Text", value=False) batch_punct_cb = gr.Checkbox(label="Remove Punctuation", value=False) batch_nums_cb = gr.Checkbox(label="Remove Numbers", value=False) with gr.Row(): load_file_btn = gr.Button("Load File") analyze_batch_btn = gr.Button("Analyze Batch", variant="primary") with gr.Column(): batch_summary = gr.Textbox(label="Batch Summary", lines=8) batch_results_df = gr.Dataframe( label="Detailed Results", headers=["Index", "Text", "Sentiment", "Confidence", "Language", "Word_Count"], datatype=["number", "str", "str", "str", "str", "number"] ) with gr.Row(): batch_plot = gr.Plot(label="Batch Analysis Summary") confidence_dist_plot = gr.Plot(label="Confidence Distribution") with gr.Tab("History & Analytics"): with gr.Row(): with gr.Column(): with gr.Row(): refresh_history_btn = gr.Button("Refresh History") clear_history_btn = gr.Button("Clear History", variant="stop") status_btn = gr.Button("Get Status") history_theme = gr.Dropdown( choices=list(config.THEMES.keys()), value="default", label="Dashboard Theme" ) with gr.Row(): export_csv_btn = gr.Button("Export CSV") export_json_btn = gr.Button("Export JSON") with gr.Column(): history_status = gr.Textbox(label="History Status", lines=8) history_dashboard = gr.Plot(label="History Analytics Dashboard") with gr.Row(): csv_download = gr.File(label="CSV Download", visible=True) json_download = gr.File(label="JSON Download", visible=True) # Event Handlers # Single Analysis analyze_btn.click( app.analyze_single, inputs=[text_input, language_selector, theme_selector, clean_text_cb, remove_punct_cb, remove_nums_cb], outputs=[result_output, gauge_plot, probability_plot] ) # FIXED Advanced Analysis with sample size control shap_btn.click( app.analyze_with_shap, inputs=[advanced_text_input, advanced_language, num_samples_slider], outputs=[advanced_results, advanced_plot] ) lime_btn.click( app.analyze_with_lime, inputs=[advanced_text_input, advanced_language, num_samples_slider], outputs=[advanced_results, advanced_plot] ) # Batch Analysis load_file_btn.click( app.data_handler.process_file, inputs=file_upload, outputs=batch_input ) analyze_batch_btn.click( app.analyze_batch, inputs=[batch_input, batch_language, batch_theme, batch_clean_cb, batch_punct_cb, batch_nums_cb], outputs=[batch_summary, batch_results_df, batch_plot, confidence_dist_plot] ) # History & Analytics refresh_history_btn.click( app.plot_history, inputs=history_theme, outputs=[history_dashboard, history_status] ) clear_history_btn.click( lambda: f"Cleared {app.history.clear()} entries", outputs=history_status ) status_btn.click( app.get_history_status, outputs=history_status ) export_csv_btn.click( lambda: app.data_handler.export_data(app.history.get_all(), 'csv'), outputs=[csv_download, history_status] ) export_json_btn.click( lambda: app.data_handler.export_data(app.history.get_all(), 'json'), outputs=[json_download, history_status] ) return demo # Application Entry Point if __name__ == "__main__": logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) try: demo = create_interface() demo.launch( share=True, server_name="0.0.0.0", server_port=7860, show_error=True ) except Exception as e: logging.error(f"Failed to launch application: {e}") raise