hbulduk commited on
Commit
8e7476d
·
verified ·
1 Parent(s): 92c440e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +115 -31
app.py CHANGED
@@ -1,78 +1,160 @@
1
  import gradio as gr
 
2
  import requests
3
  from bs4 import BeautifulSoup
4
  import re
5
- from transformers import pipeline
 
 
 
6
  from deep_translator import GoogleTranslator
7
  import wikipedia
8
 
9
- # Wikipedia dilini Türkçe olarak ayarlıyoruz.
10
  wikipedia.set_lang("tr")
11
 
12
- # Özetleme modeli: hafif distilbart modeli kullanıyoruz.
 
 
 
 
13
  summarizer = pipeline("summarization", model="sshleifer/distilbart-cnn-12-6")
 
 
 
 
 
 
 
14
 
15
  def extract_text_from_url(url):
16
- """
17
- Verilen URL’den HTML içeriğini çekip, <p> etiketlerindeki metinleri çıkarır.
18
- Metin 2000 karakterle sınırlandırılır.
19
- """
20
  try:
21
  response = requests.get(url, timeout=10)
22
  response.raise_for_status()
23
  soup = BeautifulSoup(response.content, "html.parser")
24
  paragraphs = soup.find_all("p")
25
  text = "\n".join([p.get_text() for p in paragraphs])
26
- return text[:2000]
27
  except Exception as e:
28
  print(f"URL'den metin çekme hatası: {e}")
29
  return ""
30
 
31
- def generate_quick_summary(text):
32
  """
33
- Çıkarılan metnin ilk 500 karakteri ile özetleme modeli çağrılır.
34
- Oluşturulan özet, "Giriş" ve "Sonuç" bölümleriyle yapılandırılır.
35
- Eğer özetin dili Türkçe değilse, deep-translator ile Türkçeye çevrilir.
36
  """
37
  if not text.strip():
38
  return "Özet oluşturulamadı."
39
- limited_text = text[:500]
 
40
  try:
41
- summary_output = summarizer(limited_text, max_length=80, min_length=30, do_sample=False)
42
  summary = summary_output[0]['summary_text']
43
  except Exception as e:
44
  print(f"Özetleme hatası: {e}")
45
  return "Özet oluşturulurken hata oluştu."
 
46
  sentences = re.split(r'(?<=[.!?])\s+', summary)
47
- if len(sentences) >= 2:
48
  intro = sentences[0]
 
49
  conclusion = sentences[-1]
50
- structured = f"## Giriş\n{intro}\n\n## Sonuç\n{conclusion}"
51
- try:
52
- translated = GoogleTranslator(source='auto', target='tr').translate(structured)
53
- return translated
54
- except Exception:
55
- return structured
56
  else:
57
- return summary
 
 
 
 
 
58
 
59
  def process_url(url):
60
  text = extract_text_from_url(url)
61
- summary = generate_quick_summary(text)
 
 
62
  return summary
63
 
 
 
 
 
 
 
 
 
 
 
64
  def load_url(url, name):
65
- # "name" parametresi isteğe bağlı; burada özet oluşturulurken kullanılmıyor.
66
  summary = process_url(url)
 
 
67
  return summary
68
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
  with gr.Blocks() as demo:
70
- gr.Markdown("# İnternet İçeriğinden Özet Oluşturucu")
71
- with gr.Column():
72
- name_input = gr.Textbox(label="Öğrenci İsmi", placeholder="İsminizi giriniz")
73
- url_input = gr.Textbox(label="İnternet URL'si", placeholder="Örneğin: https://example.com")
74
- process_btn = gr.Button("Özeti Oluştur")
75
- summary_display = gr.Markdown(visible=True, label="Özet")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
 
77
  process_btn.click(
78
  fn=load_url,
@@ -80,5 +162,7 @@ with gr.Blocks() as demo:
80
  outputs=summary_display,
81
  show_progress=True
82
  )
83
-
 
 
84
  demo.launch()
 
1
  import gradio as gr
2
+ import matplotlib.pyplot as plt
3
  import requests
4
  from bs4 import BeautifulSoup
5
  import re
6
+ import random
7
+ import json
8
+ import time
9
+ from transformers import pipeline, T5Tokenizer
10
  from deep_translator import GoogleTranslator
11
  import wikipedia
12
 
13
+ # Wikipedia'yı Türkçe olarak ayarlıyoruz.
14
  wikipedia.set_lang("tr")
15
 
16
+ # ---------------------------
17
+ # Model ve Araçların Hazırlanması
18
+ # ---------------------------
19
+
20
+ # Özetleme modeli: hafif ve hızlı distilbart modeli
21
  summarizer = pipeline("summarization", model="sshleifer/distilbart-cnn-12-6")
22
+ # Soru üretimi modeli: T5 tabanlı model (otomatik soru üretimi için)
23
+ tokenizer = T5Tokenizer.from_pretrained("valhalla/t5-base-e2e-qg", use_fast=False)
24
+ qg_pipeline = pipeline("text2text-generation", model="valhalla/t5-base-e2e-qg", tokenizer=tokenizer)
25
+
26
+ # ---------------------------
27
+ # URL'den Metin Çekme ve Özet Oluşturma
28
+ # ---------------------------
29
 
30
  def extract_text_from_url(url):
31
+ """Verilen URL’den HTML içeriğini çekip, <p> etiketlerindeki metni çıkarır."""
 
 
 
32
  try:
33
  response = requests.get(url, timeout=10)
34
  response.raise_for_status()
35
  soup = BeautifulSoup(response.content, "html.parser")
36
  paragraphs = soup.find_all("p")
37
  text = "\n".join([p.get_text() for p in paragraphs])
38
+ return text[:2000] # Maksimum 2000 karakterle sınırla
39
  except Exception as e:
40
  print(f"URL'den metin çekme hatası: {e}")
41
  return ""
42
 
43
+ def generate_long_summary(text):
44
  """
45
+ Metnin ilk 1500 karakteri üzerinden 200-300 token arası uzun bir özet oluşturur.
46
+ Oluşturulan özet "Giriş", "Gelişim" ve "Sonuç" bölümleri ile yapılandırılır.
 
47
  """
48
  if not text.strip():
49
  return "Özet oluşturulamadı."
50
+
51
+ limited_text = text[:1500]
52
  try:
53
+ summary_output = summarizer(limited_text, max_length=300, min_length=200, do_sample=False)
54
  summary = summary_output[0]['summary_text']
55
  except Exception as e:
56
  print(f"Özetleme hatası: {e}")
57
  return "Özet oluşturulurken hata oluştu."
58
+
59
  sentences = re.split(r'(?<=[.!?])\s+', summary)
60
+ if len(sentences) >= 3:
61
  intro = sentences[0]
62
+ body = " ".join(sentences[1:-1])
63
  conclusion = sentences[-1]
64
+ structured = f"## Giriş\n{intro}\n\n## Gelişim\n{body}\n\n## Sonuç\n{conclusion}"
 
 
 
 
 
65
  else:
66
+ structured = summary
67
+ try:
68
+ translated = GoogleTranslator(source='auto', target='tr').translate(structured)
69
+ return translated
70
+ except Exception:
71
+ return structured
72
 
73
  def process_url(url):
74
  text = extract_text_from_url(url)
75
+ summary = generate_long_summary(text)
76
+ # Burada soru üretimi yapmak isterseniz aşağıdaki fonksiyon kullanılabilir,
77
+ # fakat şu an için sadece özetleme isteniyor.
78
  return summary
79
 
80
+ # ---------------------------
81
+ # Global Veri Saklama
82
+ # ---------------------------
83
+ student_data = {}
84
+
85
+ # ---------------------------
86
+ # Gradio Arayüz Fonksiyonları
87
+ # ---------------------------
88
+
89
+ # Tab 1: Özet Oluşturma Sekmesi (sadece özetleme)
90
  def load_url(url, name):
 
91
  summary = process_url(url)
92
+ student_data["name"] = name
93
+ student_data["summary"] = summary
94
  return summary
95
 
96
+ # Tab 2: Değerlendirme (soru üretimi ve quiz) – Bu örnekte hazır soru üretimi yok.
97
+ def generate_chart(wrong_indices):
98
+ num_questions = len(student_data.get("questions", []))
99
+ results = [1 if (i+1 in wrong_indices) else 0 for i in range(num_questions)]
100
+ fig, ax = plt.subplots()
101
+ ax.bar(range(1, num_questions+1), results)
102
+ ax.set_xlabel("Soru Numarası")
103
+ ax.set_ylabel("Yanlış (1) / Doğru (0)")
104
+ ax.set_title("Değerlendirme Sonuçları")
105
+ return fig
106
+
107
+ def submit_answers(*answers):
108
+ # Bu bölüm örnek olması açısından dummy değerlendirme yapıyor.
109
+ questions = student_data.get("questions", [])
110
+ score = 0
111
+ wrong_indices = []
112
+ for i, user_answer in enumerate(answers):
113
+ if i < len(questions):
114
+ try:
115
+ idx = questions[i]["options"].index(user_answer)
116
+ letter = ["A", "B", "C", "D"][idx]
117
+ except Exception:
118
+ letter = ""
119
+ if letter == questions[i]["correct"].strip().upper():
120
+ score += 1
121
+ else:
122
+ wrong_indices.append(i+1)
123
+ if score >= 9:
124
+ medal = "Gold"
125
+ elif score >= 7:
126
+ medal = "Silver"
127
+ else:
128
+ medal = "Bronze"
129
+ student_data["score"] = score
130
+ student_data["medal"] = medal
131
+ student_data["wrong"] = wrong_indices
132
+ return f"Skorunuz: {score}/10", f"Madalya: {medal}", generate_chart(wrong_indices)
133
+
134
+ # ---------------------------
135
+ # Gradio Arayüzü: İki Sekmeli Uygulama
136
+ # ---------------------------
137
  with gr.Blocks() as demo:
138
+ gr.Markdown("# İnternet İçeriğinden Detaylı Özet Oluşturma")
139
+
140
+ with gr.Tab("Özet"):
141
+ with gr.Column():
142
+ name_input = gr.Textbox(label="Öğrenci İsmi", placeholder="İsminizi giriniz")
143
+ url_input = gr.Textbox(label="İnternet URL'si", placeholder="Örneğin: https://example.com")
144
+ process_btn = gr.Button("Özeti Oluştur")
145
+ summary_display = gr.Markdown(visible=False, label="Özet")
146
+
147
+ # İkinci sekme, quiz ve değerlendirme için örnek; fakat bu örnekte özetleme kısmına odaklanıyoruz.
148
+ with gr.Tab("Değerlendirme (Örnek)"):
149
+ with gr.Column():
150
+ gr.Markdown("### Quiz Bölümü (Örnek) - Şu an otomatik soru üretimi yapılmıyor.")
151
+ # Quiz için dummy soru bileşenleri ekleyebiliriz.
152
+ q1 = gr.Radio(choices=["A", "B", "C", "D"], label="Soru 1", visible=False)
153
+ q2 = gr.Radio(choices=["A", "B", "C", "D"], label="Soru 2", visible=False)
154
+ submit_btn = gr.Button("Cevapları Gönder", visible=False)
155
+ score_display = gr.Markdown(label="Sonuç", visible=False)
156
+ medal_display = gr.Markdown(label="Madalya", visible=False)
157
+ chart_display = gr.Plot(label="Yanlış Sorular Grafiği", visible=False)
158
 
159
  process_btn.click(
160
  fn=load_url,
 
162
  outputs=summary_display,
163
  show_progress=True
164
  )
165
+
166
+ # Değerlendirme kısmı örnek olarak kapalı bırakıldı.
167
+
168
  demo.launch()