apak commited on
Commit
dd04ea5
·
verified ·
1 Parent(s): 8a1acfd

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +146 -146
app.py CHANGED
@@ -1,123 +1,101 @@
1
  import torch
 
 
2
  import os
3
  import re
4
- import requests
5
  import gradio as gr
6
  from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
7
- from labels_config import custom_labels
8
- import spaces
9
 
10
  # --- 1. MODELLERİN HAZIRLANMASI ---
11
- # NER modeli CPU üzerinde çalışacak şekilde ayarlandı
12
  ner_pipe = pipeline("ner", model="xlm-roberta-large-finetuned-conll03-english", aggregation_strategy="simple", device=-1)
13
-
14
  model_id = "Qwen/Qwen2.5-1.5B-Instruct"
15
  tokenizer = AutoTokenizer.from_pretrained(model_id)
16
 
17
  try:
18
- # Model başlangıçta CPU'da yüklenir, @spaces.GPU çağrıldığında otomatik GPU'ya taşınır
19
  llm_model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.bfloat16, device_map="cpu", trust_remote_code=True)
20
  IS_LLM_ENABLED = True
21
  except Exception as e:
22
- print(f"Model yukleme hatasi: {e}")
23
  IS_LLM_ENABLED = False
24
 
25
- # --- 2. GÜVENLİ WIKIPEDIA FONKSİYONU (USER-AGENT İLE) ---
26
  def get_wiki_summary(term):
27
- """Wikipedia API'sini kimlik bilgisi (User-Agent) ile guvenli sekilde sorgular."""
28
  try:
29
- # Wikipedia'nın Hugging Face sunucularını engellememesi için kritik başlık
30
- headers = {
31
- 'User-Agent': 'HuggingFaceRAGBot/1.0 (iletisim@eposta.com; RAG-NER Application)'
32
- }
33
-
34
- # 1. Adım: Terimi Wikipedia üzerinde ara
35
- search_url = "https://wikipedia.org"
36
- search_params = {
37
- "action": "query",
38
- "list": "search",
39
- "srsearch": term,
40
- "format": "json"
41
- }
42
-
43
- search_response = requests.get(search_url, headers=headers, params=search_params, timeout=5)
44
- search_data = search_response.json()
45
-
46
- search_results = search_data.get("query", {}).get("search", [])
47
- if not search_results:
48
- return None
49
-
50
- # [DÜZELTİLDİ] En yakın ilk sonucun başlığını almak için [0] indeksi eklendi
51
- page_title = search_results[0]["title"]
52
-
53
- # 2. Adım: Bu başlığın özetini (summary) getir
54
- summary_params = {
55
- "action": "query",
56
- "prop": "extracts",
57
- "exintro": True,
58
- "explaintext": True,
59
- "exsentences": 2,
60
- "titles": page_title,
61
- "format": "json"
62
- }
63
-
64
- summary_response = requests.get(search_url, headers=headers, params=summary_params, timeout=5)
65
- summary_data = summary_response.json()
66
-
67
- pages = summary_data.get("query", {}).get("pages", {})
68
- for page_id, page_info in pages.items():
69
- if page_id != "-1":
70
- return page_info.get("extract", None)
71
-
72
- return None
73
- except Exception as e:
74
- print(f"Wikipedia Baglanti Hatasi: {str(e)}")
75
- return None
76
 
77
- # --- 3. ETİKET GÜNCELLEME FONKSİYONU (GPU DEKORATÖRÜ) ---
78
  @spaces.GPU
79
- def refine_label_with_llm(entity_text, full_sentence, wiki_context, custom_labels):
80
- """Sadece LLM üretimi için GPU katmanını tetikler (İnternet erişimi barındırmaz)."""
81
- if not IS_LLM_ENABLED:
82
- return "MISC", "LLM Aktif Degil"
83
 
84
  device = "cuda" if torch.cuda.is_available() else "cpu"
85
  llm_model.to(device)
86
 
87
- # 3.1 Etiket Tanımları oluşturma
88
  label_rules = ""
89
- for k, v in custom_labels.items():
90
- label_rules += f"### {k}\n- Tanim: {v['tanim']}\n- Anahtar Kelimeler: {', '.join(v['anahtar_kelimeler'])}\n- Ornekler: {', '.join(v['ornekler'])}\n\n"
91
 
92
- # 3.2 Sistematik Chain of Thought ve Kuralların Tanımlanması
93
- prompt = f"""
94
- Sen yuksek hassasiyetli bir semantik analiz uzmanisin. Gorevin, '[[{entity_text}]]' varligini asagidaki 4 adimli Sistematik CoT protokolune gore siniflandirmaktir.
95
-
96
- ETIKET TANIMLARI:
97
- {label_rules}
98
-
99
- SISTEMATIK CoT ADIMLARI:
100
- Adim 1: Wikipedia'dan gelen bilgilere ("{wiki_context}") dayanarak varligin niteliklerini belirle( yazilim , film, kitap vb.).
101
- Adim 2: Belirledigin nitelikleri yukaridaki {label_rules} listesindeki butun alanlarla karsilastir.
102
- Adim 3: En yuksek anlamsal benzerlige sahip etiketi RAG sonucu olarak sec. Kararini somut kanitlara dayandir
103
- Adim 4: Eger Wikipedia bilgisi yetersizse veya {label_rules} disindaki bir etiket sectiysen; varligin ([[{entity_text}]]) yanindaki niteleyici kelimelerle ("filmi","odul","romanı" vb) birlikte Adim 1, Adim 2 ve Adim 3 asamalarini tekrarla. Eger hicbir etiket {label_rules} listesine uyum saglanamazsa MISC degerini koru.
104
-
105
- GUNCEL GOREV:
106
- - HEDEF VARLIK: {entity_text}
107
- - ORIJINAL CUMLE: "{full_sentence}"
108
- - DAHILI BILGI : "{custom_labels}"
109
- - HARICI BILGI (Wikipedia): "{wiki_context}"
110
-
111
- CIKTI KURALLARI:
112
- - Cevabinda asla yildiz (*) veya markdown kullanma.
113
- - Analiz adimlarini yukaridaki 4 adimli protokole gore yaz. Wikipediadan gelen cevabi yazma, sadece kendi degerlendirmeni yaz.
114
- - Yanitini hicbir aciklama eklemeden dogrudan [ {{ ... }} ] formatında baslat ve bitir.
115
-
116
- CIKTI FORMATI:
117
- Analiz: [4 Adimli CoT Analizi]
118
- Cevap:
119
- [SADECE_ETIKET_ADI]
120
- """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
 
122
  messages = [{"role": "user", "content": prompt}]
123
  text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
@@ -126,29 +104,38 @@ def refine_label_with_llm(entity_text, full_sentence, wiki_context, custom_label
126
  try:
127
  generated_ids = llm_model.generate(model_inputs.input_ids, max_new_tokens=450, do_sample=False, temperature=0.1)
128
  response_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)]
129
- full_output = tokenizer.batch_decode(response_ids, skip_special_tokens=True).strip()
130
 
 
131
  clean_output = full_output.replace("*", "")
132
  final_label = "MISC"
133
- valid_keys = list(custom_labels.keys())
134
  match = re.search(r"Cevap:\s*([A-Z_]+)", clean_output, re.IGNORECASE)
135
 
136
  if match:
137
  extracted = match.group(1).upper().strip()
138
- if extracted in valid_keys:
139
- final_label = extracted
140
 
141
  return final_label, clean_output
142
  except Exception as e:
143
  return "MISC", f"Hata: {str(e)}"
144
 
145
- # --- 4. ANA ISLEM HATTI ---
146
  def process_ner(text):
147
- """Metni parcalar, CPU uzerinde RAG sorgusu yapar ve gerekirse GPU'yu cagirir."""
148
- current_logs = ["<b>Sistem Baslatildi:</b> Metin analiz ediliyor..."]
149
  final_results = []
150
  yield "<br>".join(current_logs), []
151
-
 
 
 
 
 
 
 
 
 
 
152
  initial_results = ner_pipe(text)
153
 
154
  for entity in initial_results:
@@ -156,64 +143,77 @@ def process_ner(text):
156
  label = entity['entity_group']
157
 
158
  if label in ["PER", "ORG", "LOC"]:
159
- res = {"Varlik": word, "Ilk Etiket": label, "Nihai Etiket": label, "Kaynak": "Model"}
160
- current_logs.append(f"✅ <b>{word}</b>: {label} (Dogrudan Tespit)")
161
  elif label == "MISC":
162
- current_logs.append(f"🔍 <b>Analiz Basladi:</b> '{word}'")
163
- yield "<br>".join(current_logs), [[r["Varlik"], r["Ilk Etiket"], r["Nihai Etiket"], r["Kaynak"]] for r in final_results]
164
 
165
- # İnternet isteği @spaces.GPU katmanının dışında (burada) sorunsuz çalışır
166
  wiki_text = get_wiki_summary(word)
167
  if wiki_text:
168
  current_logs.append(f"<div style='margin-left:20px; border-left:2px solid #007bff; padding-left:10px; color:#555;'>🌐 <b>Wiki:</b> {wiki_text}</div>")
169
- yield "<br>".join(current_logs), [[r["Varlik"], r["Ilk Etiket"], r["Nihai Etiket"], r["Kaynak"]] for r in final_results]
170
-
171
- # Ağ isteği bittikten sonra sadece LLM çıkarımı için sıraya girilir ve GPU tetiklenir
172
  new_label, cot_text = refine_label_with_llm(word, text, wiki_text, custom_labels)
173
  current_logs.append(f"<div style='margin-left:20px; border-left:2px solid #28a745; padding-left:10px;'>🧠 <b>CoT Analizi:</b> {cot_text}</div>")
174
- res = {"Varlik": word, "Ilk Etiket": label, "Nihai Etiket": new_label, "Kaynak": "RAG+LLM"}
175
  else:
176
- current_logs.append(f"⚠️ '{word}' icin Wikipedia kaydi bulunamadi veya sunucu bloklandi.")
177
- res = {"Varlik": word, "Ilk Etiket": label, "Nihai Etiket": "MISC", "Kaynak": "Model"}
178
 
179
  final_results.append(res)
180
- table_display = [[r["Varlik"], r["Ilk Etiket"], f"<b>{r['Nihai Etiket']}</b>", r["Kaynak"]] for r in final_results]
 
181
  yield "<br>".join(current_logs), table_display
182
 
183
- current_logs.append("✨ <b>Analiz Tamamlandi.</b>")
184
- yield "<br>".join(current_logs), [[r["Varlik"], r["Ilk Etiket"], f"<b>{r['Nihai Etiket']}</b>", r["Kaynak"]] for r in final_results]
185
 
186
- # --- 5. GRADIO ARAYUZU ---
187
- with gr.Blocks(title="RAG-NER Sistemi") as demo:
188
- gr.Markdown("# 🚀 Wikipedia Destekli RAG-NER Uygulaması")
189
- gr.Markdown("Metin içerisindeki karmaşık (MISC) varlıkları Wikipedia ve LLM kullanarak akıllıca sınıflandırın.")
190
 
191
- with gr.Row():
192
- with gr.Column(scale=1):
193
- input_text = gr.Textbox(
194
- label="Analiz Edilecek Metin",
195
- placeholder="Örnek: Windows 11 Microsoft tarafından geliştirildi. 1984 romanı çok satıyor...",
196
- lines=5
197
- )
198
- submit_btn = gr.Button("Analiz Et", variant="primary")
199
-
200
- with gr.Column(scale=1):
201
- gr.Markdown("### 📊 İşlem Sonuçları")
202
- output_table = gr.Dataframe(
203
- headers=["Varlık", "İlk Etiket", "Nihai Etiket", "Kaynak"],
204
- datatype=["str", "str", "markdown", "str"],
205
- label="Tespit Edilen Varlıklar Tablosu"
206
- )
207
-
208
- with gr.Row():
209
- with gr.Column():
210
- gr.Markdown("### 📜 Canlı Sistem Akış Logları")
211
- output_logs = gr.HTML(
212
- value="Sistem hazır. Metin girip 'Analiz Et' butonuna basınız.",
213
- label="Log Ekranı"
 
 
 
 
 
214
  )
 
 
 
 
 
 
 
 
 
215
 
216
- # Girdi ve çıktılar eksiksiz şekilde birbirine bağlandı
217
- submit_btn.click(
218
- fn=process_ner,
219
- inputs=[input_text],outputs=[output_logs, output_table])
 
 
 
 
1
  import torch
2
+ import wikipedia
3
+ import spaces
4
  import os
5
  import re
 
6
  import gradio as gr
7
  from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
 
 
8
 
9
  # --- 1. MODELLERİN HAZIRLANMASI ---
 
10
  ner_pipe = pipeline("ner", model="xlm-roberta-large-finetuned-conll03-english", aggregation_strategy="simple", device=-1)
 
11
  model_id = "Qwen/Qwen2.5-1.5B-Instruct"
12
  tokenizer = AutoTokenizer.from_pretrained(model_id)
13
 
14
  try:
 
15
  llm_model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.bfloat16, device_map="cpu", trust_remote_code=True)
16
  IS_LLM_ENABLED = True
17
  except Exception as e:
 
18
  IS_LLM_ENABLED = False
19
 
20
+ # --- 2. YARDIMCI FONKSİYONLAR ---
21
  def get_wiki_summary(term):
22
+ """Varlık için Wikipedia özeti getirir."""
23
  try:
24
+ wikipedia.set_lang("tr")
25
+ search_results = wikipedia.search(term)
26
+ if not search_results: return None
27
+ return wikipedia.summary(search_results[0], sentences=2, auto_suggest=False)
28
+ except: return None
29
+
30
+ def get_random_examples():
31
+ """Wikipedia'dan rastgele cümleler çekerek örnek listesi oluşturur."""
32
+ wikipedia.set_lang("tr")
33
+ try:
34
+ random_titles = wikipedia.random(pages=3)
35
+ return [[wikipedia.summary(t, sentences=1, auto_suggest=False)] for t in random_titles]
36
+ except:
37
+ return [["Oppenheimer filmi geçen yıl vizyona girdi."], ["Sefiller romanı Victor Hugo tarafından yazılmıştır."]]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
 
 
39
  @spaces.GPU
40
+ def refine_label_with_llm(entity_text, full_sentence, wiki_context, custom_label_definitions):
41
+ if not IS_LLM_ENABLED: return "MISC", "LLM Aktif Değil"
 
 
42
 
43
  device = "cuda" if torch.cuda.is_available() else "cpu"
44
  llm_model.to(device)
45
 
46
+ # 1. Etiket Tanımları (Bilgi Kaynağı)
47
  label_rules = ""
48
+ for k, v in custom_label_definitions.items():
49
+ label_rules += f"### {k}\n- TANIM: {v['tanim']}\n- ANAHTARLAR: {', '.join(v['anahtar_kelimeler'])}\n\n"
50
 
51
+ # 2. Sistematik CoT ve Kuralların Tanımlanması
52
+ prompt = f"""Sen yüksek hassasiyetli bir semantik analiz uzmanısın.
53
+ Görevin, '[[{entity_text}]]' varlığını aşağıdaki 4 adımlı Sistematik CoT protokolüne göre sınıflandırmaktır.
54
+
55
+ ETİKET TANIMLARI:
56
+ {label_rules}
57
+
58
+ SİSTEMATİK CoT ADIMLARI:
59
+ 1. **Sentaktik İnceleme:** Cümle içinde varlığın sağındaki ve solundaki kelimeleri (niteleyicileri) tespit et. Varlık bir fiille mi (yazıldı, vizyona girdi) yoksa bir isimle mi (yazılımı, ödülü) ilişkili?
60
+ 2. **Bilgi Entegrasyonu:** Wikipedia verisindeki genel tanımı oku. Varlığın tarihsel veya teknik kimliğini belirle.
61
+ 3. **Çelişki ve Hiyerarşi Denetimi:** Wikipedia bilgisi ile cümledeki kullanım amacı çelişiyor mu? (Örn: Wiki 'film' diyor ama cümle 'kitap' diyorsa, cümledeki kullanım esastır).
62
+ 4. **Etiket Eşleşmesi:** Elde edilen nihai kanıtları, 'ETİKET TANIMLARI'ndaki en yakın kategoriyle eşleştir ve son kararı ver.
63
+
64
+ REFERANS ANALİZLER (FEW-SHOT):
65
+ Örnek 1 (Tam Uyum):
66
+ VARLIK: 'Inception'
67
+ CÜMLE: "Dün gece Inception filmini tekrar izledim."
68
+ WIKI: "Inception, Christopher Nolan tarafından yönetilen 2010 yapımı bilimkurgu filmidir."
69
+ ANALİZ:
70
+ - Adım 1: Cümlede 'film' ve 'izlemek' kelimeleri görsel esere işaret ediyor.
71
+ - Adım 2: Wiki verisi varlığın bir film olduğunu doğruluyor.
72
+ - Adım 3: Kaynaklar arasında çelişki yok.
73
+ - Adım 4: MOVIE etiketi uygundur.
74
+ CEVAP: MOVIE
75
+
76
+ Örnek 2 (Kritik Çelişki):
77
+ VARLIK: 'Gizli Bahçe'
78
+ CÜMLE: "Yazar son romanı 'Gizli Bahçe' ile ödül aldı."
79
+ WIKI: "Gizli Bahçe: 1993 yapımı bir dram filmidir."
80
+ ANALİZ:
81
+ - Adım 1: Cümlede 'roman' ve 'yazar' kelimeleri varlığı doğrudan kitap olarak niteliyor.
82
+ - Adım 2: Wiki verisi bu ismi bir film (movie) olarak gösteriyor.
83
+ - Adım 3: ÇELİŞKİ TESPİT EDİLDİ. Kaynak hiyerarşisi gereği cümledeki 'roman' ifadesi Wikipedia'dan daha önceliklidir.
84
+ - Adım 4: BOOK etiketi uygundur.
85
+ CEVAP: BOOK
86
+
87
+ GÜNCEL GÖREV:
88
+ - HEDEF VARLIK: {entity_text}
89
+ - ORİJİNAL CÜMLE: "{full_sentence}"
90
+ - HARİCİ BİLGİ (Wikipedia): "{wiki_context}"
91
+
92
+ ÇIKTI KURALLARI:
93
+ - Cevabında asla yıldız (*) veya markdown kullanma.
94
+ - Analiz adımlarını yukarıdaki 4 adımlı protokole göre yaz.
95
+
96
+ ÇIKTI FORMATI:
97
+ Analiz: [4 Adımlı CoT Analizi]
98
+ Cevap: [SADECE_ETIKET_ADI]"""
99
 
100
  messages = [{"role": "user", "content": prompt}]
101
  text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
 
104
  try:
105
  generated_ids = llm_model.generate(model_inputs.input_ids, max_new_tokens=450, do_sample=False, temperature=0.1)
106
  response_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)]
107
+ full_output = tokenizer.batch_decode(response_ids, skip_special_tokens=True)[0].strip()
108
 
109
+ # Markdown temizliği ve Etiket Ayıklama
110
  clean_output = full_output.replace("*", "")
111
  final_label = "MISC"
112
+ valid_keys = list(custom_label_definitions.keys())
113
  match = re.search(r"Cevap:\s*([A-Z_]+)", clean_output, re.IGNORECASE)
114
 
115
  if match:
116
  extracted = match.group(1).upper().strip()
117
+ if extracted in valid_keys: final_label = extracted
 
118
 
119
  return final_label, clean_output
120
  except Exception as e:
121
  return "MISC", f"Hata: {str(e)}"
122
 
123
+ # --- 3. ANA İŞLEM HATTI ---
124
  def process_ner(text):
125
+ current_logs = ["🚀 <b>Sistem Başlatıldı:</b> Metin analiz ediliyor..."]
 
126
  final_results = []
127
  yield "<br>".join(current_logs), []
128
+
129
+ custom_labels = {
130
+ "MOVIE": {"tanim": "Sinematik eserler.", "anahtar_kelimeler": ["film", "dizi"], "ornekler": ["Inception", "Ezel"]},
131
+ "BOOK": {"tanim": "Yazılı edebi eserler.", "anahtar_kelimeler": ["kitap", "roman"], "ornekler": ["Sefiller", "Nutuk"]},
132
+ "SOFTWARE": {"tanim": "Dijital sistemler.", "anahtar_kelimeler": ["yazılım", "kod"], "ornekler": ["Linux", "Python"]},
133
+ "AWARD": {"tanim": "Resmi ödüller.", "anahtar_kelimeler": ["ödül", "oscar"], "ornekler": ["Nobel", "Altın Portakal"]},
134
+ "PRODUCT": {"tanim": "Ticari ürünler.", "anahtar_kelimeler": ["marka", "model"], "ornekler": ["iPhone", "Tesla"]},
135
+ "NORP": {"tanim": "Etnik ve dini gruplar.", "anahtar_kelimeler": ["millet", "topluluk"], "ornekler": ["Türkler", "Ruslar"]},
136
+ "GPE": {"tanim": "Siyasi bölgeler.", "anahtar_kelimeler": ["ülke", "şehir"], "ornekler": ["Türkiye", "İstanbul"]}
137
+ }
138
+
139
  initial_results = ner_pipe(text)
140
 
141
  for entity in initial_results:
 
143
  label = entity['entity_group']
144
 
145
  if label in ["PER", "ORG", "LOC"]:
146
+ res = {"Varlık": word, "İlk Etiket": label, "Nihai Etiket": label, "Kaynak": "Model"}
147
+ current_logs.append(f"✅ <b>{word}</b>: {label} (Doğrudan Tespit)")
148
  elif label == "MISC":
149
+ current_logs.append(f"🔍 <b>Analiz Başladı:</b> '{word}'")
150
+ yield "<br>".join(current_logs), [[r["Varlık"], r["İlk Etiket"], r["Nihai Etiket"], r["Kaynak"]] for r in final_results]
151
 
 
152
  wiki_text = get_wiki_summary(word)
153
  if wiki_text:
154
  current_logs.append(f"<div style='margin-left:20px; border-left:2px solid #007bff; padding-left:10px; color:#555;'>🌐 <b>Wiki:</b> {wiki_text}</div>")
 
 
 
155
  new_label, cot_text = refine_label_with_llm(word, text, wiki_text, custom_labels)
156
  current_logs.append(f"<div style='margin-left:20px; border-left:2px solid #28a745; padding-left:10px;'>🧠 <b>CoT Analizi:</b> {cot_text}</div>")
157
+ res = {"Varlık": word, "İlk Etiket": label, "Nihai Etiket": new_label, "Kaynak": "RAG+LLM"}
158
  else:
159
+ current_logs.append(f"⚠️ '{word}' için Wikipedia kaydı bulunamadı.")
160
+ res = {"Varlık": word, "İlk Etiket": label, "Nihai Etiket": "MISC", "Kaynak": "Model"}
161
 
162
  final_results.append(res)
163
+ # Tablo çıktısında Nihai Etiket bold yapılır
164
+ table_display = [[r["Varlık"], r["İlk Etiket"], f"<b>{r['Nihai Etiket']}</b>", r["Kaynak"]] for r in final_results]
165
  yield "<br>".join(current_logs), table_display
166
 
167
+ current_logs.append("✨ <b>Analiz Tamamlandı.</b>")
168
+ yield "<br>".join(current_logs), [[r["Varlık"], r["İlk Etiket"], f"<b>{r['Nihai Etiket']}</b>", r["Kaynak"]] for r in final_results]
169
 
170
+ # --- 4. GRADIO ARAYÜZÜ ---
171
+ with gr.Blocks(title="RAG-NER Uzman Karar Destek Sistemi") as demo:
172
+ gr.Markdown("# 🚀 RAG-NER Uzman Karar Destek Sistemi")
 
173
 
174
+ with gr.Tab("Metin Analizi"):
175
+ input_text = gr.Textbox(
176
+ label="Analiz Edilecek Metin",
177
+ placeholder="Analiz etmek istediğiniz metni buraya girin...",
178
+ lines=3
179
+ )
180
+
181
+ # EKSİK OLAN ÖRNEKLER BÖLÜMÜ BURADA TANIMLANDI
182
+ examples_list = [
183
+ ["Türk yönetmen Nuri Bilge Ceylan, Venedik Film Festivali'nde Altın Aslan ödülünü kazandığı Kış Uykusu filmiyle uluslararası üne kavuştu."],
184
+ ["Amerikalı yazar George Orwell'in ünlü kitabı 1984, Apple şirketinin Macintosh tanıtım reklamında ilham kaynağı olarak kullanılmış ve Windows işletim sistemine karşı bir metafor haline gelmişti."],
185
+ ["Fransız oyuncu Marion Cotillard, Christopher Nolan'ın Inception filmiyle Oscar ödülüne aday gösterilmiş ve daha önce La Vie en Rose performansıyla En İyi Kadın Oyuncu Akademi Ödülü'nü kazanmıştı."]
186
+ ]
187
+
188
+ gr.Examples(
189
+ examples=examples_list,
190
+ inputs=input_text,
191
+ label="Hazır Örnek Senaryolar"
192
+ )
193
+
194
+ with gr.Row():
195
+ # Log çıktısı için HTML bileşeni
196
+ log_output = gr.HTML(label="Sistem Günlüğü")
197
+ # Tablo çıktısı (Markdown desteği ile kalın yazıları gösterir)
198
+ table_output = gr.Dataframe(
199
+ headers=["Varlık", "İlk Etiket", "Nihai Etiket", "Kaynak"],
200
+ datatype="markdown",
201
+ wrap=True
202
  )
203
+
204
+ btn = gr.Button("Analiz Et", variant="primary")
205
+
206
+ # Buton fonksiyonu
207
+ btn.click(
208
+ process_ner,
209
+ inputs=input_text,
210
+ outputs=[log_output, table_output]
211
+ )
212
 
213
+ # --- 5. KULLANICI DENETİMİ (LOGIN) ---
214
+ if __name__ == "__main__":
215
+
216
+ demo.launch(
217
+ auth=("admin", "1113"),
218
+ auth_message="Lütfen uzman paneline erişmek için giriş yapın."
219
+ )