Spaces:
Running
Running
Upload 2 files
Browse files- app.py +149 -0
- 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
|