Sarpyy commited on
Commit
c9014f4
·
verified ·
1 Parent(s): a3343be

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +30 -37
app.py CHANGED
@@ -16,18 +16,36 @@ try:
16
  tok = AutoTokenizer.from_pretrained(HF_MODEL_ID, use_fast=True)
17
  mdl = AutoModelForSeq2SeqLM.from_pretrained(HF_MODEL_ID).to(DEVICE).eval()
18
  print(f"Model yükleme başarılı: {HF_MODEL_ID} ({DEVICE} üzerinde)")
19
-
20
  except Exception as e:
21
  print(f"Model veya Tokenizer yüklenirken kritik hata oluştu: {e}")
22
  exit(1)
23
 
24
  # =========================================================================
25
- # 2. Inference ve Akıllı Filtreleme
26
  # =========================================================================
27
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  @torch.inference_mode()
29
  def lemmatize_rows(multiline_text: str):
30
- """Cümleyi modele verir (karakter bozulmaz), sayıları özel regex ile yakalar."""
31
  rows = []
32
  sentences = [s.strip() for s in multiline_text.splitlines() if s.strip()]
33
 
@@ -35,39 +53,15 @@ def lemmatize_rows(multiline_text: str):
35
  return pd.DataFrame(columns=["Full_Sentence", "Word", "Lemma"])
36
 
37
  for sent in sentences:
38
- # 1. Bütün cümleyi modele ver (Türkçe karakterlerin kusursuz çıkması için)
39
- inputs = tok(sent, return_tensors="pt", truncation=True, max_length=512).to(DEVICE)
40
- outputs = mdl.generate(**inputs, max_length=512)
41
- lemmatized_sent = tok.decode(outputs[0], skip_special_tokens=True)
42
-
43
- orig_words = sent.split()
44
- lemma_words = lemmatized_sent.split()
45
-
46
- max_len = max(len(orig_words), len(lemma_words))
47
-
48
- for i in range(max_len):
49
- w = orig_words[i] if i < len(orig_words) else ""
50
- l_model = lemma_words[i] if i < len(lemma_words) else ""
51
-
52
- clean_w = w.strip(".,!?();:\"")
53
-
54
- # 2. Sayı filtresi (Regex)
55
- # Rakamla başlayıp kesme işareti veya harfle devam edenleri yakalar
56
- num_match = re.match(r"^(\d+(?:[.,]\d+)?)(?:['’.]?[a-zA-ZğüşıöçĞÜŞİÖÇ]*)$", clean_w)
57
-
58
- if num_match:
59
- l = num_match.group(1) # Eğer sayıysa modeli ezip sadece sayıyı yazıyoruz
60
- else:
61
- l = l_model # Sayı değilse, Türkçe karakteri bozulmamış model çıktısını kullan
62
-
63
  rows.append({"Full_Sentence": sent, "Word": w, "Lemma": l})
64
 
65
  return pd.DataFrame(rows)
66
 
67
  def add_sentence_separators(df: pd.DataFrame, char: str = "-", repeat: int = 10) -> pd.DataFrame:
68
- if df.empty:
69
- return df
70
-
71
  rows, prev = [], None
72
  for _, r in df.iterrows():
73
  if prev is not None and r["Full_Sentence"] != prev:
@@ -82,15 +76,14 @@ def run_and_save(text):
82
  df_view = add_sentence_separators(df, char="-", repeat=10)
83
 
84
  out_path = "lemma_output.csv"
85
- # >>> GÜNCELLENDİ: Excel'de Türkçe karakter bozulmaması için utf-8-sig kullanıldı
86
  df.to_csv(out_path, index=False, encoding="utf-8-sig")
87
 
88
  return df_view, out_path
89
 
90
  examples = [
91
- "Öğrenciler 2'şerli gruplar halinde 15.30'da içeri alındılar.",
92
  "Yolcular, zorlu yollarda yolculuk yaparken yoldan çıkmamaya özen gösterirler.",
93
- "Bana hikayenin sonunu anlattılar."
94
  ]
95
 
96
  # =========================================================================
@@ -120,13 +113,13 @@ tbody tr:nth-child(2n) td { background: #122434 !important; }
120
 
121
  with gr.Blocks(title="TR Lemmatizer", theme=theme, css=custom_css, fill_height=True) as demo:
122
  gr.Markdown("# 🇹🇷 Türkçe Lemmatization (Kök Bulma)")
123
- gr.Markdown(f"Model: `{HF_MODEL_ID.split('/')[-1]}`. İşlem cümle bazlı yapılır, sayılar (15'te vb.) akıllı filtreyle temizlenir.")
124
 
125
  with gr.Row():
126
  with gr.Column(scale=3):
127
  inp = gr.Textbox(
128
  lines=6,
129
- placeholder="Örn:\n15'te öğrenciler içeri alındılar.\nGözlükçüler dükkanlarını açtılar.",
130
  show_label=False,
131
  elem_id="input_text"
132
  )
@@ -141,7 +134,7 @@ with gr.Blocks(title="TR Lemmatizer", theme=theme, css=custom_css, fill_height=T
141
  elem_id="results_table"
142
  )
143
 
144
- out_file = gr.File(label="Çıktı CSV (lemma_output.csv)")
145
 
146
  gr.Examples(examples=[[e] for e in examples], inputs=inp)
147
 
 
16
  tok = AutoTokenizer.from_pretrained(HF_MODEL_ID, use_fast=True)
17
  mdl = AutoModelForSeq2SeqLM.from_pretrained(HF_MODEL_ID).to(DEVICE).eval()
18
  print(f"Model yükleme başarılı: {HF_MODEL_ID} ({DEVICE} üzerinde)")
 
19
  except Exception as e:
20
  print(f"Model veya Tokenizer yüklenirken kritik hata oluştu: {e}")
21
  exit(1)
22
 
23
  # =========================================================================
24
+ # 2. Arka Plan İşlemleri (Kelime Kelime İşlem & Excel Düzeltmesi)
25
  # =========================================================================
26
 
27
+ def get_lemma_for_word(word: str) -> str:
28
+ """Tek kelimeyi temizler, sayıysa sayıyı bırakır, değilse modele yollar."""
29
+ # Kelimenin başındaki ve sonundaki noktalama işaretlerini temizle
30
+ clean_word = word.strip(".,!?();:\"'’")
31
+
32
+ if not clean_word:
33
+ return word
34
+
35
+ # Sayı kontrolü (Örn: 15.30'da -> 15.30)
36
+ num_match = re.match(r"^(\d+(?:[.,]\d+)?)(?:['’.]?[a-zA-ZğüşıöçĞÜŞİÖÇ]*)$", clean_word)
37
+ if num_match:
38
+ return num_match.group(1)
39
+
40
+ # Modeli tekil kelime için çalıştır (Modelin doğasına en uygun yöntem)
41
+ inputs = tok(clean_word, return_tensors="pt", truncation=True, max_length=128).to(DEVICE)
42
+ outputs = mdl.generate(**inputs, max_length=128)
43
+ lemma = tok.decode(outputs[0], skip_special_tokens=True).strip()
44
+
45
+ return lemma if lemma else clean_word
46
+
47
  @torch.inference_mode()
48
  def lemmatize_rows(multiline_text: str):
 
49
  rows = []
50
  sentences = [s.strip() for s in multiline_text.splitlines() if s.strip()]
51
 
 
53
  return pd.DataFrame(columns=["Full_Sentence", "Word", "Lemma"])
54
 
55
  for sent in sentences:
56
+ words = sent.split()
57
+ for w in words:
58
+ l = get_lemma_for_word(w)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
59
  rows.append({"Full_Sentence": sent, "Word": w, "Lemma": l})
60
 
61
  return pd.DataFrame(rows)
62
 
63
  def add_sentence_separators(df: pd.DataFrame, char: str = "-", repeat: int = 10) -> pd.DataFrame:
64
+ if df.empty: return df
 
 
65
  rows, prev = [], None
66
  for _, r in df.iterrows():
67
  if prev is not None and r["Full_Sentence"] != prev:
 
76
  df_view = add_sentence_separators(df, char="-", repeat=10)
77
 
78
  out_path = "lemma_output.csv"
79
+ # EXCEL TÜRKÇE KARAKTER DÜZELTMESİ (utf-8-sig)
80
  df.to_csv(out_path, index=False, encoding="utf-8-sig")
81
 
82
  return df_view, out_path
83
 
84
  examples = [
 
85
  "Yolcular, zorlu yollarda yolculuk yaparken yoldan çıkmamaya özen gösterirler.",
86
+ "Öğrenciler 2'şerli gruplar halinde 15.30'da içeri alındılar."
87
  ]
88
 
89
  # =========================================================================
 
113
 
114
  with gr.Blocks(title="TR Lemmatizer", theme=theme, css=custom_css, fill_height=True) as demo:
115
  gr.Markdown("# 🇹🇷 Türkçe Lemmatization (Kök Bulma)")
116
+ gr.Markdown(f"Model: `{HF_MODEL_ID.split('/')[-1]}`. İşlem modelin doğası gereği kelime kelime yapılır.")
117
 
118
  with gr.Row():
119
  with gr.Column(scale=3):
120
  inp = gr.Textbox(
121
  lines=6,
122
+ placeholder="Örn:\nYolcular yollarda yürüdü.",
123
  show_label=False,
124
  elem_id="input_text"
125
  )
 
134
  elem_id="results_table"
135
  )
136
 
137
+ out_file = gr.File(label="Çıktı CSV")
138
 
139
  gr.Examples(examples=[[e] for e in examples], inputs=inp)
140