la04 commited on
Commit
d859c3e
·
verified ·
1 Parent(s): adbd41e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +35 -17
app.py CHANGED
@@ -3,10 +3,15 @@ import numpy as np
3
  import gradio as gr
4
  from sentence_transformers import SentenceTransformer
5
  import fitz # PyMuPDF für die Textextraktion aus PDFs
6
- import os
 
 
 
 
7
 
8
  # Schritt 1: Lade das Modell für die Embeddings
9
- model = SentenceTransformer('all-MiniLM-L6-v2')
 
10
 
11
  # FAISS-Index erstellen
12
  def create_faiss_index(documents):
@@ -17,33 +22,46 @@ def create_faiss_index(documents):
17
  index.add(document_embeddings) # Füge Dokumente zum Index hinzu
18
  return index, documents
19
 
20
- # Schritt 2: Extrahiere Text aus einem PDF
21
  def extract_text_from_pdf(pdf_path):
22
  doc = fitz.open(pdf_path)
23
- text_pages = []
24
  for page_num in range(len(doc)):
25
  page = doc.load_page(page_num)
26
- text = page.get_text("text") # Extrahiert den Text als normalen Text
27
- text_pages.append(text)
28
- return text_pages
 
 
29
 
30
- # Schritt 3: Suche nach einer ähnlichen Antwort auf eine Eingabeabfrage
31
- def search_documents(query, index, documents):
32
  query_embedding = model.encode([query])[0].astype('float32')
33
- D, I = index.search(np.array([query_embedding]), k=1) # Suche nach den Top 1 Treffern
34
- return documents[I[0][0]] # Gibt das am besten passende Dokument zurück
 
 
 
 
 
 
35
 
36
- # Schritt 4: Gesamtprozess (Fragebeantwortung)
37
  def chatbot_response(pdf_path, question):
 
 
38
  # Textextraktion aus der PDF
39
- text_pages = extract_text_from_pdf(pdf_path)
40
 
41
  # FAISS-Index erstellen
42
- index, documents = create_faiss_index(text_pages)
43
 
44
- # Suche nach Antwort
45
- answer = search_documents(question, index, documents)
 
46
 
 
 
47
  return answer
48
 
49
  # Gradio-Interface
@@ -57,7 +75,7 @@ interface = gr.Interface(
57
  inputs=[pdf_input, question_input],
58
  outputs=response_output,
59
  title="PDF-Fragebeantwortung mit FAISS und Transformers",
60
- description="Lade eine PDF-Datei hoch und stelle Fragen zu ihrem Inhalt. Das System verwendet FAISS und Transformers, um die passende Antwort zu finden."
61
  )
62
 
63
  if __name__ == "__main__":
 
3
  import gradio as gr
4
  from sentence_transformers import SentenceTransformer
5
  import fitz # PyMuPDF für die Textextraktion aus PDFs
6
+ from transformers import pipeline
7
+ import logging
8
+
9
+ # Logging konfigurieren
10
+ logging.basicConfig(level=logging.INFO)
11
 
12
  # Schritt 1: Lade das Modell für die Embeddings
13
+ model = SentenceTransformer('all-mpnet-base-v2') # Besser geeignet für längere Texte
14
+ qa_model = pipeline("question-answering", model="distilbert-base-cased-distilled-squad")
15
 
16
  # FAISS-Index erstellen
17
  def create_faiss_index(documents):
 
22
  index.add(document_embeddings) # Füge Dokumente zum Index hinzu
23
  return index, documents
24
 
25
+ # Schritt 2: Extrahiere Text aus einem PDF (kleinere Abschnitte, z. B. Absätze)
26
  def extract_text_from_pdf(pdf_path):
27
  doc = fitz.open(pdf_path)
28
+ text_chunks = []
29
  for page_num in range(len(doc)):
30
  page = doc.load_page(page_num)
31
+ text = page.get_text("text")
32
+ # Text in kleinere Abschnitte (z. B. Absätze) unterteilen
33
+ chunks = text.split('\n\n') # Unterteilen nach Absätzen
34
+ text_chunks.extend(chunks)
35
+ return text_chunks
36
 
37
+ # Schritt 3: Suche nach mehreren passenden Abschnitten
38
+ def search_documents(query, index, documents, k=5):
39
  query_embedding = model.encode([query])[0].astype('float32')
40
+ D, I = index.search(np.array([query_embedding]), k=k) # Suche nach den Top k Treffern
41
+ results = [documents[i] for i in I[0]]
42
+ return " ".join(results) # Kombiniere die Top-Ergebnisse
43
+
44
+ # Schritt 4: Nutze das QA-Modell, um eine präzise Antwort zu generieren
45
+ def generate_answer(context, question):
46
+ result = qa_model(question=question, context=context)
47
+ return result['answer']
48
 
49
+ # Schritt 5: Gesamtprozess (Fragebeantwortung)
50
  def chatbot_response(pdf_path, question):
51
+ logging.info(f"Frage: {question}")
52
+
53
  # Textextraktion aus der PDF
54
+ text_chunks = extract_text_from_pdf(pdf_path)
55
 
56
  # FAISS-Index erstellen
57
+ index, documents = create_faiss_index(text_chunks)
58
 
59
+ # Suche nach Kontext
60
+ context = search_documents(question, index, documents, k=5)
61
+ logging.info(f"Gefundener Kontext: {context[:500]}") # Nur die ersten 500 Zeichen anzeigen
62
 
63
+ # Antwort generieren
64
+ answer = generate_answer(context, question)
65
  return answer
66
 
67
  # Gradio-Interface
 
75
  inputs=[pdf_input, question_input],
76
  outputs=response_output,
77
  title="PDF-Fragebeantwortung mit FAISS und Transformers",
78
+ description="Lade eine PDF-Datei hoch und stelle Fragen zu ihrem Inhalt. Das System verwendet FAISS, Transformers und ein QA-Modell, um präzise Antworten zu liefern."
79
  )
80
 
81
  if __name__ == "__main__":