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,

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