la04 commited on
Commit
93850b9
·
verified ·
1 Parent(s): 7b74120

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +30 -30
app.py CHANGED
@@ -1,15 +1,15 @@
1
  from transformers import pipeline, AutoModelForQuestionAnswering, AutoTokenizer
2
  import gradio as gr
3
  from PyPDF2 import PdfReader
 
4
 
5
- # Modell und Tokenizer für Fragebeantwortung laden
6
- model_name = "deepset/roberta-base-squad2" # Anpassung bei Bedarf nach Fine-Tuning
7
  model = AutoModelForQuestionAnswering.from_pretrained(model_name)
8
  tokenizer = AutoTokenizer.from_pretrained(model_name)
9
-
10
  qa_pipeline = pipeline("question-answering", model=model, tokenizer=tokenizer)
11
 
12
- # Funktion zum Extrahieren von Text aus der PDF
13
  def extract_text_from_pdf(pdf_path):
14
  reader = PdfReader(pdf_path)
15
  text = ""
@@ -17,12 +17,15 @@ def extract_text_from_pdf(pdf_path):
17
  text += page.extract_text()
18
  return text
19
 
20
- # Funktion für Kontextvorverarbeitung: Aufteilung in Abschnitte basierend auf Absätzen
 
 
 
 
21
  def split_text_into_paragraphs(text, max_length=500):
22
- paragraphs = text.split("\n") # Text nach Zeilenumbrüchen aufteilen
23
  refined_paragraphs = []
24
  temp = ""
25
-
26
  for para in paragraphs:
27
  if len(temp) + len(para) <= max_length:
28
  temp += " " + para
@@ -31,54 +34,51 @@ def split_text_into_paragraphs(text, max_length=500):
31
  temp = para
32
  if temp:
33
  refined_paragraphs.append(temp.strip())
34
-
35
  return refined_paragraphs
36
 
37
- # Funktion für Postprocessing der Antwort
38
- def refine_answer(answer):
39
- if not answer or len(answer.split()) < 3: # Minimalbedingung für eine gültige Antwort
 
 
 
 
 
 
40
  return "Die Antwort konnte nicht eindeutig aus dem Dokument ermittelt werden."
41
- # Weitere Regeln für Umformulierung oder Präzisierung könnten hier folgen
 
 
42
  return answer.capitalize().strip()
43
 
44
- # Funktion für die Fragebeantwortung
45
  def chatbot_response(pdf_path, question):
46
- # PDF-Text extrahieren
47
  context = extract_text_from_pdf(pdf_path)
48
-
49
- # Text vorverarbeiten: Aufteilen in Absätze
50
  context_parts = split_text_into_paragraphs(context)
 
51
 
52
- # Relevante Abschnitte finden (Keyword-Suche)
53
- relevant_parts = [part for part in context_parts if any(word.lower() in part.lower() for word in question.split())]
54
- if not relevant_parts:
55
- relevant_parts = context_parts # Fallback auf gesamten Text, wenn keine Übereinstimmungen gefunden werden
56
-
57
- # Frage beantworten: Kombiniere Antworten aus relevanten Abschnitten
58
  answers = []
59
  for part in relevant_parts:
60
  try:
61
  result = qa_pipeline(question=question, context=part)
62
  answers.append(result['answer'])
63
- except Exception as e:
64
- answers.append("") # Fehlerhafte Abschnitte überspringen
65
-
66
- # Beste Antwort auswählen und Postprocessing anwenden
67
- final_answer = refine_answer(" ".join(answers).strip())
68
  return final_answer
69
 
70
- # Gradio-Interface erstellen
71
  pdf_input = gr.File(label="PDF-Datei hochladen", type="filepath")
72
  question_input = gr.Textbox(label="Frage eingeben", placeholder="Stelle eine Frage zu dem PDF-Dokument")
73
  response_output = gr.Textbox(label="Antwort")
74
 
75
- # Gradio-Interface
76
  interface = gr.Interface(
77
  fn=chatbot_response,
78
  inputs=[pdf_input, question_input],
79
  outputs=response_output,
80
  title="Verbesserte PDF-Fragebeantwortung",
81
- description="Lade eine PDF-Datei hoch und stelle Fragen zu ihrem Inhalt. Antworten basieren nur auf den PDF-Inhalten und werden optimiert ausgegeben."
82
  )
83
 
84
  if __name__ == "__main__":
 
1
  from transformers import pipeline, AutoModelForQuestionAnswering, AutoTokenizer
2
  import gradio as gr
3
  from PyPDF2 import PdfReader
4
+ import re
5
 
6
+ # Modell und Tokenizer laden
7
+ model_name = "deepset/roberta-base-squad2"
8
  model = AutoModelForQuestionAnswering.from_pretrained(model_name)
9
  tokenizer = AutoTokenizer.from_pretrained(model_name)
 
10
  qa_pipeline = pipeline("question-answering", model=model, tokenizer=tokenizer)
11
 
12
+ # Funktion zum Extrahieren und Bereinigen von Text aus PDF
13
  def extract_text_from_pdf(pdf_path):
14
  reader = PdfReader(pdf_path)
15
  text = ""
 
17
  text += page.extract_text()
18
  return text
19
 
20
+ def clean_text(text):
21
+ text = re.sub(r'\s+', ' ', text)
22
+ text = re.sub(r'[^\w\s.,-]', '', text)
23
+ return text.strip()
24
+
25
  def split_text_into_paragraphs(text, max_length=500):
26
+ paragraphs = text.split("\n")
27
  refined_paragraphs = []
28
  temp = ""
 
29
  for para in paragraphs:
30
  if len(temp) + len(para) <= max_length:
31
  temp += " " + para
 
34
  temp = para
35
  if temp:
36
  refined_paragraphs.append(temp.strip())
 
37
  return refined_paragraphs
38
 
39
+ def find_relevant_parts(question, context_parts):
40
+ keywords = question.split()
41
+ relevant_parts = [
42
+ part for part in context_parts if any(keyword.lower() in part.lower() for keyword in keywords)
43
+ ]
44
+ return relevant_parts if relevant_parts else context_parts
45
+
46
+ def validate_and_refine_answer(answer):
47
+ if not answer or len(answer.split()) < 5:
48
  return "Die Antwort konnte nicht eindeutig aus dem Dokument ermittelt werden."
49
+ invalid_phrases = ["bluetooth", "hand", "ke", "eingelegt"]
50
+ for phrase in invalid_phrases:
51
+ answer = answer.replace(phrase, "")
52
  return answer.capitalize().strip()
53
 
 
54
  def chatbot_response(pdf_path, question):
 
55
  context = extract_text_from_pdf(pdf_path)
56
+ context = clean_text(context)
 
57
  context_parts = split_text_into_paragraphs(context)
58
+ relevant_parts = find_relevant_parts(question, context_parts)
59
 
 
 
 
 
 
 
60
  answers = []
61
  for part in relevant_parts:
62
  try:
63
  result = qa_pipeline(question=question, context=part)
64
  answers.append(result['answer'])
65
+ except Exception:
66
+ continue
67
+
68
+ final_answer = validate_and_refine_answer(" ".join(answers).strip())
 
69
  return final_answer
70
 
71
+ # Gradio-Interface
72
  pdf_input = gr.File(label="PDF-Datei hochladen", type="filepath")
73
  question_input = gr.Textbox(label="Frage eingeben", placeholder="Stelle eine Frage zu dem PDF-Dokument")
74
  response_output = gr.Textbox(label="Antwort")
75
 
 
76
  interface = gr.Interface(
77
  fn=chatbot_response,
78
  inputs=[pdf_input, question_input],
79
  outputs=response_output,
80
  title="Verbesserte PDF-Fragebeantwortung",
81
+ description="Lade eine PDF-Datei hoch und stelle Fragen zu ihrem Inhalt. Antworten basieren nur auf den PDF-Inhalten."
82
  )
83
 
84
  if __name__ == "__main__":