Spaces:
Sleeping
Sleeping
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() | |