apak commited on
Commit
e93227c
·
verified ·
1 Parent(s): 6006c59

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +31 -69
app.py CHANGED
@@ -3,9 +3,10 @@ import wikipedia
3
  import spaces
4
  import os
5
  import re
 
6
  import gradio as gr
7
  from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
8
- from labels_config import CUSTOM_LABELS
9
 
10
  # --- 1. MODELLERİN HAZIRLANMASI ---
11
  ner_pipe = pipeline("ner", model="xlm-roberta-large-finetuned-conll03-english", aggregation_strategy="simple", device=-1)
@@ -13,9 +14,16 @@ model_id = "Qwen/Qwen2.5-1.5B-Instruct"
13
  tokenizer = AutoTokenizer.from_pretrained(model_id)
14
 
15
  try:
16
- llm_model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.bfloat16, device_map="cpu", trust_remote_code=True)
 
 
 
 
 
 
17
  IS_LLM_ENABLED = True
18
  except Exception as e:
 
19
  IS_LLM_ENABLED = False
20
 
21
  # --- 2. YARDIMCI FONKSİYONLAR ---
@@ -37,8 +45,6 @@ def get_random_examples():
37
  except:
38
  return [["Oppenheimer filmi geçen yıl vizyona girdi."], ["Sefiller romanı Victor Hugo tarafından yazılmıştır."]]
39
 
40
-
41
-
42
  @spaces.GPU
43
  def refine_labels_batch(misc_items, full_sentence):
44
  """
@@ -48,7 +54,6 @@ def refine_labels_batch(misc_items, full_sentence):
48
  if not IS_LLM_ENABLED or not misc_items: return []
49
 
50
  device = "cuda" if torch.cuda.is_available() else "cpu"
51
- llm_model.to(device)
52
 
53
  # Etiket kurallarını metne dönüştür
54
  label_rules = ""
@@ -97,8 +102,8 @@ Sadece aşağıdaki JSON yapısını döndür, başka açıklama ekleme:
97
  response_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)]
98
  full_output = tokenizer.batch_decode(response_ids, skip_special_tokens=True)[0].strip()
99
 
100
- # JSON Ayıklama
101
- json_match = re.search(r'\[.*\]', full_output, re.DOTALL)
102
  if json_match:
103
  return json.loads(json_match.group(0))
104
  return []
@@ -106,93 +111,55 @@ Sadece aşağıdaki JSON yapısını döndür, başka açıklama ekleme:
106
  print(f"Batch Hatası: {e}")
107
  return []
108
 
 
109
  def process_ner(text):
110
  current_logs = ["🚀 <b>Sistem Başlatıldı:</b> Metin analiz ediliyor..."]
111
  final_results = []
112
- misc_buffer = [] # Toplanacak MISC varlıklar
113
 
 
114
  initial_results = ner_pipe(text)
115
 
116
- # 1. Aşama: Hızlı Tespit ve MISC Toplama
117
  for entity in initial_results:
118
  word = entity['word'].replace(" ", " ").strip()
119
  label = entity['entity_group']
120
 
121
  if label in ["PER", "ORG", "LOC"]:
122
  final_results.append({"Varlık": word, "İlk": label, "Nihai": label, "Kaynak": "Model"})
123
- current_logs.append(f"✅ <b>{word}</b>: {label}")
124
  elif label == "MISC":
 
 
 
125
  wiki_text = get_wiki_summary(word)
126
  misc_buffer.append({"word": word, "wiki": wiki_text or "Bilgi yok."})
127
- current_logs.append(f"🔍 <b>Kuyruğa Alındı:</b> '{word}' (Wiki sorgulandı)")
128
-
129
- yield "<br>".join(current_logs), [[r["Varlık"], r["İlk"], r["Nihai"], r["Kaynak"]] for r in final_results]
130
 
131
  # 2. Aşama: Batch LLM İşleme
132
  if misc_buffer:
133
- current_logs.append(f"🧠 <b>Batch İşlem:</b> {len(misc_buffer)} varlık CoT ile analiz ediliyor...")
134
  yield "<br>".join(current_logs), [[r["Varlık"], r["İlk"], r["Nihai"], r["Kaynak"]] for r in final_results]
135
 
136
  llm_responses = refine_labels_batch(misc_buffer, text)
137
 
138
- for res in llm_responses:
 
 
 
 
 
 
139
  final_results.append({
140
- "Varlık": res['varlik'],
141
  "İlk": "MISC",
142
- "Nihai": res['karar'],
143
  "Kaynak": "RAG+Batch LLM"
144
  })
145
- current_logs.append(f"<div style='color:#28a745;'>💡 <b>{res['varlik']}</b> analizi tamamlandı.</div>")
146
 
147
  current_logs.append("✨ <b>Analiz Tamamlandı.</b>")
148
  table_display = [[r["Varlık"], r["İlk"], f"<b>{r['Nihai']}</b>", r["Kaynak"]] for r in final_results]
149
  yield "<br>".join(current_logs), table_display
150
- # --- 3. ANA İŞLEM HATTI ---
151
- def process_ner(text):
152
- current_logs = ["🚀 <b>Sistem Başlatıldı:</b> Metin analiz ediliyor..."]
153
- final_results = []
154
- yield "<br>".join(current_logs), []
155
-
156
- custom_labels = {
157
- "MOVIE": {"tanim": "Sinematik eserler.", "anahtar_kelimeler": ["film", "dizi"], "ornekler": ["Inception", "Ezel"]},
158
- "BOOK": {"tanim": "Yazılı edebi eserler.", "anahtar_kelimeler": ["kitap", "roman"], "ornekler": ["Sefiller", "Nutuk"]},
159
- "SOFTWARE": {"tanim": "Dijital sistemler.", "anahtar_kelimeler": ["yazılım", "kod"], "ornekler": ["Linux", "Python"]},
160
- "AWARD": {"tanim": "Resmi ödüller.", "anahtar_kelimeler": ["ödül", "oscar"], "ornekler": ["Nobel", "Altın Portakal"]},
161
- "PRODUCT": {"tanim": "Ticari ürünler.", "anahtar_kelimeler": ["marka", "model"], "ornekler": ["iPhone", "Tesla"]},
162
- "NORP": {"tanim": "Etnik ve dini gruplar.", "anahtar_kelimeler": ["millet", "topluluk"], "ornekler": ["Türkler", "Ruslar"]},
163
- "GPE": {"tanim": "Siyasi bölgeler.", "anahtar_kelimeler": ["ülke", "şehir"], "ornekler": ["Türkiye", "İstanbul"]}
164
- }
165
-
166
- initial_results = ner_pipe(text)
167
-
168
- for entity in initial_results:
169
- word = entity['word'].replace(" ", " ").strip()
170
- label = entity['entity_group']
171
-
172
- if label in ["PER", "ORG", "LOC"]:
173
- res = {"Varlık": word, "İlk Etiket": label, "Nihai Etiket": label, "Kaynak": "Model"}
174
- current_logs.append(f"✅ <b>{word}</b>: {label} (Doğrudan Tespit)")
175
- elif label == "MISC":
176
- current_logs.append(f"🔍 <b>Analiz Başladı:</b> '{word}'")
177
- yield "<br>".join(current_logs), [[r["Varlık"], r["İlk Etiket"], r["Nihai Etiket"], r["Kaynak"]] for r in final_results]
178
-
179
- wiki_text = get_wiki_summary(word)
180
- if wiki_text:
181
- 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>")
182
- new_label, cot_text = refine_label_with_llm(word, text, wiki_text, custom_labels)
183
- current_logs.append(f"<div style='margin-left:20px; border-left:2px solid #28a745; padding-left:10px;'>🧠 <b>CoT Analizi:</b> {cot_text}</div>")
184
- res = {"Varlık": word, "İlk Etiket": label, "Nihai Etiket": new_label, "Kaynak": "RAG+LLM"}
185
- else:
186
- current_logs.append(f"⚠️ '{word}' için Wikipedia kaydı bulunamadı.")
187
- res = {"Varlık": word, "İlk Etiket": label, "Nihai Etiket": "MISC", "Kaynak": "Model"}
188
-
189
- final_results.append(res)
190
- # Tablo çıktısında Nihai Etiket bold yapılır
191
- table_display = [[r["Varlık"], r["İlk Etiket"], f"<b>{r['Nihai Etiket']}</b>", r["Kaynak"]] for r in final_results]
192
- yield "<br>".join(current_logs), table_display
193
-
194
- current_logs.append("✨ <b>Analiz Tamamlandı.</b>")
195
- yield "<br>".join(current_logs), [[r["Varlık"], r["İlk Etiket"], f"<b>{r['Nihai Etiket']}</b>", r["Kaynak"]] for r in final_results]
196
 
197
  # --- 4. GRADIO ARAYÜZÜ ---
198
  with gr.Blocks(title="RAG-NER Uzman Karar Destek Sistemi") as demo:
@@ -205,7 +172,6 @@ with gr.Blocks(title="RAG-NER Uzman Karar Destek Sistemi") as demo:
205
  lines=3
206
  )
207
 
208
- # EKSİK OLAN ÖRNEKLER BÖLÜMÜ BURADA TANIMLANDI
209
  examples_list = [
210
  ["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."],
211
  ["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."],
@@ -219,9 +185,7 @@ with gr.Blocks(title="RAG-NER Uzman Karar Destek Sistemi") as demo:
219
  )
220
 
221
  with gr.Row():
222
- # Log çıktısı için HTML bileşeni
223
  log_output = gr.HTML(label="Sistem Günlüğü")
224
- # Tablo çıktısı (Markdown desteği ile kalın yazıları gösterir)
225
  table_output = gr.Dataframe(
226
  headers=["Varlık", "İlk Etiket", "Nihai Etiket", "Kaynak"],
227
  datatype="markdown",
@@ -230,7 +194,6 @@ with gr.Blocks(title="RAG-NER Uzman Karar Destek Sistemi") as demo:
230
 
231
  btn = gr.Button("Analiz Et", variant="primary")
232
 
233
- # Buton fonksiyonu
234
  btn.click(
235
  process_ner,
236
  inputs=input_text,
@@ -239,7 +202,6 @@ with gr.Blocks(title="RAG-NER Uzman Karar Destek Sistemi") as demo:
239
 
240
  # --- 5. KULLANICI DENETİMİ (LOGIN) ---
241
  if __name__ == "__main__":
242
-
243
  demo.launch(
244
  auth=("admin", "1113"),
245
  auth_message="Lütfen uzman paneline erişmek için giriş yapın."
 
3
  import spaces
4
  import os
5
  import re
6
+ import json
7
  import gradio as gr
8
  from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
9
+ from labels_config import CUSTOM_LABEL_DEFINITIONS
10
 
11
  # --- 1. MODELLERİN HAZIRLANMASI ---
12
  ner_pipe = pipeline("ner", model="xlm-roberta-large-finetuned-conll03-english", aggregation_strategy="simple", device=-1)
 
14
  tokenizer = AutoTokenizer.from_pretrained(model_id)
15
 
16
  try:
17
+ # Bellek optimizasyonu için device_map auto ve bfloat16 kullanıldı
18
+ llm_model = AutoModelForCausalLM.from_pretrained(
19
+ model_id,
20
+ torch_dtype=torch.bfloat16,
21
+ device_map="auto",
22
+ trust_remote_code=True
23
+ )
24
  IS_LLM_ENABLED = True
25
  except Exception as e:
26
+ print(f"Model yükleme hatası: {e}")
27
  IS_LLM_ENABLED = False
28
 
29
  # --- 2. YARDIMCI FONKSİYONLAR ---
 
45
  except:
46
  return [["Oppenheimer filmi geçen yıl vizyona girdi."], ["Sefiller romanı Victor Hugo tarafından yazılmıştır."]]
47
 
 
 
48
  @spaces.GPU
49
  def refine_labels_batch(misc_items, full_sentence):
50
  """
 
54
  if not IS_LLM_ENABLED or not misc_items: return []
55
 
56
  device = "cuda" if torch.cuda.is_available() else "cpu"
 
57
 
58
  # Etiket kurallarını metne dönüştür
59
  label_rules = ""
 
102
  response_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)]
103
  full_output = tokenizer.batch_decode(response_ids, skip_special_tokens=True)[0].strip()
104
 
105
+ # JSON Ayıklama (Regex ile güvenli hale getirildi)
106
+ json_match = re.search(r'\[\s*\{.*\}\s*\]', full_output, re.DOTALL)
107
  if json_match:
108
  return json.loads(json_match.group(0))
109
  return []
 
111
  print(f"Batch Hatası: {e}")
112
  return []
113
 
114
+ # --- 3. ANA İŞLEM HATTI ---
115
  def process_ner(text):
116
  current_logs = ["🚀 <b>Sistem Başlatıldı:</b> Metin analiz ediliyor..."]
117
  final_results = []
118
+ misc_buffer = []
119
 
120
+ # 1. Aşama: Hızlı Tespit ve MISC Toplama
121
  initial_results = ner_pipe(text)
122
 
 
123
  for entity in initial_results:
124
  word = entity['word'].replace(" ", " ").strip()
125
  label = entity['entity_group']
126
 
127
  if label in ["PER", "ORG", "LOC"]:
128
  final_results.append({"Varlık": word, "İlk": label, "Nihai": label, "Kaynak": "Model"})
129
+ current_logs.append(f"✅ <b>{word}</b>: {label} (Doğrudan Tespit)")
130
  elif label == "MISC":
131
+ current_logs.append(f"🔍 <b>Wiki Sorgulanıyor:</b> '{word}'")
132
+ yield "<br>".join(current_logs), [[r["Varlık"], r["İlk"], r["Nihai"], r["Kaynak"]] for r in final_results]
133
+
134
  wiki_text = get_wiki_summary(word)
135
  misc_buffer.append({"word": word, "wiki": wiki_text or "Bilgi yok."})
136
+ current_logs.append(f"📦 <b>Kuyruğa Alındı:</b> {word}")
 
 
137
 
138
  # 2. Aşama: Batch LLM İşleme
139
  if misc_buffer:
140
+ current_logs.append(f"🧠 <b>Toplu Analiz Başladı:</b> {len(misc_buffer)} varlık CoT ile işleniyor...")
141
  yield "<br>".join(current_logs), [[r["Varlık"], r["İlk"], r["Nihai"], r["Kaynak"]] for r in final_results]
142
 
143
  llm_responses = refine_labels_batch(misc_buffer, text)
144
 
145
+ for item in misc_buffer:
146
+ # LLM yanıtları içinden doğru varlığı eşleştir
147
+ match = next((res for res in llm_responses if res.get('varlik','').lower() in item['word'].lower()), None)
148
+
149
+ final_label = match['karar'] if match else "MISC"
150
+ cot_summary = match['analiz'] if match else "Analiz yapılamadı."
151
+
152
  final_results.append({
153
+ "Varlık": item['word'],
154
  "İlk": "MISC",
155
+ "Nihai": final_label,
156
  "Kaynak": "RAG+Batch LLM"
157
  })
158
+ current_logs.append(f"<div style='margin-left:20px; border-left:2px solid #28a745; padding-left:10px;'>💡 <b>{item['word']}</b> -> {final_label}<br><small>{cot_summary}</small></div>")
159
 
160
  current_logs.append("✨ <b>Analiz Tamamlandı.</b>")
161
  table_display = [[r["Varlık"], r["İlk"], f"<b>{r['Nihai']}</b>", r["Kaynak"]] for r in final_results]
162
  yield "<br>".join(current_logs), table_display
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
163
 
164
  # --- 4. GRADIO ARAYÜZÜ ---
165
  with gr.Blocks(title="RAG-NER Uzman Karar Destek Sistemi") as demo:
 
172
  lines=3
173
  )
174
 
 
175
  examples_list = [
176
  ["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."],
177
  ["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
  )
186
 
187
  with gr.Row():
 
188
  log_output = gr.HTML(label="Sistem Günlüğü")
 
189
  table_output = gr.Dataframe(
190
  headers=["Varlık", "İlk Etiket", "Nihai Etiket", "Kaynak"],
191
  datatype="markdown",
 
194
 
195
  btn = gr.Button("Analiz Et", variant="primary")
196
 
 
197
  btn.click(
198
  process_ner,
199
  inputs=input_text,
 
202
 
203
  # --- 5. KULLANICI DENETİMİ (LOGIN) ---
204
  if __name__ == "__main__":
 
205
  demo.launch(
206
  auth=("admin", "1113"),
207
  auth_message="Lütfen uzman paneline erişmek için giriş yapın."