Sarpyy commited on
Commit
6e06ac3
·
verified ·
1 Parent(s): 98ba9dc

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +34 -26
app.py CHANGED
@@ -1,4 +1,5 @@
1
  import os
 
2
  import torch
3
  import pandas as pd
4
  import gradio as gr
@@ -15,7 +16,7 @@ HF_MODEL_ID = "LiProject/BERT-Turkish-Lemmatization-V2"
15
  DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
16
 
17
  try:
18
- # Model ve Tokenizer'ı Seq2Seq (Encoder-Decoder) mantığına uygun yükle
19
  tok = AutoTokenizer.from_pretrained(HF_MODEL_ID, use_fast=True)
20
  mdl = AutoModelForSeq2SeqLM.from_pretrained(HF_MODEL_ID).to(DEVICE).eval()
21
  print(f"Model yükleme başarılı: {HF_MODEL_ID} ({DEVICE} üzerinde)")
@@ -25,12 +26,34 @@ except Exception as e:
25
  exit(1)
26
 
27
  # =========================================================================
28
- # 2. Inference ve Çıktı Formatı
29
  # =========================================================================
30
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  @torch.inference_mode()
32
  def lemmatize_rows(multiline_text: str):
33
- """Metni işler ve kelime-kök eşleşmesini içeren DataFrame döndürür."""
34
  rows = []
35
  sentences = [s.strip() for s in multiline_text.splitlines() if s.strip()]
36
 
@@ -38,26 +61,11 @@ def lemmatize_rows(multiline_text: str):
38
  return pd.DataFrame(columns=["Full_Sentence", "Word", "Lemma"])
39
 
40
  for sent in sentences:
41
- # 1. Orijinal cümleyi modele ver
42
- inputs = tok(sent, return_tensors="pt", truncation=True, max_length=512).to(DEVICE)
43
-
44
- # 2. Köklerden oluşan yeni cümleyi üret (generate)
45
- outputs = mdl.generate(**inputs, max_length=512)
46
-
47
- # 3. Üretilen tokenları metne çevir
48
- lemmatized_sent = tok.decode(outputs[0], skip_special_tokens=True)
49
-
50
- # Kelimeleri boşluklardan bölerek eşleştir
51
- orig_words = sent.split()
52
- lemma_words = lemmatized_sent.split()
53
-
54
- # Orijinal cümledeki kelime sayısıyla, üretilen kök sayısını eşleştiriyoruz
55
- # (Eğer model fazla veya eksik kelime üretirse tablo bozulmasın diye max uzunluk alınıyor)
56
- max_len = max(len(orig_words), len(lemma_words))
57
 
58
- for i in range(max_len):
59
- w = orig_words[i] if i < len(orig_words) else ""
60
- l = lemma_words[i] if i < len(lemma_words) else ""
61
  rows.append({"Full_Sentence": sent, "Word": w, "Lemma": l})
62
 
63
  return pd.DataFrame(rows)
@@ -87,8 +95,8 @@ def run_and_save(text):
87
  return df_view, out_path
88
 
89
  examples = [
90
- "Kedilerimizden biri çok hızlıca koştu",
91
- "Gözlükçüler dükkanlarını erkenden açtılar.",
92
  "Bana hikayenin sonunu anlattılar."
93
  ]
94
 
@@ -120,13 +128,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]}`. Metni satır satır girin. Çıktı: **Full_Sentence, Word, Lemma**.")
124
 
125
  with gr.Row():
126
  with gr.Column(scale=3):
127
  inp = gr.Textbox(
128
  lines=6,
129
- placeholder="Örn:\nKedilerimizden biri hızlıca koştu.\nGözlükçüler dükkanlarını açtılar.",
130
  show_label=False,
131
  elem_id="input_text"
132
  )
 
1
  import os
2
+ import re
3
  import torch
4
  import pandas as pd
5
  import gradio as gr
 
16
  DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
17
 
18
  try:
19
+ # Model ve Tokenizer'ı Seq2Seq mantığına uygun yükle
20
  tok = AutoTokenizer.from_pretrained(HF_MODEL_ID, use_fast=True)
21
  mdl = AutoModelForSeq2SeqLM.from_pretrained(HF_MODEL_ID).to(DEVICE).eval()
22
  print(f"Model yükleme başarılı: {HF_MODEL_ID} ({DEVICE} üzerinde)")
 
26
  exit(1)
27
 
28
  # =========================================================================
29
+ # 2. Arka Plan İşlemleri (Kelime Kelime Analiz & Sayı Filtresi)
30
  # =========================================================================
31
 
32
+ def get_lemma_for_word(word: str) -> str:
33
+ """Tek bir kelimeyi alır, sayıysa temizler, değilse modelden geçirip kökünü bulur."""
34
+ # Noktalamaları kelimenin başından ve sonundan temizle ki model daha iyi anlasın
35
+ clean_word = word.strip(".,!?();:\"")
36
+
37
+ if not clean_word:
38
+ return word # Sadece noktalama işaretinden oluşuyorsa kendisini döndür
39
+
40
+ # Sayı ve ek kontrolü (Örn: 2'şer -> 2, 10.5'ten -> 10.5, 1990'da -> 1990)
41
+ # Rakamla başlayıp kesme işareti veya harfle devam edenleri yakalar
42
+ num_match = re.match(r"^(\d+(?:[.,]\d+)?)(?:['’.]?[a-zA-ZğüşıöçĞÜŞİÖÇ]*)$", clean_word)
43
+ if num_match:
44
+ return num_match.group(1) # Eki at, sadece sayıyı döndür
45
+
46
+ # Kelimeyi modele gönder (sözcük sözcük işlem)
47
+ inputs = tok(clean_word, return_tensors="pt", truncation=True, max_length=128).to(DEVICE)
48
+ outputs = mdl.generate(**inputs, max_length=128)
49
+ lemma = tok.decode(outputs[0], skip_special_tokens=True).strip()
50
+
51
+ # Model bazen boş dönebilir, o durumda orijinal temiz kelimeyi ver
52
+ return lemma if lemma else clean_word
53
+
54
  @torch.inference_mode()
55
  def lemmatize_rows(multiline_text: str):
56
+ """Metni cümlelere, cümleleri kelimelere böler. İlletişimi kelime kelime yapar."""
57
  rows = []
58
  sentences = [s.strip() for s in multiline_text.splitlines() if s.strip()]
59
 
 
61
  return pd.DataFrame(columns=["Full_Sentence", "Word", "Lemma"])
62
 
63
  for sent in sentences:
64
+ words = sent.split() # Cümleyi kelimelere böl
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
 
66
+ for w in words:
67
+ # Her bir kelime için özel fonksiyonumuzu çağırıyoruz
68
+ l = get_lemma_for_word(w)
69
  rows.append({"Full_Sentence": sent, "Word": w, "Lemma": l})
70
 
71
  return pd.DataFrame(rows)
 
95
  return df_view, out_path
96
 
97
  examples = [
98
+ "Öğrenciler 2'şerli gruplar halinde 15.30'da içeri alındılar.",
99
+ "Kedilerimizden biri çok hızlıca koştu.",
100
  "Bana hikayenin sonunu anlattılar."
101
  ]
102
 
 
128
 
129
  with gr.Blocks(title="TR Lemmatizer", theme=theme, css=custom_css, fill_height=True) as demo:
130
  gr.Markdown("# 🇹🇷 Türkçe Lemmatization (Kök Bulma)")
131
+ gr.Markdown(f"Model: `{HF_MODEL_ID.split('/')[-1]}`. Metni satır satır girin. İşlem yüksek hassasiyet için kelime kelime yapılır.")
132
 
133
  with gr.Row():
134
  with gr.Column(scale=3):
135
  inp = gr.Textbox(
136
  lines=6,
137
+ placeholder="Örn:\n15'te öğrenciler içeri alındılar.\nGözlükçüler dükkanlarını açtılar.",
138
  show_label=False,
139
  elem_id="input_text"
140
  )