andreeabodea commited on
Commit
3b44ece
1 Parent(s): 536f374

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +84 -67
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 io import BytesIO
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 get_section(path, wanted_section, next_section):
21
- print(wanted_section)
22
-
23
- # Open the PDF file
24
- doc = pdfplumber.open(BytesIO(path))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- final_text = text.replace("\n", " ")
42
- return final_text
 
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, big_string, re.DOTALL)
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 answer_questions(text,language="de"):
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 EZ-Programm gehort das Projekt?"
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
- # print(f"Question: {question}")
102
- # print(f"Answer: {result['answer']}\n")
103
  answers_dict[question] = result['answer']
104
  return answers_dict
105
 
106
-
107
- def process_pdf(path):
108
- results_dict = {}
109
- results_dict["1. Kurzbeschreibung"] = \
110
- get_section(path, "1. Kurzbeschreibung", "2. Einordnung des Moduls")
111
- answers = answer_questions(results_dict["1. Kurzbeschreibung"])
112
- return answers
113
-
114
- def get_first_page_text(file_data):
115
- doc = pdfplumber.open(BytesIO(file_data))
116
- if len(doc.pages):
117
- return doc.pages[0].extract_text()
 
 
 
 
 
 
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()