apak commited on
Commit
d6669f0
·
verified ·
1 Parent(s): a12a7ee

Update ner_logic.py

Browse files
Files changed (1) hide show
  1. ner_logic.py +58 -11
ner_logic.py CHANGED
@@ -1,23 +1,57 @@
1
  import torch
2
  import json
3
  import re
4
- from transformers import AutoTokenizer, AutoModelForCausalLM
 
5
  from labels_config import CUSTOM_LABELS
6
  from prompts import SYSTEM_COT_PROMPT
7
  import spaces
8
 
9
- # Global modeller (Örnek olarak Qwen kullanılmıştır)
10
- tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-1.5B-Instruct")
11
- llm_model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-1.5B-Instruct", torch_dtype="auto", device_map="auto")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
 
13
  @spaces.GPU
14
  def refine_labels_batch(misc_items, full_sentence):
15
- if not misc_items: return []
 
 
16
 
 
17
  label_rules = ""
18
  for k, v in CUSTOM_LABELS.items():
19
  label_rules += f"### {k}\nTANIM: {v['tanim']}\nANAHTARLAR: {', '.join(v['anahtar_kelimeler'])}\n\n"
20
 
 
21
  targets_text = "".join([f"- VARLIK: {item['word']} | WIKI: {item['wiki']}\n" for item in misc_items])
22
 
23
  final_prompt = SYSTEM_COT_PROMPT.format(
@@ -31,23 +65,36 @@ def refine_labels_batch(misc_items, full_sentence):
31
  model_inputs = tokenizer([text], return_tensors="pt").to(llm_model.device)
32
 
33
  try:
34
- generated_ids = llm_model.generate(model_inputs.input_ids, max_new_tokens=1500, do_sample=False)
 
 
 
 
35
  output = tokenizer.batch_decode(generated_ids[:, model_inputs.input_ids.shape[1]:], skip_special_tokens=True)[0]
36
 
 
37
  json_match = re.search(r'\[\s*\{.*\}\s*\]', output, re.DOTALL)
 
38
  if json_match:
39
  raw_json = json_match.group(0).strip()
40
- if raw_json.count('{') > raw_json.count('}'): raw_json += "}]"
 
 
 
41
 
42
  results = json.loads(raw_json)
43
- # app.py uyumu için anahtar kontrolü
 
44
  for r in results:
45
  if 'karar' not in r: r['karar'] = "MISC"
46
- if 'reasoning' not in r: r['reasoning'] = "Analiz adımları oluşturulamadı."
 
 
47
  return results
48
  else:
49
- print(f"Format Hatası: {output}")
50
  return []
 
51
  except Exception as e:
52
- print(f"Hata: {str(e)}")
53
  return []
 
1
  import torch
2
  import json
3
  import re
4
+ import wikipedia
5
+ from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM
6
  from labels_config import CUSTOM_LABELS
7
  from prompts import SYSTEM_COT_PROMPT
8
  import spaces
9
 
10
+ # Dil ayarını Türkçe yapalım
11
+ wikipedia.set_lang("tr")
12
+
13
+ # 1. NER Modeli (Standart etiketler için)
14
+ ner_pipe = pipeline(
15
+ "ner",
16
+ model="xlm-roberta-large-finetuned-conll03-english",
17
+ aggregation_strategy="simple",
18
+ device=0 if torch.cuda.is_available() else -1
19
+ )
20
+
21
+ # 2. LLM Modeli ve Tokenizer (Muhakeme için)
22
+ model_name = "Qwen/Qwen2.5-1.5B-Instruct"
23
+ tokenizer = AutoTokenizer.from_pretrained(model_name)
24
+ llm_model = AutoModelForCausalLM.from_pretrained(
25
+ model_name,
26
+ dtype="auto",
27
+ device_map="auto"
28
+ )
29
+
30
+ def get_wiki_summary(query):
31
+ """Wikipedia'dan varlık hakkında kısa özet getirir."""
32
+ try:
33
+ # En yakın başlığı bul
34
+ search_results = wikipedia.search(query)
35
+ if not search_results:
36
+ return None
37
+ # İlk sonucun özetini al
38
+ summary = wikipedia.summary(search_results[0], sentences=2, auto_suggest=False)
39
+ return summary
40
+ except:
41
+ return None
42
 
43
  @spaces.GPU
44
  def refine_labels_batch(misc_items, full_sentence):
45
+ """MISC varlıkları LLM ile yeniden analiz eder."""
46
+ if not misc_items:
47
+ return []
48
 
49
+ # Label kurallarını metne dönüştür
50
  label_rules = ""
51
  for k, v in CUSTOM_LABELS.items():
52
  label_rules += f"### {k}\nTANIM: {v['tanim']}\nANAHTARLAR: {', '.join(v['anahtar_kelimeler'])}\n\n"
53
 
54
+ # Analiz edilecek varlıkları metne dönüştür
55
  targets_text = "".join([f"- VARLIK: {item['word']} | WIKI: {item['wiki']}\n" for item in misc_items])
56
 
57
  final_prompt = SYSTEM_COT_PROMPT.format(
 
65
  model_inputs = tokenizer([text], return_tensors="pt").to(llm_model.device)
66
 
67
  try:
68
+ generated_ids = llm_model.generate(
69
+ model_inputs.input_ids,
70
+ max_new_tokens=1500,
71
+ do_sample=False
72
+ )
73
  output = tokenizer.batch_decode(generated_ids[:, model_inputs.input_ids.shape[1]:], skip_special_tokens=True)[0]
74
 
75
+ # JSON bloğunu ayıkla
76
  json_match = re.search(r'\[\s*\{.*\}\s*\]', output, re.DOTALL)
77
+
78
  if json_match:
79
  raw_json = json_match.group(0).strip()
80
+
81
+ # Basit JSON tamamlama
82
+ if raw_json.count('{') > raw_json.count('}'):
83
+ raw_json += "}]"
84
 
85
  results = json.loads(raw_json)
86
+
87
+ # app.py'de KeyError almamak için anahtar kontrolü
88
  for r in results:
89
  if 'karar' not in r: r['karar'] = "MISC"
90
+ if 'reasoning' not in r: r['reasoning'] = "Analiz süreci tamamlanamadı."
91
+ if 'varlik' not in r: r['varlik'] = "Bilinmeyen"
92
+
93
  return results
94
  else:
95
+ print(f"LLM Yanlış Format Döndürdü: {output}")
96
  return []
97
+
98
  except Exception as e:
99
+ print(f"Süreç Hatası: {str(e)}")
100
  return []