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