Mert Şengil
Add filtering to show only aspect terms present in original text
ae19be7
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()