Zenkapremiuim / app.py
Zenkad's picture
Update app.py
4e40ba5 verified
raw
history blame
3.38 kB
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()