File size: 4,153 Bytes
1e7992c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
160ed61
 
1e7992c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
160ed61
 
1e7992c
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import PyPDF2
from transformers import pipeline
import re

# Load high-accuracy summarization model
summarizer = pipeline("summarization", model="facebook/bart-large-cnn")

def extract_text_from_pdf(pdf_file):
    """Extract text from uploaded PDF file"""
    try:
        pdf_reader = PyPDF2.PdfReader(pdf_file)
        text = ""
        for page in pdf_reader.pages:
            text += page.extract_text()
        return text
    except Exception as e:
        return f"Error reading PDF: {str(e)}"

def extract_key_elements(text, summary):
    """Extract key elements from text and summary"""
    summary_sentences = re.split(r'[.!?]+', summary.strip())
    
    key_elements = {
        "Main Summary": summary,
        "Total Words Original": len(text.split()),
        "Total Words Summary": len(summary.split()),
        "Compression Ratio": f"{(len(summary.split()) / len(text.split()) * 100):.1f}%",
        "Key Points": "\n".join([s.strip() for s in summary_sentences if s.strip()][:5])
    }
    return key_elements

def summarize_text(text_input, max_length=150, min_length=50):
    """Summarize text with key elements"""
    if not text_input or len(text_input.strip()) < 50:
        return "Error: Please provide text with at least 50 characters", {}
    
    try:
        # Split long text into chunks
        words = text_input.split()
        chunk_size = 1024
        chunks = [' '.join(words[i:i+chunk_size]) for i in range(0, len(words), chunk_size)]
        
        summaries = []
        for chunk in chunks:
            if len(chunk.split()) > 30:
                result = summarizer(chunk, max_length=max_length, min_length=min_length, do_sample=False)
                summaries.append(result[0]['summary_text'])
        
        final_summary = " ".join(summaries)
        key_elements = extract_key_elements(text_input, final_summary)
        
        return final_summary, key_elements
    except Exception as e:
        return f"Error: {str(e)}", {}

# Gradio Interface
with gr.Blocks(theme=gr.themes.Soft()) as demo:
    gr.Markdown("# 📄 PDF & Text Summarizer")
    gr.Markdown("Upload PDF or paste text to generate summaries with key elements using BART model.")
    
    with gr.Tabs():
        # Text Tab
        with gr.Tab("Text Summarizer"):
            with gr.Row():
                text_input = gr.Textbox(label="Enter Text", placeholder="Paste text here...", lines=8)
            
            with gr.Row():
                max_len = gr.Slider(50, 300, value=150, step=10, label="Max Length")
                min_len = gr.Slider(20, 100, value=50, step=10, label="Min Length")
            
            summarize_btn = gr.Button("🚀 Summarize", variant="primary")
            summary_output = gr.Textbox(label="Summary", lines=6)
            key_elements_output = gr.JSON(label="Key Elements")
            
            summarize_btn.click(
                fn=summarize_text,
                inputs=[text_input, max_len, min_len],
                outputs=[summary_output, key_elements_output]
            )
        
        # PDF Tab
        with gr.Tab("PDF Summarizer"):
            pdf_input = gr.File(label="Upload PDF", file_count="single", file_types=[".pdf"])
            
            with gr.Row():
                pdf_max_len = gr.Slider(50, 300, value=150, step=10, label="Max Length")
                pdf_min_len = gr.Slider(20, 100, value=50, step=10, label="Min Length")
            
            pdf_summarize_btn = gr.Button("📤 Process PDF", variant="primary")
            pdf_summary_output = gr.Textbox(label="Summary", lines=6)
            pdf_key_elements_output = gr.JSON(label="Key Elements")
            
            pdf_summarize_btn.click(
                fn=lambda pdf, max_l, min_l: summarize_text(extract_text_from_pdf(pdf), max_l, min_l),
                inputs=[pdf_input, pdf_max_len, pdf_min_len],
                outputs=[pdf_summary_output, pdf_key_elements_output]
            )
    
    gr.Markdown("---")
    gr.Markdown("✨ Features: PDF & Text support | BART-large-cnn model | Key element extraction")

if __name__ == "__main__":
    demo.launch()