Spaces:
Runtime error
Runtime error
| """ | |
| Batch Analysis Page for Vietnamese Sentiment Analysis | |
| """ | |
| import gradio as gr | |
| import pandas as pd | |
| from io import StringIO | |
| def create_batch_analysis_page(app_instance): | |
| """Create the batch analysis tab""" | |
| def analyze_batch(texts): | |
| """Analyze sentiment for multiple texts""" | |
| if not texts or not any(text.strip() for text in texts): | |
| return "β Please enter some texts to analyze." | |
| if not app_instance.model_loaded: | |
| return "β Model not loaded. Please refresh the page." | |
| # Filter valid texts | |
| valid_texts = [text.strip() for text in texts if text.strip()] | |
| if len(valid_texts) > 10: | |
| return "β Too many texts. Maximum 10 texts per batch for memory efficiency." | |
| if not valid_texts: | |
| return "β No valid texts provided." | |
| try: | |
| results, error_msg = app_instance.batch_predict(valid_texts) | |
| if error_msg: | |
| return error_msg | |
| if not results: | |
| return "β No results generated. Please try again." | |
| # Create a summary table | |
| df_data = [] | |
| for result in results: | |
| sentiment_emoji = { | |
| "Positive": "π", | |
| "Neutral": "π", | |
| "Negative": "π " | |
| }.get(result["sentiment"], "β") | |
| df_data.append({ | |
| "Text": result["text"][:100] + ("..." if len(result["text"]) > 100 else ""), | |
| "Sentiment": f"{sentiment_emoji} {result['sentiment']}", | |
| "Confidence": f"{result['confidence']:.2%}", | |
| "Processing Time": f"{result['processing_time']:.3f}s" | |
| }) | |
| df = pd.DataFrame(df_data) | |
| # Create summary statistics | |
| sentiment_counts = df["Sentiment"].value_counts() | |
| avg_confidence = sum(r["confidence"] for r in results) / len(results) | |
| total_time = sum(r["processing_time"] for r in results) | |
| summary = f""" | |
| ## π Batch Analysis Results | |
| **Summary Statistics:** | |
| - Total texts analyzed: {len(results)} | |
| - Average confidence: {avg_confidence:.2%} | |
| - Total processing time: {total_time:.3f}s | |
| - Average time per text: {total_time/len(results):.3f}s | |
| **Sentiment Distribution:** | |
| {sentiment_counts.to_string()} | |
| ### Detailed Results: | |
| """ | |
| # Convert DataFrame to markdown | |
| table_md = df.to_markdown(index=False) | |
| return summary + "\n" + table_md | |
| except Exception as e: | |
| app_instance.cleanup_memory() | |
| return f"β Error during batch analysis: {str(e)}" | |
| def clear_batch(): | |
| """Clear batch inputs""" | |
| return "" | |
| # Batch Analysis Tab | |
| with gr.Tab("π Batch Analysis"): | |
| gr.Markdown("### π Memory-Efficient Batch Processing") | |
| gr.Markdown("**Maximum batch size:** 10 texts (for memory efficiency)") | |
| gr.Markdown("**Memory limit:** 8GB") | |
| with gr.Row(): | |
| with gr.Column(scale=2): | |
| batch_input = gr.Textbox( | |
| label="Enter Multiple Texts (one per line)", | |
| placeholder="Enter text 1...\nEnter text 2...\nEnter text 3...", | |
| lines=10, | |
| max_lines=15 | |
| ) | |
| with gr.Row(): | |
| batch_analyze_btn = gr.Button("π Analyze Batch", variant="primary") | |
| batch_clear_btn = gr.Button("ποΈ Clear All", variant="secondary") | |
| with gr.Column(scale=3): | |
| batch_result_output = gr.Markdown(label="Batch Analysis Result") | |
| # Connect events | |
| batch_analyze_btn.click( | |
| fn=analyze_batch, | |
| inputs=[batch_input], | |
| outputs=[batch_result_output] | |
| ) | |
| batch_clear_btn.click( | |
| fn=clear_batch, | |
| outputs=[batch_input] | |
| ) | |
| return batch_analyze_btn, batch_clear_btn, batch_input, batch_result_output |