Spaces:
Sleeping
Sleeping
File size: 3,381 Bytes
41e7713 4e40ba5 41e7713 4e40ba5 41e7713 4e40ba5 41e7713 fec4279 41e7713 4e40ba5 41e7713 4e40ba5 41e7713 4e40ba5 41e7713 4e40ba5 41e7713 4e40ba5 41e7713 4e40ba5 41e7713 4e40ba5 41e7713 4e40ba5 41e7713 4e40ba5 41e7713 4e40ba5 41e7713 4e40ba5 41e7713 4e40ba5 41e7713 4e40ba5 41e7713 fec4279 41e7713 4e40ba5 41e7713 4e40ba5 41e7713 fec4279 41e7713 fec4279 |
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 |
import gradio as gr
import torch
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
import pdfplumber
# ---- TEK MODEL: Türkçe özet + QA için mT5 ----
MODEL_NAME = "mukayese/mt5-base-turkish-summarization"
device = "cuda" if torch.cuda.is_available() else "cpu"
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
model = AutoModelForSeq2SeqLM.from_pretrained(MODEL_NAME).to(device)
# ---- Yardımcı fonksiyonlar ----
def extract_pdf_text(pdf_file) -> str:
"""PDF dosyasından düz metin çıkar."""
if pdf_file is None:
return ""
text_pages = []
with pdfplumber.open(pdf_file.name) as pdf:
for page in pdf.pages:
page_text = page.extract_text() or ""
text_pages.append(page_text)
full_text = "\n\n".join(text_pages).strip()
return full_text
def generate_text(prompt: str, max_new_tokens: int = 256) -> str:
"""mT5 ile verilen prompt'a göre metin üret."""
if not prompt:
return "Metin boş görünüyor."
inputs = tokenizer(
prompt,
return_tensors="pt",
truncation=True,
max_length=1024,
).to(device)
with torch.no_grad():
output_ids = model.generate(
**inputs,
max_length=max_new_tokens,
num_beams=4,
early_stopping=True,
)
text = tokenizer.decode(output_ids[0], skip_special_tokens=True)
return text.strip()
def summarize_pdf(pdf_file):
text = extract_pdf_text(pdf_file)
if not text:
return "PDF'ten metin çıkarılamadı. Dosya boş veya okunamıyor olabilir."
prompt = (
"Aşağıdaki Türkçe metni kısa ve anlaşılır bir şekilde özetle.\n\n"
f"Metin:\n{text}\n\n"
"Özet:"
)
return generate_text(prompt, max_new_tokens=256)
def qa_on_pdf(pdf_file, question):
text = extract_pdf_text(pdf_file)
if not text:
return "Önce geçerli bir PDF yüklemelisin."
if not question:
return "Lütfen PDF hakkında bir soru yaz."
prompt = (
"Aşağıdaki Türkçe metne göre soruya cevap ver. Bilmediğin şeyi uydurma.\n\n"
f"Metin:\n{text}\n\n"
f"Soru: {question}\n"
"Cevap:"
)
return generate_text(prompt, max_new_tokens=256)
# ---- Gradio arayüzü ----
with gr.Blocks() as demo:
gr.Markdown(
"""
# 🧠 ZenkaMind PDF Analiz (hafif sürüm)
- PDF yükle
- Özet al
- Aynı PDF hakkında soru sor
(Şu an tek model: mT5 Türkçe özet/QA)
"""
)
with gr.Row():
pdf_input = gr.File(label="PDF dosyası yükle", file_types=[".pdf"])
question = gr.Textbox(
label="PDF hakkında soru sor (opsiyonel)",
placeholder="Örnek: Bu PDF'in ana fikri ne?",
)
with gr.Row():
btn_summary = gr.Button("📄 PDF'yi Özetle")
btn_qa = gr.Button("❓ Soruyu Cevapla")
summary_output = gr.Textbox(
label="Özet",
lines=10,
)
answer_output = gr.Textbox(
label="Cevap",
lines=10,
)
btn_summary.click(
fn=summarize_pdf,
inputs=[pdf_input],
outputs=[summary_output],
)
btn_qa.click(
fn=qa_on_pdf,
inputs=[pdf_input, question],
outputs=[answer_output],
)
if __name__ == "__main__":
demo.launch() |