🇹🇷 Turkish Sentiment Analysis
Fine-tuned Model - Geliştirilmiş Neutral Algılama
Daha iyi performans için fine-tuned edilmiş model
""" Gradio Space for Turkish Sentiment Analysis (Fine-tuned Model) Hugging Face Space için modern Gradio uygulaması """ import os import sys from pathlib import Path import gradio as gr import torch import pandas as pd # Add parent directory to path for local imports sys.path.insert(0, str(Path(__file__).parent)) from app.inference.predictor import SentimentPredictor # Model name - Fine-tuned model MODEL_NAME = "codealchemist01/turkish-sentiment-analysis-finetuned" # Initialize predictor (will be loaded on first use) predictor = None def load_predictor(): """Load predictor (lazy loading)""" global predictor if predictor is None: print(f"[INFO] Loading fine-tuned model from Hugging Face: {MODEL_NAME}") predictor = SentimentPredictor(model_name=MODEL_NAME) print("[OK] Model loaded successfully!") return predictor def analyze_sentiment(text, show_details=False): """ Analyze sentiment for a single text Args: text: Input text string show_details: If True, show detailed probabilities Returns: Formatted result string, confidence dict, and probabilities for chart """ if not text or not text.strip(): return "⚠️ Lütfen analiz etmek için bir metin girin.", {"Confidence": 0}, pd.DataFrame({"Sentiment": [], "Probability": []}) try: pred = load_predictor() result = pred.predict(text.strip(), return_probabilities=True) label = result['label'].upper() confidence = result['confidence'] * 100 probs = result.get('probabilities', {}) # Emoji mapping emoji_map = {"POSITIVE": "😊", "NEGATIVE": "😞", "NEUTRAL": "😐"} emoji = emoji_map.get(label, "📊") # Format result result_text = f"## {emoji} {label}\n\n" result_text += f"**Güven Oranı:** {confidence:.2f}%\n\n" if show_details: result_text += "**Detaylı Olasılıklar:**\n" # Sort probabilities sorted_probs = sorted(probs.items(), key=lambda x: x[1], reverse=True) for prob_label, prob_value in sorted_probs: prob_percent = prob_value * 100 bar_length = int(prob_value * 25) # 25 chars max bar = "█" * bar_length + "░" * (25 - bar_length) result_text += f"- **{prob_label.upper()}:** {bar} {prob_percent:.2f}%\n" # Confidence dict for Label component confidence_dict = {label: confidence} # DataFrame for BarPlot prob_df = pd.DataFrame({ "Sentiment": [k.upper() for k in probs.keys()], "Probability": [v * 100 for v in probs.values()] }) return result_text, confidence_dict, prob_df except Exception as e: return f"❌ Hata: {str(e)}", {"Error": 0}, pd.DataFrame({"Sentiment": [], "Probability": []}) def analyze_batch(texts): """ Analyze sentiment for multiple texts Args: texts: Newline-separated text strings Returns: Formatted results """ if not texts or not texts.strip(): return "⚠️ Lütfen analiz etmek için metinler girin." # Split texts text_list = [t.strip() for t in texts.strip().split('\n') if t.strip()] if not text_list: return "⚠️ Lütfen en az bir metin girin." try: pred = load_predictor() results = [] correct_count = {"positive": 0, "negative": 0, "neutral": 0} total_count = {"positive": 0, "negative": 0, "neutral": 0} for i, text in enumerate(text_list, 1): try: result = pred.predict(text, return_probabilities=True) label = result['label'].upper() confidence = result['confidence'] * 100 emoji_map = {"POSITIVE": "😊", "NEGATIVE": "😞", "NEUTRAL": "😐"} emoji = emoji_map.get(label, "📊") results.append(f"### {i}. {emoji} {label} ({confidence:.2f}%)\n") results.append(f"**Metin:** {text}\n\n") except Exception as e: results.append(f"### {i}. ❌ Hata\n") results.append(f"**Metin:** {text}\n") results.append(f"**Hata:** {str(e)}\n\n") summary = f"\n\n---\n**📊 Özet:** {len(text_list)} metin analiz edildi." return "".join(results) + summary except Exception as e: return f"❌ Hata: {str(e)}" # Example texts EXAMPLE_TEXTS = { "positive": [ "Bu ürün gerçekten harika! Çok memnun kaldım.", "Mükemmel bir deneyimdi, kesinlikle tekrar kullanacağım!", "Hızlı kargo, kaliteli ürün, çok başarılı!", ], "negative": [ "Hizmet çok kötüydü, hiç beğenmedim.", "Ürün beklentilerimi karşılamadı, hayal kırıklığına uğradım.", "Kargo çok geç geldi, paket hasarlıydı.", ], "neutral": [ "Ürün normal, beklediğim gibi. Özel bir şey yok.", "Kargo zamanında geldi, paket sağlamdı. Standart bir teslimat.", "Fiyat uygun, kalite orta seviye. Ne iyi ne kötü.", ] } # Custom CSS for modern design css = """ .gradio-container { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } .main-header { text-align: center; padding: 30px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 15px; margin-bottom: 20px; box-shadow: 0 4px 6px rgba(0,0,0,0.1); } .info-box { background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%); padding: 20px; border-radius: 12px; margin: 15px 0; border-left: 4px solid #667eea; } .metric-box { background: white; padding: 15px; border-radius: 10px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); margin: 10px 0; } .example-btn { margin: 5px; } """ # Create Gradio interface with gr.Blocks(css=css, theme=gr.themes.Soft(primary_hue="purple", secondary_hue="blue")) as demo: # Header gr.Markdown( """
Daha iyi performans için fine-tuned edilmiş model
Model: turkish-sentiment-analysis-finetuned
Base Model: codealchemist01/turkish-sentiment-analysis
Fine-tuning: Balanced dataset (556,888 samples) ile eğitildi
Accuracy: 91.96%
Neutral F1: 90.57% ⬆️
Positive F1: 94.61%
Negative F1: 88.68%
Model: Fine-tuned on 556,888 Turkish sentences
Base Model: codealchemist01/turkish-sentiment-analysis
Made with ❤️ using Gradio and Hugging Face
📧 Model: codealchemist01/turkish-sentiment-analysis-finetuned