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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +30 -38
app.py CHANGED
@@ -9,14 +9,10 @@ from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
9
  # 1. Sabitler ve Model Yükleme
10
  # =========================================================================
11
 
12
- # Hugging Face Hub'daki Lemmatization modelinizin ID'si
13
  HF_MODEL_ID = "LiProject/BERT-Turkish-Lemmatization-V2"
14
-
15
- # GPU/CPU kontrolü
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,34 +22,12 @@ except Exception as e:
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,17 +35,36 @@ def lemmatize_rows(multiline_text: str):
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)
72
 
73
  def add_sentence_separators(df: pd.DataFrame, char: str = "-", repeat: int = 10) -> pd.DataFrame:
74
- """Görünürlük için cümleler arasına ayraç satırları ekler."""
75
  if df.empty:
76
  return df
77
 
@@ -85,18 +78,18 @@ def add_sentence_separators(df: pd.DataFrame, char: str = "-", repeat: int = 10)
85
  return pd.DataFrame(rows)
86
 
87
  def run_and_save(text):
88
- """Ana çalıştırma fonksiyonu, tabloyu ve indirilebilir CSV'yi hazırlar."""
89
  df = lemmatize_rows(text)
90
  df_view = add_sentence_separators(df, char="-", repeat=10)
91
 
92
  out_path = "lemma_output.csv"
93
- df.to_csv(out_path, index=False)
 
94
 
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
 
@@ -106,7 +99,6 @@ examples = [
106
 
107
  theme = gr.themes.Soft(primary_hue="slate", neutral_hue="slate")
108
  custom_css = """
109
- /* Sayfa ve temel renkler */
110
  .gradio-container { background: #000000 !important; color: #FFE8DB !important; font-family: Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, "Helvetica Neue", Arial, sans-serif; }
111
  .prose h1, .prose h2, .prose h3, .prose p, label { color: #FFE8DB !important; }
112
  .gr-box, .gr-panel, .border, .container { background: #0b0b0b !important; border: 1.5px solid #739EC9 !important; border-radius: 14px !important; }
@@ -128,7 +120,7 @@ tbody tr:nth-child(2n) td { background: #122434 !important; }
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):
 
9
  # 1. Sabitler ve Model Yükleme
10
  # =========================================================================
11
 
 
12
  HF_MODEL_ID = "LiProject/BERT-Turkish-Lemmatization-V2"
 
 
13
  DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
14
 
15
  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)")
 
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
  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
 
 
78
  return pd.DataFrame(rows)
79
 
80
  def run_and_save(text):
 
81
  df = lemmatize_rows(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
 
 
99
 
100
  theme = gr.themes.Soft(primary_hue="slate", neutral_hue="slate")
101
  custom_css = """
 
102
  .gradio-container { background: #000000 !important; color: #FFE8DB !important; font-family: Inter, ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, "Helvetica Neue", Arial, sans-serif; }
103
  .prose h1, .prose h2, .prose h3, .prose p, label { color: #FFE8DB !important; }
104
  .gr-box, .gr-panel, .border, .container { background: #0b0b0b !important; border: 1.5px solid #739EC9 !important; border-radius: 14px !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):