andreeabodea
commited on
Commit
•
3b44ece
1
Parent(s):
536f374
Update app.py
Browse files
app.py
CHANGED
@@ -1,62 +1,82 @@
|
|
|
|
|
|
|
|
1 |
import os
|
2 |
import pdfplumber
|
3 |
import re
|
4 |
-
import gradio as gr
|
5 |
from transformers import pipeline, AutoModelForQuestionAnswering, AutoTokenizer
|
6 |
-
from
|
7 |
-
import torch
|
8 |
-
|
9 |
-
"""
|
10 |
-
Extract the text from a section of a PDF file between 'wanted_section' and 'next_section'.
|
11 |
-
Parameters:
|
12 |
-
- path (str): The file path to the PDF file.
|
13 |
-
- wanted_section (str): The section to start extracting text from.
|
14 |
-
- next_section (str): The section to stop extracting text at.
|
15 |
-
Returns:
|
16 |
-
- text (str): The extracted text from the specified section range.
|
17 |
-
"""
|
18 |
-
|
19 |
|
20 |
-
def
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
start_page = []
|
26 |
end_page = []
|
27 |
|
28 |
-
# Find the all the pages for the specified sections
|
29 |
for page in range(len(doc.pages)):
|
30 |
-
if len(doc.pages[page].search(wanted_section, return_chars=False, case=False)) > 0:
|
31 |
start_page.append(page)
|
32 |
-
if len(doc.pages[page].search(next_section, return_chars=False, case=False)) > 0:
|
33 |
end_page.append(page)
|
|
|
|
|
|
|
34 |
|
35 |
-
# Extract the text between the start and end page of the wanted section
|
36 |
text = []
|
37 |
for page_num in range(max(start_page), max(end_page)+1):
|
38 |
page = doc.pages[page_num]
|
39 |
text.append(page.extract_text())
|
40 |
text = " ".join(text)
|
41 |
-
|
42 |
-
|
|
|
43 |
|
44 |
-
|
45 |
-
def extract_between(big_string, start_string, end_string):
|
46 |
-
# Use a non-greedy match for content between start_string and end_string
|
47 |
pattern = re.escape(start_string) + '(.*?)' + re.escape(end_string)
|
48 |
-
match = re.search(pattern,
|
49 |
-
|
50 |
if match:
|
51 |
-
# Return the content without the start and end strings
|
52 |
return match.group(1)
|
53 |
else:
|
54 |
-
# Return None if the pattern is not found
|
55 |
return None
|
56 |
|
57 |
def format_section1(section1_text):
|
58 |
result_section1_dict = {}
|
59 |
-
|
60 |
result_section1_dict['TOPIC'] = extract_between(section1_text, "Sektor", "EZ-Programm")
|
61 |
result_section1_dict['PROGRAM'] = extract_between(section1_text, "Sektor", "EZ-Programm")
|
62 |
result_section1_dict['PROJECT DESCRIPTION'] = extract_between(section1_text, "EZ-Programmziel", "Datum der letzten BE")
|
@@ -65,69 +85,66 @@ def format_section1(section1_text):
|
|
65 |
result_section1_dict['PROGRESS'] = extract_between(section1_text, "Zielerreichung des Moduls", "Massnahme im Zeitplan")
|
66 |
result_section1_dict['STATUS'] = extract_between(section1_text, "Massnahme im Zeitplan", "Risikoeinschätzung")
|
67 |
result_section1_dict['RECOMMENDATIONS'] = extract_between(section1_text, "Vorschläge zur Modulanpas-", "Voraussichtliche")
|
68 |
-
|
69 |
return result_section1_dict
|
70 |
|
71 |
-
def
|
72 |
-
# Initialize the zero-shot classification pipeline
|
73 |
model_name = "deepset/gelectra-large-germanquad"
|
74 |
model = AutoModelForQuestionAnswering.from_pretrained(model_name)
|
75 |
tokenizer = AutoTokenizer.from_pretrained(model_name)
|
76 |
-
|
77 |
-
# Initialize the QA pipeline
|
78 |
qa_pipeline = pipeline("question-answering", model=model, tokenizer=tokenizer)
|
|
|
|
|
|
|
|
|
79 |
questions = [
|
80 |
"Welches ist das Titel des Moduls?",
|
81 |
"Welches ist das Sektor oder das Kernthema?",
|
82 |
"Welches ist das Land?",
|
83 |
-
"Zu welchem Program oder
|
84 |
-
#"Welche Durchführungsorganisation aus den 4 Varianten 'giz', 'kfw', 'ptb' und 'bgr' implementiert das Projekt?"
|
|
|
|
|
|
|
85 |
# "In dem Dokument was steht bei Sektor?",
|
86 |
# "In dem Dokument was steht von 'EZ-Programm' bis 'EZ-Programmziel'?",
|
87 |
# "In dem Dokument was steht bei EZ-Programmziel?",
|
88 |
# "In dem Dokument in dem Abschnitt '1. Kurzbeschreibung' was steht bei Modul?",
|
89 |
-
# "In dem Dokument was steht bei Zielerreichung des Moduls?",
|
90 |
# "In dem Dokument in dem Abschnitt '1. Kurzbeschreibung' was steht bei Maßnahme im Zeitplan?",
|
91 |
# "In dem Dokument was steht bei Vorschläge zur Modulanpassung?",
|
92 |
# "In dem Dokument in dem Abschnitt 'Anlage 1: Wirkungsmatrix des Moduls' was steht unter Laufzeit als erstes Datum?",
|
93 |
# "In dem Dokument in dem Abschnitt 'Anlage 1: Wirkungsmatrix des Moduls' was steht unter Laufzeit als zweites Datum?"
|
94 |
]
|
95 |
-
|
96 |
-
# Iterate over each question and get answers
|
97 |
answers_dict = {}
|
98 |
-
|
99 |
for question in questions:
|
100 |
result = qa_pipeline(question=question, context=text)
|
101 |
-
|
102 |
-
|
103 |
answers_dict[question] = result['answer']
|
104 |
return answers_dict
|
105 |
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
118 |
|
119 |
if __name__ == "__main__":
|
120 |
-
|
121 |
-
# Define the Gradio interface
|
122 |
-
# iface = gr.Interface(fn=process_pdf,
|
123 |
-
demo = gr.Interface(fn=process_pdf,
|
124 |
inputs=gr.File(type="binary", label="Upload PDF"),
|
125 |
outputs=gr.Textbox(label="Extracted Text"),
|
126 |
title="PDF Text Extractor",
|
127 |
description="Upload a PDF file to extract.")
|
128 |
demo.launch()
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
|
|
1 |
+
import gradio as gr
|
2 |
+
from io import BytesIO
|
3 |
+
import torch
|
4 |
import os
|
5 |
import pdfplumber
|
6 |
import re
|
|
|
7 |
from transformers import pipeline, AutoModelForQuestionAnswering, AutoTokenizer
|
8 |
+
from transformers import BertTokenizer, EncoderDecoderModel
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
9 |
|
10 |
+
def process_pdf(path):
|
11 |
+
results_dict = {}
|
12 |
+
results_dict["1. Kurzbeschreibung"] = \
|
13 |
+
read_section(path, "1. Kurzbeschreibung", "2. Einordnung des Moduls")
|
14 |
+
# results_dict["2. Einordnung des Moduls"] = \
|
15 |
+
# read_section(path, "Einordnung des Moduls",
|
16 |
+
# "Entwicklungsmaßnahmen im konkreten Interventionsbereich des Moduls")
|
17 |
+
# results_dict["2.2 Andere Entwicklungsmaßnahmen im konkreten Interventionsbereich des Moduls"] = \
|
18 |
+
# read_section(path, "Entwicklungsmaßnahmen im konkreten Interventionsbereich des Moduls",
|
19 |
+
# "3. Entwicklungen im Interventionsbereich")
|
20 |
+
results_dict["3. Entwicklungen im Interventionsbereich"] = \
|
21 |
+
read_section(path, "3. Entwicklungen im Interventionsbereich",
|
22 |
+
"4.1 Bewertungen von Zielen, Zielgruppen, Wirkungshypothesen und Indikatoren")
|
23 |
+
results_dict["4.1 Bewertungen von Zielen, Zielgruppen, Wirkungshypothesen und Indikatoren"] = \
|
24 |
+
read_section(path, "4.1 Bewertungen von Zielen, Zielgruppen, Wirkungshypothesen und Indikatoren",
|
25 |
+
"4.2")
|
26 |
+
results_dict["4.2 Umgesetzte Maßnahmen / Aktivitäten während des Berichtszeitraums"] = \
|
27 |
+
read_section(path, "4.2", "4.3")
|
28 |
+
results_dict["4.3 Umsetzung von Maßnahmen zur Sicherstellung der nachhaltigen Wirksamkeit des Vorhabens"] = \
|
29 |
+
read_section(path, "4.3",
|
30 |
+
"4.4 Laufzeit und Zeitplan")
|
31 |
+
results_dict["4.4 Laufzeit und Zeitplan"] = \
|
32 |
+
read_section(path, "4.4 Laufzeit und Zeitplan", "4.5")
|
33 |
+
results_dict["4.5 Entstandene Kosten und Kostenverschiebungen"] = \
|
34 |
+
read_section(path, "4.5", "4.6")
|
35 |
+
results_dict["4.6 Bewertung der Wirkungen und Risiken"] = \
|
36 |
+
read_section(path, "4.6", "5. Übergeordnete Empfehlungen")
|
37 |
+
results_dict["5. Übergeordnete Empfehlungen"] = \
|
38 |
+
read_section(path, "5. Übergeordnete Empfehlungen",
|
39 |
+
"5.2 Lernerfahrungen, die für die Länderstrategie und zukünftige")
|
40 |
+
results_dict["5.2 Lernerfahrungen, die für die Länderstrategie und zukünftige EZ-Programme interessant sein könnten"] = \
|
41 |
+
read_section(path, "5.2 Lernerfahrungen", "6. Testat")
|
42 |
+
# results_dict["6. Testat (TZ)"] = \
|
43 |
+
# read_section(path, "6. Testat", "Anlage 1: Wirkungsmatrix des Moduls")
|
44 |
+
return results_dict
|
45 |
+
|
46 |
+
def read_section(path, wanted_section, next_section):
|
47 |
+
|
48 |
+
doc = pdfplumber.open(path)
|
49 |
start_page = []
|
50 |
end_page = []
|
51 |
|
|
|
52 |
for page in range(len(doc.pages)):
|
53 |
+
if len(doc.pages[page].search(wanted_section, return_chars = False, case = False)) > 0:
|
54 |
start_page.append(page)
|
55 |
+
if len(doc.pages[page].search(next_section, return_chars = False, case = False)) > 0:
|
56 |
end_page.append(page)
|
57 |
+
# print(wanted_section)
|
58 |
+
# print(max(start_page))
|
59 |
+
# print(max(end_page)+1)
|
60 |
|
|
|
61 |
text = []
|
62 |
for page_num in range(max(start_page), max(end_page)+1):
|
63 |
page = doc.pages[page_num]
|
64 |
text.append(page.extract_text())
|
65 |
text = " ".join(text)
|
66 |
+
text.replace("\n", " ")
|
67 |
+
# print(wanted_section + str(extract_between(text, wanted_section, next_section)))
|
68 |
+
return wanted_section + str(extract_between(text, wanted_section, next_section))
|
69 |
|
70 |
+
def extract_between(text, start_string, end_string):
|
|
|
|
|
71 |
pattern = re.escape(start_string) + '(.*?)' + re.escape(end_string)
|
72 |
+
match = re.search(pattern, text, re.DOTALL)
|
|
|
73 |
if match:
|
|
|
74 |
return match.group(1)
|
75 |
else:
|
|
|
76 |
return None
|
77 |
|
78 |
def format_section1(section1_text):
|
79 |
result_section1_dict = {}
|
|
|
80 |
result_section1_dict['TOPIC'] = extract_between(section1_text, "Sektor", "EZ-Programm")
|
81 |
result_section1_dict['PROGRAM'] = extract_between(section1_text, "Sektor", "EZ-Programm")
|
82 |
result_section1_dict['PROJECT DESCRIPTION'] = extract_between(section1_text, "EZ-Programmziel", "Datum der letzten BE")
|
|
|
85 |
result_section1_dict['PROGRESS'] = extract_between(section1_text, "Zielerreichung des Moduls", "Massnahme im Zeitplan")
|
86 |
result_section1_dict['STATUS'] = extract_between(section1_text, "Massnahme im Zeitplan", "Risikoeinschätzung")
|
87 |
result_section1_dict['RECOMMENDATIONS'] = extract_between(section1_text, "Vorschläge zur Modulanpas-", "Voraussichtliche")
|
|
|
88 |
return result_section1_dict
|
89 |
|
90 |
+
def initialize_question_answering():
|
|
|
91 |
model_name = "deepset/gelectra-large-germanquad"
|
92 |
model = AutoModelForQuestionAnswering.from_pretrained(model_name)
|
93 |
tokenizer = AutoTokenizer.from_pretrained(model_name)
|
|
|
|
|
94 |
qa_pipeline = pipeline("question-answering", model=model, tokenizer=tokenizer)
|
95 |
+
return qa_pipeline
|
96 |
+
|
97 |
+
def answer_questions_section_1(text, language="de"):
|
98 |
+
qa_pipeline = initialize_question_answering()
|
99 |
questions = [
|
100 |
"Welches ist das Titel des Moduls?",
|
101 |
"Welches ist das Sektor oder das Kernthema?",
|
102 |
"Welches ist das Land?",
|
103 |
+
"Zu welchem Program oder Programm gehort das Projekt?",
|
104 |
+
# "Welche Durchführungsorganisation aus den 4 Varianten 'giz', 'kfw', 'ptb' und 'bgr' implementiert das Projekt?"
|
105 |
+
"Wurde das Ziel des Moduls erreicht?", # "In dem Dokument was steht bei Zielerreichung des Moduls?",
|
106 |
+
"Welche ist die Risikoeinschätzung des Moduls?",
|
107 |
+
"Ist die Maßnahme im Zeitplan?"
|
108 |
# "In dem Dokument was steht bei Sektor?",
|
109 |
# "In dem Dokument was steht von 'EZ-Programm' bis 'EZ-Programmziel'?",
|
110 |
# "In dem Dokument was steht bei EZ-Programmziel?",
|
111 |
# "In dem Dokument in dem Abschnitt '1. Kurzbeschreibung' was steht bei Modul?",
|
|
|
112 |
# "In dem Dokument in dem Abschnitt '1. Kurzbeschreibung' was steht bei Maßnahme im Zeitplan?",
|
113 |
# "In dem Dokument was steht bei Vorschläge zur Modulanpassung?",
|
114 |
# "In dem Dokument in dem Abschnitt 'Anlage 1: Wirkungsmatrix des Moduls' was steht unter Laufzeit als erstes Datum?",
|
115 |
# "In dem Dokument in dem Abschnitt 'Anlage 1: Wirkungsmatrix des Moduls' was steht unter Laufzeit als zweites Datum?"
|
116 |
]
|
|
|
|
|
117 |
answers_dict = {}
|
|
|
118 |
for question in questions:
|
119 |
result = qa_pipeline(question=question, context=text)
|
120 |
+
print(f"Question: {question}")
|
121 |
+
print(f"Answer: {result['answer']}\n")
|
122 |
answers_dict[question] = result['answer']
|
123 |
return answers_dict
|
124 |
|
125 |
+
def summarize_german_text(text):
|
126 |
+
model_name = "mrm8488/bert2bert_shared-german-finetuned-summarization"
|
127 |
+
tokenizer = BertTokenizer.from_pretrained(model_name)
|
128 |
+
model = EncoderDecoderModel.from_pretrained(model_name)
|
129 |
+
inputs = tokenizer(text, padding="max_length", truncation=True, max_length=512, return_tensors="pt")
|
130 |
+
summary_ids = model.generate(inputs['input_ids'], num_beams=4, max_length=200, early_stopping=True)
|
131 |
+
summary = tokenizer.decode(summary_ids[0], skip_special_tokens=True)
|
132 |
+
return summary
|
133 |
+
|
134 |
+
def extact_details():
|
135 |
+
sections_dict = process_pdf(path)
|
136 |
+
results = answer_questions_section_1(sections_dict["1. Kurzbeschreibung"])
|
137 |
+
results["Section 4.1 summary"] = summarize_german_text(sections_dict["4.1 Bewertungen von Zielen, Zielgruppen, Wirkungshypothesen und Indikatoren"])
|
138 |
+
results["Section 4.2 summary"] = summarize_german_text(sections_dict["4.2 Umgesetzte Maßnahmen / Aktivitäten während des Berichtszeitraums"])
|
139 |
+
results["Section 4.6 summary"] = summarize_german_text(sections_dict["4.6 Bewertung der Wirkungen und Risiken"])
|
140 |
+
results["Section 5.1 summary"] = summarize_german_text(sections_dict["5. Übergeordnete Empfehlungen"])
|
141 |
+
# for key, answer in results.items():
|
142 |
+
# print(f"{key}: {answer}")
|
143 |
|
144 |
if __name__ == "__main__":
|
145 |
+
demo = gr.Interface(fn=extact_details,
|
|
|
|
|
|
|
146 |
inputs=gr.File(type="binary", label="Upload PDF"),
|
147 |
outputs=gr.Textbox(label="Extracted Text"),
|
148 |
title="PDF Text Extractor",
|
149 |
description="Upload a PDF file to extract.")
|
150 |
demo.launch()
|
|
|
|
|
|
|
|
|
|