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("""

🇹🇷 Türkçe Aspect Term Extraction

T5 tabanlı model ile Türkçe metinlerden aspect terimleri çıkarın

Model: Sengil/t5-turkish-aspect-term-extractor

""") 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("

📋 Örnek Metinler:

") 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()