Spaces:
Sleeping
Sleeping
import gradio as gr | |
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM | |
import torch | |
import re | |
from collections import Counter | |
# LOAD MODEL | |
MODEL_ID = "Sengil/t5-turkish-aspect-term-extractor" | |
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu") | |
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID) | |
model = AutoModelForSeq2SeqLM.from_pretrained(MODEL_ID).to(DEVICE) | |
model.eval() | |
TURKISH_STOPWORDS = { | |
"ve", "çok", "ama", "bir", "bu", "daha", "gibi", "ile", "için", | |
"de", "da", "ki", "o", "şu", "bu", "sen", "biz", "siz", "onlar" | |
} | |
def is_valid_aspect(word): | |
word = word.strip().lower() | |
return ( | |
len(word) > 1 and | |
word not in TURKISH_STOPWORDS and | |
word.isalpha() | |
) | |
def is_aspect_in_text(aspect_term, original_text): | |
"""Aspect term'in orijinal metinde geçip geçmediğini kontrol eder""" | |
# Case-insensitive karşılaştırma | |
text_lower = original_text.lower() | |
aspect_lower = aspect_term.lower() | |
# Word boundary ile tam kelime araması | |
pattern = r'\b' + re.escape(aspect_lower) + r'\b' | |
return bool(re.search(pattern, text_lower, re.IGNORECASE)) | |
def extract_and_rank_aspects(text, max_tokens=64, beams=5): | |
inputs = tokenizer(text, return_tensors="pt", truncation=True, padding=True).to(DEVICE) | |
with torch.no_grad(): | |
outputs = model.generate( | |
input_ids=inputs["input_ids"], | |
attention_mask=inputs["attention_mask"], | |
max_new_tokens=max_tokens, | |
num_beams=beams, | |
num_return_sequences=beams, | |
early_stopping=True | |
) | |
all_predictions = [ | |
tokenizer.decode(output, skip_special_tokens=True) | |
for output in outputs | |
] | |
all_terms = [] | |
for pred in all_predictions: | |
candidates = re.split(r"[;,–—\-]|(?:\s*,\s*)", pred) | |
# Sadece orijinal metinde geçen aspect term'leri ekle | |
for candidate in candidates: | |
if is_valid_aspect(candidate) and is_aspect_in_text(candidate.strip(), text): | |
all_terms.append(candidate.strip().lower()) | |
ranked = Counter(all_terms).most_common() | |
return ranked | |
def process_text(text): | |
if not text.strip(): | |
return "Lütfen analiz edilecek bir metin girin." | |
try: | |
ranked_aspects = extract_and_rank_aspects(text) | |
if not ranked_aspects: | |
return "Metinde herhangi bir aspect term bulunamadı." | |
result = "🎯 **Bulunan Aspect Terimler:**\n\n" | |
for i, (term, score) in enumerate(ranked_aspects, 1): | |
result += f"{i}. **{term.title()}** - Skor: {score}\n" | |
return result | |
except Exception as e: | |
return f"Hata oluştu: {str(e)}" | |
# Gradio Interface | |
with gr.Blocks(title="🇹🇷 Türkçe Aspect Term Extraction", theme=gr.themes.Soft()) as demo: | |
gr.HTML(""" | |
<div style="text-align: center; margin-bottom: 20px;"> | |
<h1>🇹🇷 Türkçe Aspect Term Extraction</h1> | |
<p>T5 tabanlı model ile Türkçe metinlerden aspect terimleri çıkarın</p> | |
<p><i>Model: Sengil/t5-turkish-aspect-term-extractor</i></p> | |
</div> | |
""") | |
with gr.Row(): | |
with gr.Column(): | |
text_input = gr.Textbox( | |
label="📝 Analiz edilecek metin", | |
placeholder="Örnek: Artılar: Göl manzarasıyla harika bir atmosfer, Ipoh'un her zaman sıcak olan havası nedeniyle iyi bir klima olan restoran...", | |
lines=5, | |
max_lines=10 | |
) | |
analyze_btn = gr.Button("🔍 Aspect Terimleri Çıkar", variant="primary", size="lg") | |
with gr.Column(): | |
output = gr.Markdown( | |
label="📊 Sonuçlar", | |
value="📊 Sonuçlar" | |
) | |
# Example texts | |
gr.HTML("<h3>📋 Örnek Metinler:</h3>") | |
examples = [ | |
["Artılar: Göl manzarasıyla harika bir atmosfer, Ipoh'un her zaman sıcak olan havası nedeniyle iyi bir klima olan restoran, iyi ve hızlı hizmet sunan garsonlar, temassız ödeme kabul eden e-cüzdan, ücretsiz otopark ama sıcak güneş altında açık, yemeklerin tadı güzel."], | |
["Bu otelin konumu mükemmel, personel çok yardımısever. Kahvaltı çeşitliliği iyi ancak oda temizliği yetersiz. WiFi hızı da çok yavaş."], | |
["Ürünün kalitesi harika, kargo hızlı geldi. Fiyat biraz yüksek ama memnunum. Müşteri hizmeti de gayet iyi."] | |
] | |
gr.Examples( | |
examples=examples, | |
inputs=[text_input], | |
outputs=[output], | |
fn=process_text, | |
cache_examples=False | |
) | |
analyze_btn.click( | |
fn=process_text, | |
inputs=[text_input], | |
outputs=[output] | |
) | |
if __name__ == "__main__": | |
demo.launch() |