Spaces:
Running
Running
import os | |
import gradio as gr | |
from transformers import pipeline | |
import spacy | |
import lib.read_pdf | |
# Initialize spaCy model | |
nlp = spacy.load('en_core_web_sm') | |
nlp.add_pipe('sentencizer') | |
def split_in_sentences(text): | |
doc = nlp(text) | |
return [str(sent).strip() for sent in doc.sents] | |
def make_spans(text, results): | |
results_list = [res['label'] for res in results] | |
facts_spans = list(zip(split_in_sentences(text), results_list)) | |
return facts_spans | |
# Initialize pipelines | |
summarizer = pipeline("summarization", model="human-centered-summarization/financial-summarization-pegasus") | |
fin_model = pipeline("sentiment-analysis", model='yiyanghkust/finbert-tone', tokenizer='yiyanghkust/finbert-tone') | |
def summarize_text(text): | |
resp = summarizer(text) | |
return resp[0]['summary_text'] | |
def text_to_sentiment(text): | |
sentiment = fin_model(text)[0]["label"] | |
return sentiment | |
def fin_ext(text): | |
results = fin_model(split_in_sentences(text)) | |
return make_spans(text, results) | |
def extract_and_summarize(pdf1, pdf2): | |
if not pdf1 or not pdf2: | |
return [], [] | |
pdf1_path = os.path.join(PDF_FOLDER, pdf1) | |
pdf2_path = os.path.join(PDF_FOLDER, pdf2) | |
# Extract and format paragraphs | |
paragraphs_1 = lib.read_pdf.extract_and_format_paragraphs(pdf1_path) | |
paragraphs_2 = lib.read_pdf.extract_and_format_paragraphs(pdf2_path) | |
start_keyword = "Main risks to" | |
end_keywords = ["4. Appendix", "Annex:", "4. Annex", "Detailed tables", "ACKNOWLEDGEMENTS", "STATISTICAL ANNEX", "PROSPECTS BY MEMBER STATES"] | |
start_index1, end_index1 = lib.read_pdf.find_text_range(paragraphs_1, start_keyword, end_keywords) | |
start_index2, end_index2 = lib.read_pdf.find_text_range(paragraphs_2, start_keyword, end_keywords) | |
paragraphs_1 = lib.read_pdf.extract_relevant_text(paragraphs_1, start_index1, end_index1) | |
paragraphs_2 = lib.read_pdf.extract_relevant_text(paragraphs_2, start_index2, end_index2) | |
paragraphs_1 = lib.read_pdf.split_text_into_paragraphs(paragraphs_1, 0) | |
paragraphs_2 = lib.read_pdf.split_text_into_paragraphs(paragraphs_2, 0) | |
return paragraphs_1, paragraphs_2 | |
# Gradio interface setup | |
PDF_FOLDER = "data" | |
def get_pdf_files(folder): | |
return [f for f in os.listdir(folder) if f.endswith('.pdf')] | |
stored_paragraphs_1 = [] | |
stored_paragraphs_2 = [] | |
with gr.Blocks() as demo: | |
gr.Markdown("## Financial Report Paragraph Selection and Analysis") | |
with gr.Row(): | |
# Upload PDFs | |
with gr.Column(): | |
pdf1 = gr.Dropdown(choices=get_pdf_files(PDF_FOLDER), label="Select PDF 1") | |
pdf2 = gr.Dropdown(choices=get_pdf_files(PDF_FOLDER), label="Select PDF 2") | |
with gr.Column(): | |
b1 = gr.Button("Extract and Display Paragraphs") | |
paragraph_1_dropdown = gr.Dropdown(label="Select Paragraph from PDF 1") | |
paragraph_2_dropdown = gr.Dropdown(label="Select Paragraph from PDF 2") | |
def update_paragraphs(pdf1, pdf2): | |
global stored_paragraphs_1, stored_paragraphs_2 | |
stored_paragraphs_1, stored_paragraphs_2 = extract_and_summarize(pdf1, pdf2) | |
updated_dropdown_1 = gr.Dropdown.update(choices=[f"Paragraph {i+1}: {p[:100]}..." for i, p in enumerate(stored_paragraphs_1)], label="Select Paragraph from PDF 1") | |
updated_dropdown_2 = gr.Dropdown.update(choices=[f"Paragraph {i+1}: {p[:100]}..." for i, p in enumerate(stored_paragraphs_2)], label="Select Paragraph from PDF 2") | |
return updated_dropdown_1, updated_dropdown_2 | |
b1.click(fn=update_paragraphs, inputs=[pdf1, pdf2], outputs=[paragraph_1_dropdown, paragraph_2_dropdown]) | |
with gr.Row(): | |
# Process the selected paragraph from PDF 1 | |
with gr.Column(): | |
selected_paragraph_1 = gr.Textbox(label="Selected Paragraph 1 Content") | |
summarize_btn1 = gr.Button("Summarize Text from PDF 1") | |
sentiment_btn1 = gr.Button("Classify Financial Tone from PDF 1") | |
fin_spans_1 = gr.HighlightedText(label="Financial Tone Analysis for PDF 1") | |
def process_paragraph_1(paragraph): | |
try: | |
paragraph_index = int(paragraph.split(':')[0].replace('Paragraph ', '')) - 1 | |
selected_paragraph = stored_paragraphs_1[paragraph_index] | |
summary = summarize_text(selected_paragraph) | |
sentiment = text_to_sentiment(selected_paragraph) | |
fin_spans = fin_ext(selected_paragraph) | |
return selected_paragraph, summary, sentiment, fin_spans | |
except (IndexError, ValueError): | |
return "Invalid selection", "Error", "Error", [] | |
summarize_btn1.click(fn=lambda p: process_paragraph_1(p)[1], inputs=paragraph_1_dropdown, outputs=selected_paragraph_1) | |
sentiment_btn1.click(fn=lambda p: process_paragraph_1(p)[2], inputs=paragraph_1_dropdown, outputs=selected_paragraph_1) | |
b5 = gr.Button("Analyze Financial Tone and FLS") | |
b5.click(fn=lambda p: process_paragraph_1(p)[3], inputs=paragraph_1_dropdown, outputs=fin_spans_1) | |
with gr.Row(): | |
# Process the selected paragraph from PDF 2 | |
with gr.Column(): | |
selected_paragraph_2 = gr.Textbox(label="Selected Paragraph 2 Content") | |
summarize_btn2 = gr.Button("Summarize Text from PDF 2") | |
sentiment_btn2 = gr.Button("Classify Financial Tone from PDF 2") | |
fin_spans_2 = gr.HighlightedText(label="Financial Tone Analysis for PDF 2") | |
def process_paragraph_2(paragraph): | |
try: | |
paragraph_index = int(paragraph.split(':')[0].replace('Paragraph ', '')) - 1 | |
selected_paragraph = stored_paragraphs_2[paragraph_index] | |
summary = summarize_text(selected_paragraph) | |
sentiment = text_to_sentiment(selected_paragraph) | |
fin_spans = fin_ext(selected_paragraph) | |
return selected_paragraph, summary, sentiment, fin_spans | |
except (IndexError, ValueError): | |
return "Invalid selection", "Error", "Error", [] | |
summarize_btn2.click(fn=lambda p: process_paragraph_2(p)[1], inputs=paragraph_2_dropdown, outputs=selected_paragraph_2) | |
sentiment_btn2.click(fn=lambda p: process_paragraph_2(p)[2], inputs=paragraph_2_dropdown, outputs=selected_paragraph_2) | |
b6 = gr.Button("Analyze Financial Tone and FLS") | |
b6.click(fn=lambda p: process_paragraph_2(p)[3], inputs=paragraph_2_dropdown, outputs=fin_spans_2) | |
demo.launch() | |