|
|
""" |
|
|
Gradio App for Multilingual Sentiment Analysis |
|
|
""" |
|
|
|
|
|
import gradio as gr |
|
|
from sentiment_analyzer import MultilingualSentimentAnalyzer |
|
|
|
|
|
def analyze_sentiment(text, language, method): |
|
|
"""Analyze sentiment and return formatted results""" |
|
|
if not text or not text.strip(): |
|
|
return "Please enter some text to analyze." |
|
|
|
|
|
try: |
|
|
analyzer = MultilingualSentimentAnalyzer(language=language, method=method) |
|
|
result = analyzer.analyze(text) |
|
|
|
|
|
|
|
|
output = f""" |
|
|
## Sentiment Analysis Results |
|
|
|
|
|
**Polarity:** {result['polarity'].upper()} |
|
|
**Confidence:** {result['confidence']*100:.1f}% |
|
|
|
|
|
**Scores:** |
|
|
- Positive: {result['positive_score']:.2f} |
|
|
- Negative: {result['negative_score']:.2f} |
|
|
|
|
|
**Details:** |
|
|
- Method: {result['method']} |
|
|
- Language: {result['language']} |
|
|
- Words analyzed: {result.get('word_count', 0)} |
|
|
""" |
|
|
|
|
|
return output |
|
|
except Exception as e: |
|
|
return f"Error: {str(e)}" |
|
|
|
|
|
def batch_analyze(texts, language, method): |
|
|
"""Analyze multiple texts""" |
|
|
if not texts: |
|
|
return "Please enter texts to analyze (one per line)." |
|
|
|
|
|
text_list = [t.strip() for t in texts.split('\n') if t.strip()] |
|
|
if not text_list: |
|
|
return "No valid texts found." |
|
|
|
|
|
try: |
|
|
analyzer = MultilingualSentimentAnalyzer(language=language, method=method) |
|
|
results = analyzer.analyze_batch(text_list) |
|
|
stats = analyzer.get_statistics(text_list) |
|
|
|
|
|
output = f""" |
|
|
## Batch Analysis Results |
|
|
|
|
|
**Statistics:** |
|
|
- Total texts: {stats['total_texts']} |
|
|
- Average confidence: {stats['average_confidence']*100:.1f}% |
|
|
|
|
|
**Polarity Distribution:** |
|
|
""" |
|
|
for polarity, percentage in stats['polarity_percentages'].items(): |
|
|
output += f"- {polarity.capitalize()}: {percentage}%\n" |
|
|
|
|
|
output += "\n**Individual Results:**\n" |
|
|
for i, (text, result) in enumerate(zip(text_list, results), 1): |
|
|
output += f"\n{i}. \"{text[:50]}...\" → {result['polarity']} ({result['confidence']*100:.1f}%)\n" |
|
|
|
|
|
return output |
|
|
except Exception as e: |
|
|
return f"Error: {str(e)}" |
|
|
|
|
|
|
|
|
with gr.Blocks(title="Multilingual Sentiment Analysis", theme=gr.themes.Soft()) as demo: |
|
|
gr.Markdown(""" |
|
|
# 🌍 Multilingual Sentiment Analysis Tool |
|
|
|
|
|
Analyze sentiment in **English**, **Turkish**, and **Persian** text using non-deep-learning approaches. |
|
|
|
|
|
This tool uses lexicon-based, rule-based, and hybrid methods for interpretable sentiment analysis. |
|
|
""") |
|
|
|
|
|
with gr.Tabs(): |
|
|
with gr.TabItem("Single Text Analysis"): |
|
|
with gr.Row(): |
|
|
with gr.Column(): |
|
|
text_input = gr.Textbox( |
|
|
label="Enter Text", |
|
|
placeholder="Type your text here...", |
|
|
lines=5 |
|
|
) |
|
|
language = gr.Dropdown( |
|
|
choices=["english", "turkish", "persian"], |
|
|
value="english", |
|
|
label="Language" |
|
|
) |
|
|
method = gr.Dropdown( |
|
|
choices=["lexicon", "rule", "hybrid"], |
|
|
value="hybrid", |
|
|
label="Analysis Method" |
|
|
) |
|
|
analyze_btn = gr.Button("Analyze Sentiment", variant="primary") |
|
|
|
|
|
with gr.Column(): |
|
|
output = gr.Markdown(label="Results") |
|
|
|
|
|
analyze_btn.click( |
|
|
fn=analyze_sentiment, |
|
|
inputs=[text_input, language, method], |
|
|
outputs=output |
|
|
) |
|
|
|
|
|
with gr.TabItem("Batch Analysis"): |
|
|
with gr.Row(): |
|
|
with gr.Column(): |
|
|
batch_texts = gr.Textbox( |
|
|
label="Enter Texts (one per line)", |
|
|
placeholder="Enter multiple texts, one per line...", |
|
|
lines=10 |
|
|
) |
|
|
batch_language = gr.Dropdown( |
|
|
choices=["english", "turkish", "persian"], |
|
|
value="english", |
|
|
label="Language" |
|
|
) |
|
|
batch_method = gr.Dropdown( |
|
|
choices=["lexicon", "rule", "hybrid"], |
|
|
value="hybrid", |
|
|
label="Analysis Method" |
|
|
) |
|
|
batch_btn = gr.Button("Analyze Batch", variant="primary") |
|
|
|
|
|
with gr.Column(): |
|
|
batch_output = gr.Markdown(label="Batch Results") |
|
|
|
|
|
batch_btn.click( |
|
|
fn=batch_analyze, |
|
|
inputs=[batch_texts, batch_language, batch_method], |
|
|
outputs=batch_output |
|
|
) |
|
|
|
|
|
with gr.TabItem("Examples"): |
|
|
gr.Markdown(""" |
|
|
### Example Texts to Try: |
|
|
|
|
|
**English:** |
|
|
- "I love this product! It's absolutely amazing!!! 😊" |
|
|
- "This is terrible. I hate it." |
|
|
- "Not bad, actually it's quite good!" |
|
|
|
|
|
**Turkish:** |
|
|
- "Bu ürünü çok seviyorum! Harika!" |
|
|
- "Berbat bir deneyim. Hiç beğenmedim." |
|
|
|
|
|
**Persian:** |
|
|
- "این محصول عالی است!" |
|
|
- "خیلی بد بود" |
|
|
""") |
|
|
|
|
|
gr.Markdown(""" |
|
|
--- |
|
|
**About:** This tool uses lexicon-based, rule-based, and hybrid approaches (without deep learning) |
|
|
for interpretable sentiment analysis. Supports English, Turkish, and Persian languages. |
|
|
""") |
|
|
|
|
|
if __name__ == "__main__": |
|
|
demo.launch() |
|
|
|