chatpdf / app.py
yunuseduran's picture
Update app.py
794c529 verified
raw
history blame
6.21 kB
import gradio as gr
import google.generativeai as genai
import os
import PyPDF2
import markdown
from docx import Document
from bs4 import BeautifulSoup
import tempfile
from datetime import datetime
# API anahtarını ayarla
def setup_api_key():
google_api_key = os.getenv("GOOGLE_API_KEY")
if not google_api_key:
return False
genai.configure(api_key=google_api_key)
return True
# PDF'den metin çıkarma
def extract_text_from_pdf(pdf_path):
try:
text = ""
with open(pdf_path, 'rb') as file:
pdf_reader = PyPDF2.PdfReader(file)
for page_num in range(len(pdf_reader.pages)):
text += pdf_reader.pages[page_num].extract_text() + "\n"
return text
except Exception as e:
return f"PDF okuma hatası: {str(e)}"
# AI modelini kullanarak analiz yap
def analyze_pdf_content(text, questions):
try:
# Gemini modeli yapılandırma
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,
)
# İlk önce belgeyi özetle
prompt = f"""
Aşağıdaki belge metnini analiz edip özetler misin?
Belge:
{text[:15000]} # Çok uzun metinlerde kesme yapabilirsiniz
Kısa bir özet ver (1-2 paragraf):
"""
response = model.generate_content(prompt)
summary = response.text
# Sonra soruları yanıtla
results = [summary]
for question in questions:
if not question.strip():
continue
prompt = f"""
Aşağıdaki belge metnine dayanarak soruyu cevapla:
Belge:
{text[:15000]} # Çok uzun metinlerde kesme yapabilirsiniz
Soru: {question}
Cevap:
"""
response = model.generate_content(prompt)
results.append((question, response.text))
return summary, results
except Exception as e:
return f"Analiz hatası: {str(e)}", []
# Markdown'ı HTML'e dönüştürme
def to_html(text):
return markdown.markdown(text)
# Word belgesi oluşturma
def create_word_document(summary, results):
doc = Document()
# Başlık ekle
doc.add_heading('PDF Belge Analiz Raporu', 0)
# Tarih ekle
doc.add_paragraph(f'Oluşturulma Tarihi: {datetime.now().strftime("%d.%m.%Y %H:%M")}')
# Özet bölümü
doc.add_heading('Belge Özeti', 1)
doc.add_paragraph(summary)
# Soru ve cevaplar
doc.add_heading('Soru ve Cevaplar', 1)
for i, (question, answer) in enumerate(results, 1):
doc.add_heading(f'Soru {i}: {question}', 2)
doc.add_paragraph(answer)
return doc
# Ana işleme fonksiyonu
def process_pdf(pdf_file, user_questions):
if not pdf_file:
return "Lütfen bir PDF dosyası yükleyin.", None
# API anahtarını kontrol et
if not setup_api_key():
return "GOOGLE_API_KEY çevre değişkeni ayarlanmamış. Lütfen API anahtarınızı ekleyin.", None
try:
# PDF'den metin çıkar
text = extract_text_from_pdf(pdf_file)
if text.startswith("PDF okuma hatası"):
return text, None
# Soruları ayır
questions = [q.strip() for q in user_questions.split('\n') if q.strip()]
# Metni analiz et
summary, results = analyze_pdf_content(text, questions)
if isinstance(summary, str) and summary.startswith("Analiz hatası"):
return summary, None
# HTML raporu oluştur
html_output = f"""
<div style="font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px;">
<h1>PDF Belge Analiz Raporu</h1>
<p><em>Oluşturulma tarihi: {datetime.now().strftime('%d.%m.%Y %H:%M')}</em></p>
<h2>Belge Özeti</h2>
<div>{to_html(summary)}</div>
<h2>Soru ve Cevaplar</h2>
"""
for i, (question, answer) in enumerate(results[1:], 1): # İlk sonuç zaten özet
html_output += f"""
<div style="margin-bottom: 20px; padding: 10px; border-left: 3px solid #ccc;">
<h3>Soru {i}: {question}</h3>
<div>{to_html(answer)}</div>
</div>
"""
html_output += "</div>"
# Word belgesi oluştur
doc = create_word_document(summary, results[1:]) # İlk sonuç zaten özet
# Geçici dosya oluştur
temp_dir = tempfile.gettempdir()
doc_path = os.path.join(temp_dir, f"PDF_Rapor_{datetime.now().strftime('%Y%m%d_%H%M%S')}.docx")
doc.save(doc_path)
return html_output, doc_path
except Exception as e:
error_message = f"<div style='color: red; font-weight: bold;'>İşlem sırasında bir hata oluştu: {str(e)}</div>"
return error_message, None
# Varsayılan sorular
default_questions = """Belgenin ana konusu nedir?
Belgenin yazarları kimlerdir?
Belgedeki önemli bulgular nelerdir?
Kaç sayfa bulunmaktadır?
Hangi tarihte yayınlanmıştır?"""
# Gradio arayüzü oluştur - basit Interface kullanarak
demo = gr.Interface(
fn=process_pdf,
inputs=[
gr.File(label="PDF Dosyası Yükleyin", file_types=[".pdf"]),
gr.Textbox(label="Sorularınız (Her satıra bir soru yazın)", value=default_questions, lines=10)
],
outputs=[
gr.HTML(label="Rapor Sonucu"),
gr.File(label="Word Belgesi")
],
title="PDF Belgelerinden Soru-Cevap Raporu Oluşturma Aracı",
description="PDF belgelerinizi yükleyin ve istediğiniz soruları sorun. AI destekli sistem belgenizi analiz edip yanıtları içeren bir rapor hazırlayacaktır.",
allow_flagging="never"
)
demo.launch()