elisara commited on
Commit
5f617a5
·
verified ·
1 Parent(s): f92dd6a

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +149 -0
  2. requierements.txt +8 -0
app.py ADDED
@@ -0,0 +1,149 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 📚 Gerekli Kütüphaneler (Libraries)
2
+ import re
3
+ import string
4
+ import gradio as gr
5
+ import matplotlib.pyplot as plt
6
+ import pandas as pd
7
+ from langdetect import detect # Dil tespiti için
8
+ from transformers import AutoTokenizer, AutoModelForSequenceClassification, TextClassificationPipeline
9
+
10
+ finbert_model_name = "yiyanghkust/finbert-tone"
11
+ finbert_tokenizer = AutoTokenizer.from_pretrained(finbert_model_name)
12
+ finbert_model = AutoModelForSequenceClassification.from_pretrained(finbert_model_name)
13
+ finbert_classifier = TextClassificationPipeline(model=finbert_model, tokenizer=finbert_tokenizer, top_k=None)
14
+
15
+ xlm_model_name = "cardiffnlp/twitter-xlm-roberta-base-sentiment"
16
+ xlm_tokenizer = AutoTokenizer.from_pretrained(xlm_model_name)
17
+ xlm_model = AutoModelForSequenceClassification.from_pretrained(xlm_model_name)
18
+ xlm_classifier = TextClassificationPipeline(model=xlm_model, tokenizer=xlm_tokenizer, top_k=None)
19
+
20
+
21
+ def clean_text(text):
22
+ text = text.lower()
23
+ text = re.sub(r'\n', ' ', text)
24
+ text = re.sub(r'\s+', ' ', text).strip()
25
+ text = re.sub(r'[%s]' % re.escape(string.punctuation), '', text)
26
+ return text
27
+
28
+ def smart_batch_classify(user_inputs):
29
+ texts = user_inputs.split('\n') # Her satır bir haber
30
+ texts = [t for t in texts if t.strip() != ''] # Boşları çıkar
31
+
32
+ results = []
33
+ for text in texts:
34
+ original_text = text
35
+ cleaned_text = clean_text(text)
36
+
37
+
38
+ try:
39
+ lang = detect(cleaned_text)
40
+ except:
41
+ lang = "unknown"
42
+
43
+
44
+ if lang == "en":
45
+ outputs = finbert_classifier(cleaned_text)[0]
46
+ else:
47
+ outputs = xlm_classifier(cleaned_text)[0]
48
+
49
+ labels_scores = {out['label'].lower(): out['score'] for out in outputs}
50
+ best_label = max(labels_scores, key=labels_scores.get)
51
+ best_confidence = labels_scores[best_label]
52
+
53
+ positive_score = labels_scores.get("positive", 0) * 100
54
+ negative_score = labels_scores.get("negative", 0) * 100
55
+ neutral_score = labels_scores.get("neutral", 0) * 100
56
+
57
+
58
+ if best_label == "positive":
59
+ auto_tag = "📈 Opportunity (Fırsat)"
60
+ elif best_label == "negative":
61
+ auto_tag = "⚠️ Risk Alert (Risk Uyarısı)"
62
+ elif best_label == "neutral":
63
+ auto_tag = "ℹ️ Informational (Bilgilendirme)"
64
+ else:
65
+ auto_tag = "🤔 Unclassified (Sınıflandırılamadı)"
66
+
67
+ results.append((
68
+ original_text,
69
+ lang,
70
+ best_label,
71
+ best_confidence * 100,
72
+ positive_score,
73
+ negative_score,
74
+ neutral_score,
75
+ auto_tag
76
+ ))
77
+
78
+ df_results = pd.DataFrame(results, columns=[
79
+ "Original Text (Orijinal Metin)",
80
+ "Detected Language (Tespit Edilen Dil)",
81
+ "Predicted Sentiment (Tahmin Edilen Duygu)",
82
+ "Best Confidence (%) (En Yüksek Güven %)",
83
+ "Positive (%) (Pozitif %)",
84
+ "Negative (%) (Negatif %)",
85
+ "Neutral (%) (Nötr %)",
86
+ "Auto Tag (Otomatik Etiket)"
87
+ ])
88
+
89
+ return df_results
90
+
91
+
92
+ def smart_analyze_and_filter(user_inputs, selected_sentiment):
93
+ df_results = smart_batch_classify(user_inputs)
94
+
95
+ if selected_sentiment != "All":
96
+ df_results = df_results[df_results["Predicted Sentiment (Tahmin Edilen Duygu)"] == selected_sentiment]
97
+
98
+ fig, ax = plt.subplots(figsize=(10,6))
99
+ sentiment_colors = {
100
+ "positive": "green",
101
+ "negative": "red",
102
+ "neutral": "blue"
103
+ }
104
+
105
+ color_list = [sentiment_colors.get(sent, "gray") for sent in df_results["Predicted Sentiment (Tahmin Edilen Duygu)"].str.lower()]
106
+
107
+ ax.bar(range(len(df_results)), df_results["Best Confidence (%) (En Yüksek Güven %)"], color=color_list)
108
+ ax.set_xticks(range(len(df_results)))
109
+ ax.set_xticklabels([f"News {i+1}" for i in range(len(df_results))], rotation=45)
110
+ ax.set_ylabel("Best Confidence (%) (En Yüksek Güven %)")
111
+ ax.set_title(f"Sentiment Confidence Trend ({selected_sentiment}) (Duygu Güveni Trend)")
112
+
113
+ plt.tight_layout()
114
+
115
+ return df_results, fig
116
+
117
+
118
+ with gr.Blocks() as demo:
119
+ # 🟩 Başlığı yeşil yaptık
120
+ gr.Markdown("<h1 style='color: green;'>🧠🌍📰 Smart Multilingual Financial News Analyzer</h1>")
121
+ gr.Markdown("Paste multiple news headlines (any language!) and get accurate sentiment prediction!")
122
+ gr.Markdown("## 🧠🌍📰 Çok Dilli Finansal Haber Analizörü")
123
+ gr.Markdown("Birden fazla haber başlığını yapıştırın ve doğru modelle otomatik analiz edin!")
124
+ gr.Markdown("Haberleri satır satır analiz ediyorum.🗞️📰")
125
+
126
+
127
+ gr.HTML("""
128
+ <div style='text-align: center; color: red; font-size: 12px; font-weight: bold;'>
129
+ 🎂 Doğum Günün Kutlu Olsun Babacım, Ali Sakin! 🎉❤️
130
+ </div>
131
+ """)
132
+ gr.HTML("""
133
+ <div style='text-align: center; color: gray; font-size: 4px;'>
134
+ (Happy Birthday My Father, Ali Sakin ��)
135
+ </div>
136
+ """)
137
+
138
+ user_input = gr.Textbox(lines=10, placeholder="Enter each news headline (any language)...", label="📝 News Headlines (Haber Başlıkları)")
139
+ sentiment_filter = gr.Dropdown(["All", "positive", "negative", "neutral"], label="🎯 Filter by Sentiment (Duyguya Göre Filtrele)", value="All")
140
+
141
+ output_table = gr.Dataframe(label="🔮 Prediction Table (Otomatik Etiketli Tahmin Tablosu)")
142
+ output_plot = gr.Plot(label="📈 Sentiment Confidence Trend (Duygu Güveni Trend Grafiği)")
143
+
144
+ submit_button = gr.Button("Analyze News Batch (Haberleri Analiz Et)")
145
+
146
+ submit_button.click(fn=smart_analyze_and_filter, inputs=[user_input, sentiment_filter], outputs=[output_table, output_plot])
147
+
148
+
149
+ demo.launch()
requierements.txt ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ gradio
2
+ matplotlib
3
+ pandas
4
+ transformers
5
+ langdetect
6
+ torch
7
+ sentencepiece
8
+ protobuf