apak commited on
Commit
e53c953
·
verified ·
1 Parent(s): a116fd7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +76 -25
app.py CHANGED
@@ -33,12 +33,10 @@ def refine_label_with_llm(entity_text, full_sentence, wiki_context, custom_label
33
  device = "cuda" if torch.cuda.is_available() else "cpu"
34
  llm_model.to(device)
35
 
36
- # Detaylandırılmış Sözlük Yapısı
37
  label_rules = ""
38
  for k, v in custom_label_definitions.items():
39
  label_rules += f"### {k}\n- TANIM: {v['tanim']}\n- ANAHTAR KELİMELER: {', '.join(v['anahtar_kelimeler'])}\n- ÖRNEKLER: {v['ornekler']}\n\n"
40
 
41
- # CoT (Chain of Thought) Tabanlı Uzman Prompt
42
  prompt = f"""Sen uzman bir veri sınıflandırma sistemisin.
43
  Görevin, aşağıdaki BAĞLAM'ı okumak ve ETİKET TANIMLARI'ndan hangisinin varlığa en uygun olduğunu belirlemektir.
44
 
@@ -55,6 +53,7 @@ GÖREV ADIMLARI (Chain of Thought):
55
  2. Wikipedia bağlamını analiz et. Varlık bir eser mi, topluluk mu, ödül mü yoksa dijital bir araç mı?
56
  3. Wikipedia'daki kavramları ETİKET TANIMLARI'ndaki anahtar kelimeler ve örneklerle karşılaştır.
57
  4. Elde ettiğin bulguları sentezle ve kararını ver.
 
58
 
59
  ÇIKTI FORMATI:
60
  Analiz: [Buraya adım adım analizini yaz]
@@ -69,7 +68,6 @@ Cevap: [Sadece ETIKET_ADI]"""
69
  response_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)]
70
  full_output = tokenizer.batch_decode(response_ids, skip_special_tokens=True)[0].strip()
71
 
72
- # Etiket Ayıklama
73
  final_label = "MISC"
74
  valid_keys = list(custom_label_definitions.keys())
75
  match = re.search(r"Cevap:\s*([A-Z_]+)", full_output, re.IGNORECASE)
@@ -109,7 +107,7 @@ def process_ner(text):
109
  },
110
  "AWARD": {
111
  "tanim": "Resmi törenlerle verilen takdir, ödül ve onur simgeleri.",
112
- "anahtar_kelimeler": ["ödül", "festival", "madalya", "nişan", "birincilik", "yarışma", "oscar", "tören"],
113
  "ornekler": "Nobel Barış Ödülü, Altın Portakal, Şampiyonlar Ligi Kupası"
114
  },
115
  "PRODUCT": {
@@ -150,6 +148,7 @@ def process_ner(text):
150
  logs.append(f"<div style='border-left: 4px solid #28a745; background: #f4fff4; padding: 5px;'>🔍 <b>Düşünce Zinciri:</b> {raw_llm_response}</div>")
151
  res = {"Varlık": word, "İlk Etiket": label, "Nihai Etiket": new_label, "Kaynak": "RAG+LLM"}
152
  else:
 
153
  res = {"Varlık": word, "İlk Etiket": label, "Nihai Etiket": "MISC", "Kaynak": "Model"}
154
  else:
155
  res = {"Varlık": word, "İlk Etiket": label, "Nihai Etiket": label, "Kaynak": "Model"}
@@ -162,25 +161,77 @@ def process_ner(text):
162
 
163
  # --- 4. ARAYÜZ ---
164
  with gr.Blocks(title="NER RAG CoT") as demo:
165
- gr.Markdown("# MISCNER (CoT & RAG)")
166
- with gr.Row():
167
- input_text = gr.Textbox(label="Metin Girişi", lines=5)
168
- with gr.Row():
169
- with gr.Column(scale=1):
170
- log_output = gr.HTML(label="Sistem Günlüğü", value="Sistem Hazır.")
171
- with gr.Column(scale=2):
172
- table_output = gr.Dataframe(headers=["Varlık", "İlk Etiket", "Nihai Etiket", "Kaynak"])
173
 
174
- submit_btn = gr.Button("Analiz Et", variant="primary")
175
-
176
- def update_ui(text):
177
- for logs, table in process_ner(text):
178
- log_html = "<div style='background: #fff; padding: 10px; border-radius: 8px; border: 1px solid #ddd; height: 500px; overflow-y: auto;'>"
179
- for m in logs: log_html += f"<div style='margin-bottom: 8px;'>{m}</div>"
180
- log_html += "</div>"
181
- yield log_html, table
182
-
183
- submit_btn.click(update_ui, inputs=input_text, outputs=[log_output, table_output])
184
-
185
- if __name__ == "__main__":
186
- demo.launch(server_name="0.0.0.0", server_port=7860, auth=("admin", "1113"))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  device = "cuda" if torch.cuda.is_available() else "cpu"
34
  llm_model.to(device)
35
 
 
36
  label_rules = ""
37
  for k, v in custom_label_definitions.items():
38
  label_rules += f"### {k}\n- TANIM: {v['tanim']}\n- ANAHTAR KELİMELER: {', '.join(v['anahtar_kelimeler'])}\n- ÖRNEKLER: {v['ornekler']}\n\n"
39
 
 
40
  prompt = f"""Sen uzman bir veri sınıflandırma sistemisin.
41
  Görevin, aşağıdaki BAĞLAM'ı okumak ve ETİKET TANIMLARI'ndan hangisinin varlığa en uygun olduğunu belirlemektir.
42
 
 
53
  2. Wikipedia bağlamını analiz et. Varlık bir eser mi, topluluk mu, ödül mü yoksa dijital bir araç mı?
54
  3. Wikipedia'daki kavramları ETİKET TANIMLARI'ndaki anahtar kelimeler ve örneklerle karşılaştır.
55
  4. Elde ettiğin bulguları sentezle ve kararını ver.
56
+ 5. Özellikle 'Ödül' kelimesi geçen varlıklar için 'AWARD' etiketini, 'Film' kelimesi geçen varlıklar için 'MOVIE' etiketini önceliklendir.
57
 
58
  ÇIKTI FORMATI:
59
  Analiz: [Buraya adım adım analizini yaz]
 
68
  response_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)]
69
  full_output = tokenizer.batch_decode(response_ids, skip_special_tokens=True)[0].strip()
70
 
 
71
  final_label = "MISC"
72
  valid_keys = list(custom_label_definitions.keys())
73
  match = re.search(r"Cevap:\s*([A-Z_]+)", full_output, re.IGNORECASE)
 
107
  },
108
  "AWARD": {
109
  "tanim": "Resmi törenlerle verilen takdir, ödül ve onur simgeleri.",
110
+ "anahtar_kelimeler": ["ödül", "festival", "madalya", "nişan", "birincilik", "yarışma", "oscar", "tören", "kupası"],
111
  "ornekler": "Nobel Barış Ödülü, Altın Portakal, Şampiyonlar Ligi Kupası"
112
  },
113
  "PRODUCT": {
 
148
  logs.append(f"<div style='border-left: 4px solid #28a745; background: #f4fff4; padding: 5px;'>🔍 <b>Düşünce Zinciri:</b> {raw_llm_response}</div>")
149
  res = {"Varlık": word, "İlk Etiket": label, "Nihai Etiket": new_label, "Kaynak": "RAG+LLM"}
150
  else:
151
+ logs.append(f"❌ {word} için Wiki bağlamı yok.")
152
  res = {"Varlık": word, "İlk Etiket": label, "Nihai Etiket": "MISC", "Kaynak": "Model"}
153
  else:
154
  res = {"Varlık": word, "İlk Etiket": label, "Nihai Etiket": label, "Kaynak": "Model"}
 
161
 
162
  # --- 4. ARAYÜZ ---
163
  with gr.Blocks(title="NER RAG CoT") as demo:
164
+ gr.Markdown("# 🚀 Uzman Veri Sınıflandırma Sistemi (CoT & RAG)")
 
 
 
 
 
 
 
165
 
166
+ with gr.Tab("Metin Analizi"): # Ana analiz sekmesi
167
+ with gr.Row():
168
+ input_text = gr.Textbox(label="Metin Girişi", lines=5)
169
+
170
+ # 1-) Gradio Örnekleri
171
+ gr.Examples(
172
+ examples=[
173
+ "Türkiye'nin ilk yerli yazılımı olan Milli-Yaz, yeni nesil telefonlarda kullanılacak.", # SOFTWARE, PRODUCT, GPE
174
+ "Nobel Barış Ödülü'nü kazanan yazar, son romanı 'Gizli Bahçe' ile büyük beğeni topladı.", # AWARD, BOOK, PERSON
175
+ "Geçen yıl vizyona giren Oppenheimer filmi, gişede rekorlar kırdı ve birçok ödül aldı." # MOVIE, AWARD
176
+ ],
177
+ inputs=input_text,
178
+ outputs=[input_text], # Örnek tıklandığında input_text'i doldurur
179
+ fn=lambda x: x, # Basit bir passthrough fonksiyonu
180
+ cache_examples=False,
181
+ )
182
+
183
+ with gr.Row():
184
+ with gr.Column(scale=1):
185
+ log_output = gr.HTML(label="Sistem Günlüğü", value="Sistem Hazır.")
186
+ with gr.Column(scale=2):
187
+ table_output = gr.Dataframe(headers=["Varlık", "İlk Etiket", "Nihai Etiket", "Kaynak"])
188
+
189
+ submit_btn = gr.Button("Analiz Et", variant="primary")
190
+ submit_btn.click(process_ner, inputs=input_text, outputs=[log_output, table_output])
191
+
192
+ with gr.Tab("Algoritma / İş Akışı"): # Yeni iş akışı sekmesi
193
+ gr.Markdown("""
194
+ ### 📊 Sistemin İş Akışı ve Algoritması
195
+
196
+ Bu sistem, metinlerdeki adlandırılmış varlıkları (kişi, yer, kurum vb.) tespit etmek ve özellikle `MISC` (Çeşitli) olarak etiketlenmiş belirsiz varlıkları, harici bilgi (Wikipedia) ve gelişmiş yapay zeka (LLM) kullanarak daha spesifik kategorilere ayırmak için tasarlanmıştır.
197
+
198
+ ---
199
+
200
+ #### 🧩 **Adım 1: İlk Etiketleme (NER Modeli)**
201
+ - **Model:** `xlm-roberta-large-finetuned-conll03-english` (Hugging Face Transformers)
202
+ - **İşlev:** Gelen metni tarar ve içindeki varlıkları önceden tanımlanmış etiketlere (PER: Kişi, ORG: Kurum, LOC: Konum, MISC: Çeşitli vb.) ayırır.
203
+ - **Çıktı:** Her varlık için bir başlangıç etiketi ve varlığın kendisi.
204
+
205
+ #### 🔍 **Adım 2: MISC Etiketi Kontrolü**
206
+ - **İşlev:** İlk etiketleme sonucunda, `PER`, `ORG`, `LOC` gibi yüksek başarımlı etiketler doğrudan kabul edilir ve LLM sürecine sokulmaz.
207
+ - **Odak Noktası:** Yalnızca `MISC` olarak etiketlenmiş varlıklar için derinlemesine analiz başlatılır.
208
+
209
+ #### 🌐 **Adım 3: Wikipedia Bilgi Edinimi (RAG)**
210
+ - **Araç:** `wikipedia` kütüphanesi.
211
+ - **İşlev:** `MISC` etiketli her varlık için Wikipedia'da kısa bir özet (summary) aranır. Bu özet, varlık hakkında ek bağlamsal bilgi sağlar.
212
+ - **Çıktı:** Varlıkla ilgili 2 cümlelik Wikipedia özeti (bulunamazsa boş).
213
+
214
+ #### 🧠 **Adım 4: Büyük Dil Modeli (LLM) ile Detaylı Sınıflandırma (CoT)**
215
+ - **Model:** `Qwen/Qwen2.5-1.5B-Instruct` (Hugging Face Transformers)
216
+ - **Teknik:** **Chain of Thought (CoT - Düşünce Zinciri)** ve **Detaylı Etiket Sözlüğü**.
217
+ - **İşlev:**
218
+ 1. **Uzman Prompt:** LLM'e "uzman bir sınıflandırma sistemi" olduğu rolü atanır.
219
+ 2. **Detaylı Etiket Rehberi:** Sistem, her kategori (MOVIE, SOFTWARE, AWARD vb.) için `TANIM`, `ANAHTAR KELİMELER` ve `ÖRNEKLER` içeren zengin bir rehberle beslenir.
220
+ 3. **Çoklu Bağlam Analizi:** LLM, hem orijinal cümlenin tamamını hem de Wikipedia özetini dikkate alır. Özellikle orijinal cümledeki varlığın hemen yanındaki kelimeler (örn: "Oppenheimer filmi"ndeki "filmi" kelimesi) kritik rol oynar.
221
+ 4. **Adım Adım Akıl Yürütme (CoT):** LLM'den, kararını verirken "Orijinal cümleyi analiz et, Wiki'yi analiz et, rehberle karşılaştır, sentezle" gibi adımları takip etmesi istenir. Bu süreç, modelin mantığını loglarda şeffaf bir şekilde görmemizi sağlar.
222
+ 5. **Öncelikli Kurallar:** "Film kelimesi geçiyorsa MOVIE etiketini önceliklendir" gibi spesifik kurallar, modelin yanlış kararlarını azaltmak için prompt'a dahil edilmiştir.
223
+ - **Çıktı:** `Analiz: [Modelin düşünce zinciri]` ve `Cevap: [Kesin Etiket]` formatında bir yanıt.
224
+
225
+ #### ✨ **Adım 5: Nihai Etiket Ataması**
226
+ - **İşlev:** LLM'den gelen `Cevap: ETIKET_ADI` çıktısı alınır ve varlığın `Nihai Etiket` değeri olarak atanır.
227
+ - **Loglama:** Her adım, kullanıcının süreci takip etmesi için detaylı olarak günlüğe kaydedilir (Wikipedia bilgisi, LLM'in Düşünce Zinciri).
228
+
229
+ ---
230
+
231
+ ### 🎯 Hedef
232
+ Bu iş akışı, temel NER modelinin sınırlamalarını aşarak, belirsiz (`MISC`) varlıkları harici bilgi ve gelişmiş yapay zeka yöntemleriyle doğru ve güvenilir bir şekilde sınıflandırmayı hedefler.
233
+ """)
234
+
235
+ # --- SİSTEMİ BAŞLAT ---
236
+ if __name__ == "__main__":
237
+ demo.launch(server_name="0.0.0.0", server_port=7860, auth=("admin", "1113"))