Spaces:
Runtime error
Runtime error
Download app.py from DeryFerd/AI-PDF-Summarizer-FlanT5: direct link, hf CLI and curl.
- Browser
- Download file 3.25 kB
-
https://huggingface.co/spaces/DeryFerd/AI-PDF-Summarizer-FlanT5/resolve/main/app.py
- Command line
-
hf download hf://spaces/DeryFerd/AI-PDF-Summarizer-FlanT5/app.py
-
curl -L -o app.py https://huggingface.co/spaces/DeryFerd/AI-PDF-Summarizer-FlanT5/resolve/main/app.py
3.25 kB
| # app.py | |
| # ========================================================= | |
| # PDF Summarizer dengan Flan-T5 & Gradio | |
| # Rangkuman Final dari Semua Sesi Debugging | |
| # ========================================================= | |
| import gradio as gr | |
| import fitz # Library PyMuPDF | |
| from transformers import T5Tokenizer, T5ForConditionalGeneration | |
| import torch | |
| # --- Langkah 1: Muat Model dan Tokenizer (Hanya sekali saat aplikasi start) --- | |
| # Kita muat langsung dari Hugging Face Hub, ini cara standar untuk deployment. | |
| print("Memulai aplikasi, memuat model...") | |
| model_name = "google/flan-t5-base" | |
| tokenizer = T5Tokenizer.from_pretrained(model_name) | |
| model = T5ForConditionalGeneration.from_pretrained(model_name) | |
| print("Model berhasil dimuat!") | |
| # --- Langkah 2: Definisikan Fungsi Inti untuk Meringkas --- | |
| def summarize_pdf(pdf_file_object): | |
| """ | |
| Fungsi utama yang menerima file dari Gradio, membaca isinya, | |
| dan menghasilkan ringkasan menggunakan model Flan-T5. | |
| """ | |
| if pdf_file_object is None: | |
| return "Mohon unggah file PDF terlebih dahulu." | |
| try: | |
| # Membaca file PDF dari path temporer yang diberikan Gradio | |
| # Ini adalah perbaikan untuk error "'NamedString' object has no attribute 'read'" | |
| doc = fitz.open(pdf_file_object.name) | |
| # Ekstrak semua teks dari setiap halaman | |
| full_text = "".join(page.get_text() for page in doc) | |
| doc.close() | |
| # Prompt Engineering "Level 3" untuk meminta output bullet points | |
| prompt = f"""Summarize the following text into key bullet points. | |
| Text: "{full_text}" | |
| Summary: | |
| - """ | |
| # Proses teks dengan model | |
| inputs = tokenizer(prompt, return_tensors="pt", max_length=1024, truncation=True) | |
| summary_ids = model.generate( | |
| inputs.input_ids, | |
| max_length=600, # Batas atas panjang ringkasan | |
| min_length=100, # Batas bawah panjang ringkasan | |
| length_penalty=1.0, # Netral, tidak menghukum/mendorong kalimat panjang | |
| num_beams=4, # Teknik pencarian untuk hasil yang lebih baik | |
| early_stopping=True | |
| ) | |
| summary = tokenizer.decode(summary_ids[0], skip_special_tokens=True) | |
| # Tambahkan kembali bullet point di awal jika hilang saat decoding | |
| return "- " + summary | |
| except Exception as e: | |
| # Menampilkan pesan error jika terjadi masalah | |
| return f"Terjadi kesalahan: {str(e)}" | |
| # --- Langkah 3: Bangun Antarmuka Pengguna dengan Gradio --- | |
| with gr.Blocks(theme=gr.themes.Soft()) as demo: | |
| gr.Markdown( | |
| """ | |
| # 🤖 AI PDF Summarizer (Flan-T5 Edition) | |
| Upload your PDF here and get your summary! | |
| """ | |
| ) | |
| with gr.Row(): | |
| pdf_input = gr.File(label="Upload your document (PDF)", file_types=[".pdf"]) | |
| summary_output = gr.Textbox(label="Summarize", lines=20, interactive=False) | |
| summarize_button = gr.Button("Summary", variant="primary") | |
| summarize_button.click( | |
| fn=summarize_pdf, | |
| inputs=pdf_input, | |
| outputs=summary_output | |
| ) | |
| # --- Langkah 4: Jalankan Aplikasi (Hanya jika file ini dieksekusi langsung) --- | |
| if __name__ == "__main__": | |
| demo.launch() | |