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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +57 -111
app.py CHANGED
@@ -37,6 +37,7 @@ def refine_label_with_llm(entity_text, full_sentence, wiki_context, custom_label
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
 
@@ -49,14 +50,13 @@ VERİLER:
49
  - WIKIPEDIA BAĞLAMI: "{wiki_context}"
50
 
51
  GÖREV ADIMLARI (Chain of Thought):
52
- 1. Orijinal cümledeki bağlamı analiz et. Varlığın hemen yanında belirleyici bir anahtar kelime var mı?
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]
60
  Cevap: [Sadece ETIKET_ADI]"""
61
 
62
  messages = [{"role": "user", "content": prompt}]
@@ -64,7 +64,7 @@ Cevap: [Sadece ETIKET_ADI]"""
64
  model_inputs = tokenizer([text], return_tensors="pt").to(device)
65
 
66
  try:
67
- generated_ids = llm_model.generate(model_inputs.input_ids, max_new_tokens=300, do_sample=False, temperature=0.1)
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
 
@@ -86,44 +86,29 @@ Cevap: [Sadece ETIKET_ADI]"""
86
 
87
  # --- 3. ANA İŞLEM HATTI ---
88
  def process_ner(text):
89
- logs = ["🚀 CoT & Uzman Sistem Analizi Başlatıldı..."]
90
  yield logs, []
91
 
92
  custom_labels = {
93
  "MOVIE": {
94
- "tanim": "Sinematik ve görsel sanat eserleri, kurgusal yapımlar, sahne sanatları.",
95
- "anahtar_kelimeler": ["film", "dizi", "sinema", "yönetmen", "yapım", "belgesel", "sinematografik", "oyuncu"],
96
- "ornekler": "Oppenheimer, Hababam Sınıfı, Inception, Yüzüklerin Efendisi"
97
  },
98
  "BOOK": {
99
- "tanim": "Yazılı edebiyat ürünleri, basılı materyaller, ciltli veya dijital kitaplar.",
100
- "anahtar_kelimeler": ["kitap", "roman", "yazar", "edebiyat", "tefrika", "dergi", "makale", "basım", "yayın"],
101
- "ornekler": "Nutuk, Sefiller, Çalıkuşu, Suç ve Ceza"
102
  },
103
  "SOFTWARE": {
104
- "tanim": "Dijital kod tabanlı sistemler, bilgisayar programları, algoritmalar.",
105
- "anahtar_kelimeler": ["yazılım", "program", "algoritma", "kod", "app", "uygulama", "işletim sistemi", "framework"],
106
- "ornekler": "Windows 11, Bayraktar-AI, Python, Adobe Photoshop"
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": {
114
- "tanim": "Fiziksel olarak üretilen, markası olan ticari ürün ve cihazlar.",
115
- "anahtar_kelimeler": ["ürün", "cihaz", "model", "marka", "donanım", "telefon", "bilgisayar", "araç"],
116
- "ornekler": "iPhone 13, Tesla Model 3, PlayStation 5"
117
- },
118
- "NORP": {
119
- "tanim": "Milliyet, din, etnik grup veya siyasi topluluk tanımları.",
120
- "anahtar_kelimeler": ["halk", "millet", "etnik", "din", "vatandaş", "soy", "topluluk", "ırk"],
121
- "ornekler": "Ruslar, Türkler, Müslümanlar, Slavlar"
122
- },
123
- "GPE": {
124
- "tanim": "Siyasi sınırları olan ülkeler, şehirler ve idari bölgeler.",
125
- "anahtar_kelimeler": ["ülke", "şehir", "kent", "eyalet", "başkent", "ilçe", "vatan"],
126
- "ornekler": "Türkiye, Ankara, Polonya, İstanbul"
127
  }
128
  }
129
 
@@ -136,19 +121,19 @@ def process_ner(text):
136
 
137
  if label in ["PER", "ORG", "LOC"]:
138
  res = {"Varlık": word, "İlk Etiket": label, "Nihai Etiket": label, "Kaynak": "Model"}
139
- logs.append(f"✅ {word} ({label})")
140
  elif label == "MISC":
141
- logs.append(f"🧠 CoT Analizi: <b>{word}</b>")
142
  yield logs, [[r["Varlık"], r["İlk Etiket"], r["Nihai Etiket"], r["Kaynak"]] for r in final_results]
143
 
144
  wiki_text = get_wiki_summary(word)
145
  if wiki_text:
146
- logs.append(f"<div style='border-left: 4px solid #007bff; background: #f0f7ff; padding: 5px;'>🌐 <b>Wiki:</b> {wiki_text}</div>")
147
  new_label, raw_llm_response = refine_label_with_llm(word, text, wiki_text, custom_labels)
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"}
@@ -156,82 +141,43 @@ def process_ner(text):
156
  final_results.append(res)
157
  yield logs, [[r["Varlık"], r["İlk Etiket"], r["Nihai Etiket"], r["Kaynak"]] for r in final_results]
158
 
159
- logs.append("✨ Analiz tamamlandı.")
160
  yield logs, [[r["Varlık"], r["İlk Etiket"], r["Nihai Etiket"], r["Kaynak"]] for r in final_results]
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"))
 
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
+ # Çelişki Yönetimi ve CoT Mantığı Eklenmiş Prompt
41
  prompt = f"""Sen uzman bir veri sınıflandırma sistemisin.
42
  Görevin, aşağıdaki BAĞLAM'ı okumak ve ETİKET TANIMLARI'ndan hangisinin varlığa en uygun olduğunu belirlemektir.
43
 
 
50
  - WIKIPEDIA BAĞLAMI: "{wiki_context}"
51
 
52
  GÖREV ADIMLARI (Chain of Thought):
53
+ 1. **Orijinal Cümle Analizi:** Cümle içinde varlığın yanında 'roman', 'kitap', 'film', 'yazılım' gibi tür belirleyici anahtar kelimeler var mı?
54
+ 2. **Wikipedia Analizi:** Wikipedia bağlamı varlık hakkında ne diyor?
55
+ 3. **Çelişki Kontrolü (KRİTİK):** Eğer Wikipedia bağlamı 'FİLM' diyorsa ancak orijinal cümle içinde 'ROMAN' veya 'KİTAP' ifadesi geçiyorsa, Wikipedia bilgisini ikinci plana at ve orijinal cümledeki türü (BOOK) önceliklendir.
56
+ 4. **Eşleştirme:** Elde edilen en güvenilir bağlamı ETİKET TANIMLARI ile karşılaştır.
 
57
 
58
  ÇIKTI FORMATI:
59
+ Analiz: [Buraya Wikipedia ve Cümle arasındaki çelişki kontrolünü de içeren adım adım analizini yaz]
60
  Cevap: [Sadece ETIKET_ADI]"""
61
 
62
  messages = [{"role": "user", "content": prompt}]
 
64
  model_inputs = tokenizer([text], return_tensors="pt").to(device)
65
 
66
  try:
67
+ generated_ids = llm_model.generate(model_inputs.input_ids, max_new_tokens=350, do_sample=False, temperature=0.1)
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
 
 
86
 
87
  # --- 3. ANA İŞLEM HATTI ---
88
  def process_ner(text):
89
+ logs = ["🚀 <b>Sistem Başlatıldı:</b> Metin analiz ediliyor..."]
90
  yield logs, []
91
 
92
  custom_labels = {
93
  "MOVIE": {
94
+ "tanim": "Sinematik eserler, kurgusal görsel yapımlar ve tiyatro oyunları.",
95
+ "anahtar_kelimeler": ["film", "dizi", "sinema", "yönetmen", "belgesel", "vizyon", "gişe"],
96
+ "ornekler": "Oppenheimer, Inception"
97
  },
98
  "BOOK": {
99
+ "tanim": "Yazılı edebi eserler, romanlar ve basılı yayınlar.",
100
+ "anahtar_kelimeler": ["kitap", "roman", "yazar", "edebiyat", "hikaye", "tefrika", "basım"],
101
+ "ornekler": "Nutuk, Sefiller, Gizli Bahçe"
102
  },
103
  "SOFTWARE": {
104
+ "tanim": "Dijital kod tabanlı sistemler, uygulamalar ve algoritmalar.",
105
+ "anahtar_kelimeler": ["yazılım", "program", "algoritma", "kod", "uygulama", "app", "işletim sistemi"],
106
+ "ornekler": "Windows 11, Bayraktar-AI"
107
  },
108
  "AWARD": {
109
+ "tanim": "Resmi törenlerle verilen başarı nişanları ve ödüller.",
110
+ "anahtar_kelimeler": ["ödül", "festival", "madalya", "nişan", "oscar", "tören", "kupa"],
111
+ "ornekler": "Nobel Barış Ödülü, Altın Portakal"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
112
  }
113
  }
114
 
 
121
 
122
  if label in ["PER", "ORG", "LOC"]:
123
  res = {"Varlık": word, "İlk Etiket": label, "Nihai Etiket": label, "Kaynak": "Model"}
124
+ logs.append(f"✅ <b>{word}</b>: {label} (Doğrudan Tespit)")
125
  elif label == "MISC":
126
+ logs.append(f"🔍 <b>Analiz Başladı:</b> '{word}' (MISC) inceleniyor...")
127
  yield logs, [[r["Varlık"], r["İlk Etiket"], r["Nihai Etiket"], r["Kaynak"]] for r in final_results]
128
 
129
  wiki_text = get_wiki_summary(word)
130
  if wiki_text:
131
+ logs.append(f"<div style='border-left: 3px solid #007bff; padding-left: 10px; color: #555;'>🌐 <b>Wiki:</b> {wiki_text}</div>")
132
  new_label, raw_llm_response = refine_label_with_llm(word, text, wiki_text, custom_labels)
133
+ logs.append(f"<div style='border-left: 3px solid #28a745; padding-left: 10px; font-style: italic;'>🧠 <b>CoT Analizi:</b> {raw_llm_response}</div>")
134
  res = {"Varlık": word, "İlk Etiket": label, "Nihai Etiket": new_label, "Kaynak": "RAG+LLM"}
135
  else:
136
+ logs.append(f"⚠️ '{word}' için Wikipedia kaydı bulunamadı.")
137
  res = {"Varlık": word, "İlk Etiket": label, "Nihai Etiket": "MISC", "Kaynak": "Model"}
138
  else:
139
  res = {"Varlık": word, "İlk Etiket": label, "Nihai Etiket": label, "Kaynak": "Model"}
 
141
  final_results.append(res)
142
  yield logs, [[r["Varlık"], r["İlk Etiket"], r["Nihai Etiket"], r["Kaynak"]] for r in final_results]
143
 
144
+ logs.append("✨ <b>Analiz Tamamlandı.</b>")
145
  yield logs, [[r["Varlık"], r["İlk Etiket"], r["Nihai Etiket"], r["Kaynak"]] for r in final_results]
146
 
147
+ # --- 4. GÖRSEL ARAYÜZ ---
148
+ with gr.Blocks(title="Final RAG-NER System") as demo:
149
+ gr.Markdown("# 🚀 Uzman NER & RAG Sistemi")
150
 
151
+ with gr.Tab("Metin Analizi"):
152
+ input_text = gr.Textbox(label="Metin Girişi", lines=4)
 
 
 
153
  gr.Examples(
154
  examples=[
155
+ "Nobel Barış Ödülü'nü kazanan yazar, son romanı 'Gizli Bahçe' ile büyük beğeni topladı.",
156
+ "Oppenheimer filmini izlemek için dün gece Bayraktar-AI yazılımını kullanarak bilet aldık.",
157
+ "Türkiye'nin başkenti Ankara'da düzenlenen teknoloji festivalinde birçok ödül verildi."
158
  ],
159
+ inputs=input_text
 
 
 
160
  )
 
 
 
 
 
 
 
161
  submit_btn = gr.Button("Analiz Et", variant="primary")
162
+
163
+ with gr.Row():
164
+ # Güncellenen Alt Alta Log Görünümü
165
+ log_output = gr.HTML(label="İşlem Adımları", value="Sistem Hazır.")
166
+ table_output = gr.Dataframe(headers=["Varlık", "İlk Etiket", "Nihai Etiket", "Kaynak"], scale=2)
167
+
168
+ with gr.Tab("İş Akışı"):
169
+ gr.Markdown("### 🛠 Algoritma Adımları\n1. NER ile Varlık Tespiti\n2. MISC Etiket Filtreleme\n3. Wikipedia RAG Süreci\n4. CoT & Çelişki Yönetimi ile LLM Kararı")
170
+
171
+ def update_ui(text):
172
+ for logs, table in process_ner(text):
173
+ # Logları alt alta, düzgün bir liste formatında birleştiriyoruz
174
+ log_html = "<div style='display: flex; flex-direction: column; gap: 10px; background: #f9f9f9; padding: 15px; border-radius: 8px; border: 1px solid #ddd; height: 450px; overflow-y: auto; font-family: Segoe UI, sans-serif;'>"
175
+ for m in logs:
176
+ log_html += f"<div style='border-bottom: 1px solid #eee; padding-bottom: 5px;'>{m}</div>"
177
+ log_html += "</div>"
178
+ yield log_html, table
179
+
180
+ submit_btn.click(update_ui, inputs=input_text, outputs=[log_output, table_output])
181
+
182
+ if __name__ == "__main__":
183
+ demo.launch(server_name="0.0.0.0", server_port=7860, auth=("admin", "1113"))