Spaces:
Sleeping
Sleeping
import gradio as gr | |
import google.generativeai as genai | |
import os | |
import PyPDF2 | |
from docx import Document | |
import markdown | |
from datetime import datetime | |
import tempfile | |
# Gemini API anahtarını ortam değişkeninden al | |
genai.configure(api_key=os.environ["GOOGLE_API_KEY"]) | |
# PDF metni çıkar | |
def extract_text_from_pdf(pdf_file): | |
text = "" | |
try: | |
pdf_reader = PyPDF2.PdfReader(pdf_file) | |
for page in pdf_reader.pages: | |
text += page.extract_text() or "" | |
return text | |
except Exception as e: | |
return f"Hata: PDF okunamadı. {str(e)}" | |
# Gemini ile analiz et | |
def analyze(text, questions): | |
generation_config = { | |
"temperature": 0.2, | |
"top_p": 0.95, | |
"top_k": 64, | |
"max_output_tokens": 8192, | |
} | |
model = genai.GenerativeModel( | |
model_name="gemini-1.5-flash", | |
generation_config=generation_config | |
) | |
# Özet çıkar | |
summary_prompt = f"Aşağıdaki metni özetle:\n\n{text[:15000]}\n\nÖzet:" | |
summary = model.generate_content(summary_prompt).text | |
# Soruları cevapla | |
qna = [] | |
for question in questions: | |
if question.strip() == "": | |
continue | |
prompt = f"Belge:\n{text[:15000]}\n\nSoru: {question}\nCevap:" | |
answer = model.generate_content(prompt).text | |
qna.append((question, answer)) | |
return summary, qna | |
# Word belgesi oluştur | |
def create_doc(summary, qna): | |
doc = Document() | |
doc.add_heading("PDF Raporu", 0) | |
doc.add_paragraph(f"Oluşturulma Tarihi: {datetime.now().strftime('%d.%m.%Y %H:%M')}") | |
doc.add_heading("Özet", level=1) | |
doc.add_paragraph(summary) | |
doc.add_heading("Soru-Cevap", level=1) | |
for i, (question, answer) in enumerate(qna, 1): | |
doc.add_heading(f"Soru {i}: {question}", level=2) | |
doc.add_paragraph(answer) | |
temp_dir = tempfile.gettempdir() | |
file_path = os.path.join(temp_dir, f"rapor_{datetime.now().strftime('%Y%m%d%H%M%S')}.docx") | |
doc.save(file_path) | |
return file_path | |
# Gradio fonksiyonu | |
def process(pdf_file, questions_text): | |
text = extract_text_from_pdf(pdf_file) | |
if text.startswith("Hata"): | |
return text, None | |
questions = questions_text.strip().split("\n") | |
summary, qna = analyze(text, questions) | |
html_output = f""" | |
<h2>Özet</h2><p>{markdown.markdown(summary)}</p> | |
<h2>Soru ve Cevaplar</h2> | |
""" | |
for i, (q, a) in enumerate(qna, 1): | |
html_output += f"<b>Soru {i}:</b> {q}<br><b>Cevap:</b> {a}<br><br>" | |
doc_path = create_doc(summary, qna) | |
return html_output, doc_path | |
default_questions = """Belgenin ana konusu nedir? | |
Belgedeki önemli bulgular nelerdir? | |
Yazarlar kimlerdir? | |
Belge hangi tarihte yayınlanmıştır?""" | |
# Gradio Arayüzü | |
demo = gr.Interface( | |
fn=process, | |
inputs=[ | |
gr.File(label="PDF Yükle", file_types=[".pdf"]), | |
gr.Textbox(label="Sorular (her satıra bir soru)", value=default_questions, lines=6) | |
], | |
outputs=[ | |
gr.HTML(label="Cevaplar"), | |
gr.File(label="Word Raporu") | |
], | |
title="📄 PDF'ten Soru-Cevap ve Word Raporu", | |
description="Gemini API kullanarak PDF içeriğinden sorulara cevap verir ve rapor hazırlar.", | |
allow_flagging="never" | |
) | |
if __name__ == "__main__": | |
demo.launch(share=True) | |