Mert Şengil
Add Turkish aspect term extraction app
19995b3
raw
history blame
4.27 kB
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 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)
all_terms.extend([w.strip().lower() for w in candidates if is_valid_aspect(w)])
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 burada görünecek..."
)
# 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()