Spaces:
Sleeping
Sleeping
File size: 6,303 Bytes
c67f698 8e7476d bbac61c 91fabb3 8e7476d 0b4b460 039d840 8e7476d 0b4b460 c67f698 8e7476d 0b4b460 8e7476d bbac61c 8e7476d bbac61c 8e7476d bbac61c 0b4b460 8e7476d 92c440e 8e7476d 92c440e e27aa08 bbac61c 8e7476d 856e6ad 8e7476d 0b4b460 8e7476d 0b4b460 8e7476d 0b4b460 8e7476d 0b4b460 8e7476d 0b4b460 8e7476d c67f698 bbac61c 8e7476d 92c440e bbac61c 8e7476d bbac61c 92c440e 8e7476d 92c440e bbac61c 8e7476d a7dff53 8e7476d bbac61c 0b4b460 bbac61c 92c440e 0b4b460 0380d25 8e7476d 0b4b460 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
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()
|