File size: 2,492 Bytes
40a799a
 
fbe3ac4
318ff7b
 
7bf65ec
40a799a
 
6378bf1
318ff7b
 
 
 
 
 
 
 
e8a59ae
318ff7b
 
 
 
 
 
 
 
 
42c84c3
40a799a
318ff7b
40a799a
 
 
42c84c3
318ff7b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ee9ba92
318ff7b
fbe3ac4
 
318ff7b
 
 
 
fbe3ac4
ee9ba92
318ff7b
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import faiss
import numpy as np
import gradio as gr
from sentence_transformers import SentenceTransformer
import fitz  # PyMuPDF für die Textextraktion aus PDFs

# Schritt 1: Lade das Modell für die Embeddings
model = SentenceTransformer('all-MiniLM-L6-v2')

# FAISS-Index erstellen
def create_faiss_index(documents):
    document_embeddings = model.encode(documents)
    dimension = len(document_embeddings[0])
    index = faiss.IndexFlatL2(dimension)
    document_embeddings = np.array(document_embeddings).astype('float32')
    index.add(document_embeddings)  # Füge Dokumente zum Index hinzu
    return index, documents

# Schritt 2: Extrahiere Text aus einem PDF
def extract_text_from_pdf(pdf_path):
    doc = fitz.open(pdf_path)
    text_pages = []
    for page_num in range(len(doc)):
        page = doc.load_page(page_num)
        text = page.get_text("text")  # Extrahiert den Text als normalen Text
        text_pages.append(text)
    return text_pages

# Schritt 3: Suche nach einer ähnlichen Antwort auf eine Eingabeabfrage
def search_documents(query, index, documents):
    query_embedding = model.encode([query])[0].astype('float32')
    D, I = index.search(np.array([query_embedding]), k=1)  # Suche nach den Top 1 Treffern
    return documents[I[0][0]]  # Gibt das am besten passende Dokument zurück

# Schritt 4: Gesamtprozess (Fragebeantwortung)
def chatbot_response(pdf, question):
    # Speichern der hochgeladenen PDF
    pdf_path = "uploaded_pdf.pdf"
    pdf.save(pdf_path)

    # Textextraktion aus der PDF
    text_pages = extract_text_from_pdf(pdf_path)

    # FAISS-Index erstellen
    index, documents = create_faiss_index(text_pages)

    # Suche nach Antwort
    answer = search_documents(question, index, documents)

    # Lösche die hochgeladene PDF-Datei
    os.remove(pdf_path)

    return answer

# Gradio-Interface
pdf_input = gr.File(label="PDF-Datei hochladen", type="file")
question_input = gr.Textbox(label="Frage eingeben", placeholder="Stelle eine Frage zu dem PDF-Dokument")
response_output = gr.Textbox(label="Antwort")

# Gradio-Interface erstellen
interface = gr.Interface(
    fn=chatbot_response,
    inputs=[pdf_input, question_input],
    outputs=response_output,
    title="PDF-Fragebeantwortung mit FAISS und Transformers",
    description="Lade eine PDF-Datei hoch und stelle Fragen zu ihrem Inhalt. Das System verwendet FAISS und Transformers, um die passende Antwort zu finden."
)

if __name__ == "__main__":
    interface.launch()