hbulduk's picture
Update app.py
8e7476d verified
import gradio as gr
import matplotlib.pyplot as plt
import requests
from bs4 import BeautifulSoup
import re
import random
import json
import time
from transformers import pipeline, T5Tokenizer
from deep_translator import GoogleTranslator
import wikipedia
# Wikipedia'yı Türkçe olarak ayarlıyoruz.
wikipedia.set_lang("tr")
# ---------------------------
# Model ve Araçların Hazırlanması
# ---------------------------
# Özetleme modeli: hafif ve hızlı distilbart modeli
summarizer = pipeline("summarization", model="sshleifer/distilbart-cnn-12-6")
# Soru üretimi modeli: T5 tabanlı model (otomatik soru üretimi için)
tokenizer = T5Tokenizer.from_pretrained("valhalla/t5-base-e2e-qg", use_fast=False)
qg_pipeline = pipeline("text2text-generation", model="valhalla/t5-base-e2e-qg", tokenizer=tokenizer)
# ---------------------------
# URL'den Metin Çekme ve Özet Oluşturma
# ---------------------------
def extract_text_from_url(url):
"""Verilen URL’den HTML içeriğini çekip, <p> etiketlerindeki metni çıkarır."""
try:
response = requests.get(url, timeout=10)
response.raise_for_status()
soup = BeautifulSoup(response.content, "html.parser")
paragraphs = soup.find_all("p")
text = "\n".join([p.get_text() for p in paragraphs])
return text[:2000] # Maksimum 2000 karakterle sınırla
except Exception as e:
print(f"URL'den metin çekme hatası: {e}")
return ""
def generate_long_summary(text):
"""
Metnin ilk 1500 karakteri üzerinden 200-300 token arası uzun bir özet oluşturur.
Oluşturulan özet "Giriş", "Gelişim" ve "Sonuç" bölümleri ile yapılandırılır.
"""
if not text.strip():
return "Özet oluşturulamadı."
limited_text = text[:1500]
try:
summary_output = summarizer(limited_text, max_length=300, min_length=200, do_sample=False)
summary = summary_output[0]['summary_text']
except Exception as e:
print(f"Özetleme hatası: {e}")
return "Özet oluşturulurken hata oluştu."
sentences = re.split(r'(?<=[.!?])\s+', summary)
if len(sentences) >= 3:
intro = sentences[0]
body = " ".join(sentences[1:-1])
conclusion = sentences[-1]
structured = f"## Giriş\n{intro}\n\n## Gelişim\n{body}\n\n## Sonuç\n{conclusion}"
else:
structured = summary
try:
translated = GoogleTranslator(source='auto', target='tr').translate(structured)
return translated
except Exception:
return structured
def process_url(url):
text = extract_text_from_url(url)
summary = generate_long_summary(text)
# Burada soru üretimi yapmak isterseniz aşağıdaki fonksiyon kullanılabilir,
# fakat şu an için sadece özetleme isteniyor.
return summary
# ---------------------------
# Global Veri Saklama
# ---------------------------
student_data = {}
# ---------------------------
# Gradio Arayüz Fonksiyonları
# ---------------------------
# Tab 1: Özet Oluşturma Sekmesi (sadece özetleme)
def load_url(url, name):
summary = process_url(url)
student_data["name"] = name
student_data["summary"] = summary
return summary
# Tab 2: Değerlendirme (soru üretimi ve quiz) – Bu örnekte hazır soru üretimi yok.
def generate_chart(wrong_indices):
num_questions = len(student_data.get("questions", []))
results = [1 if (i+1 in wrong_indices) else 0 for i in range(num_questions)]
fig, ax = plt.subplots()
ax.bar(range(1, num_questions+1), results)
ax.set_xlabel("Soru Numarası")
ax.set_ylabel("Yanlış (1) / Doğru (0)")
ax.set_title("Değerlendirme Sonuçları")
return fig
def submit_answers(*answers):
# Bu bölüm örnek olması açısından dummy değerlendirme yapıyor.
questions = student_data.get("questions", [])
score = 0
wrong_indices = []
for i, user_answer in enumerate(answers):
if i < len(questions):
try:
idx = questions[i]["options"].index(user_answer)
letter = ["A", "B", "C", "D"][idx]
except Exception:
letter = ""
if letter == questions[i]["correct"].strip().upper():
score += 1
else:
wrong_indices.append(i+1)
if score >= 9:
medal = "Gold"
elif score >= 7:
medal = "Silver"
else:
medal = "Bronze"
student_data["score"] = score
student_data["medal"] = medal
student_data["wrong"] = wrong_indices
return f"Skorunuz: {score}/10", f"Madalya: {medal}", generate_chart(wrong_indices)
# ---------------------------
# Gradio Arayüzü: İki Sekmeli Uygulama
# ---------------------------
with gr.Blocks() as demo:
gr.Markdown("# İnternet İçeriğinden Detaylı Özet Oluşturma")
with gr.Tab("Özet"):
with gr.Column():
name_input = gr.Textbox(label="Öğrenci İsmi", placeholder="İsminizi giriniz")
url_input = gr.Textbox(label="İnternet URL'si", placeholder="Örneğin: https://example.com")
process_btn = gr.Button("Özeti Oluştur")
summary_display = gr.Markdown(visible=False, label="Özet")
# İkinci sekme, quiz ve değerlendirme için örnek; fakat bu örnekte özetleme kısmına odaklanıyoruz.
with gr.Tab("Değerlendirme (Örnek)"):
with gr.Column():
gr.Markdown("### Quiz Bölümü (Örnek) - Şu an otomatik soru üretimi yapılmıyor.")
# Quiz için dummy soru bileşenleri ekleyebiliriz.
q1 = gr.Radio(choices=["A", "B", "C", "D"], label="Soru 1", visible=False)
q2 = gr.Radio(choices=["A", "B", "C", "D"], label="Soru 2", visible=False)
submit_btn = gr.Button("Cevapları Gönder", visible=False)
score_display = gr.Markdown(label="Sonuç", visible=False)
medal_display = gr.Markdown(label="Madalya", visible=False)
chart_display = gr.Plot(label="Yanlış Sorular Grafiği", visible=False)
process_btn.click(
fn=load_url,
inputs=[url_input, name_input],
outputs=summary_display,
show_progress=True
)
# Değerlendirme kısmı örnek olarak kapalı bırakıldı.
demo.launch()