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