alexkueck commited on
Commit
2ffc5c2
·
verified ·
1 Parent(s): 6a4faa5

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +91 -47
app.py CHANGED
@@ -33,28 +33,56 @@ DOCS_DIR = "kkg_dokumente"
33
  ############################################################
34
  ####### Hilfsfunktionen
35
  #alle documente den text extrahieren und die einzelen texte als dictionay zusammenstellen - mit überschrift, seitenzahl und text
36
- # Funktion zum Extrahieren von Text aus
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
  # Funktion zum Extrahieren des Textes aus einer PDF-Datei
38
  def extract_text_from_pdf(pdf_path):
39
  doc = fitz.open(pdf_path)
40
- text = []
41
  for page in doc:
42
- text.append(page.get_text())
43
- return text
 
 
 
 
 
44
 
 
 
 
 
45
  # Dynamische Erstellung der Dokumentenliste und Extraktion der Texte
46
- documents = []
47
- for file_name in os.listdir(SAVE_DIR):
48
- if file_name.endswith(".pdf"):
49
- pdf_path = os.path.join(SAVE_DIR, file_name)
50
- pages_text = extract_text_from_pdf(pdf_path)
51
- documents.append({"file": file_name, "pages": pages_text})
52
 
53
- # TF-IDF Vectorizer vorbereiten
54
  vectorizer = TfidfVectorizer()
55
- tfidf_matrix = vectorizer.fit_transform([page for doc in documents for page in doc['pages']])
56
- ####################################################
57
 
 
 
 
 
 
 
 
 
 
 
 
58
  def search_documents(query):
59
  if not query:
60
  return [doc['file'] for doc in documents], "", []
@@ -65,7 +93,7 @@ def search_documents(query):
65
 
66
  results = []
67
  relevant_text = ""
68
- relevant_pdfs = []
69
  num_pages_per_doc = [len(doc['pages']) for doc in documents]
70
  cumulative_pages = [sum(num_pages_per_doc[:i+1]) for i in range(len(num_pages_per_doc))]
71
 
@@ -74,15 +102,33 @@ def search_documents(query):
74
  doc_index = next(idx for idx, cumulative in enumerate(cumulative_pages) if i < cumulative)
75
  page_index = i if doc_index == 0 else i - cumulative_pages[doc_index-1]
76
  doc = documents[doc_index]
77
- results.append(doc['file'])
78
- page_content = doc['pages'][page_index]
79
- index = page_content.lower().find(query.lower())
80
- if index != -1:
81
- start = max(0, index - 400)
82
- end = min(len(page_content), index + 400)
83
- relevant_text += f"Aus {doc['file']} (Seite {page_index + 1}):\n...{page_content[start:end]}...\n\n"
84
- relevant_pdfs.append((doc['file'], page_index))
85
- return results, relevant_text, relevant_pdfs
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86
 
87
 
88
 
@@ -155,35 +201,33 @@ def list_pdfs():
155
  return []
156
  return [f for f in os.listdir(SAVE_DIR) if f.endswith('.pdf')]
157
 
158
- def display_pdf(selected_pdf):
159
- pdf_path = os.path.join(SAVE_DIR, selected_pdf)
 
 
 
 
 
 
 
 
 
 
 
160
 
161
- # PDF-URL im Hugging Face Space
162
- encoded_pdf_name = urllib.parse.quote(selected_pdf)
163
- pdf_url = f"https://huggingface.co/spaces/{REPO_ID}/resolve/main/kkg_dokumente/{encoded_pdf_name}"
164
 
165
- # PDF von der URL herunterladen
166
- headers = {"Authorization": f"Bearer {HF_READ}"}
167
- response = requests.get(pdf_url, headers=headers)
168
- if response.status_code == 200:
169
- with open(pdf_path, 'wb') as f:
170
- f.write(response.content)
171
  else:
172
- return None, f"Fehler beim Herunterladen der PDF-Datei von {pdf_url}"
173
-
174
- # PDF in Bilder umwandeln
175
- document = fitz.open(pdf_path)
176
- temp_dir = tempfile.mkdtemp()
177
-
178
- # Nur die erste Seite als Bild speichern
179
- page = document.load_page(0)
180
- pix = page.get_pixmap()
181
- img_path = os.path.join(temp_dir, f"page_0.png")
182
- pix.save(img_path)
183
 
184
- status = f"PDF '{selected_pdf}' erfolgreich geladen und verarbeitet."
 
185
 
186
- return img_path, status
187
 
188
 
189
  ######################################################################
 
33
  ############################################################
34
  ####### Hilfsfunktionen
35
  #alle documente den text extrahieren und die einzelen texte als dictionay zusammenstellen - mit überschrift, seitenzahl und text
36
+ def initialize_documents():
37
+ documents = []
38
+ if os.path.exists(DOCS_DIR):
39
+ for file_name in os.listdir(DOCS_DIR):
40
+ if file_name.endswith(".pdf"):
41
+ pdf_path = os.path.join(DOCS_DIR, file_name)
42
+ pages = extract_text_from_pdf(pdf_path)
43
+ documents.append({"file": file_name, "pages": pages})
44
+ elif file_name.endswith(".docx"):
45
+ docx_path = os.path.join(DOCS_DIR, file_name)
46
+ pages = extract_text_from_docx(docx_path)
47
+ documents.append({"file": file_name, "pages": pages})
48
+ return documents
49
+
50
+
51
  # Funktion zum Extrahieren des Textes aus einer PDF-Datei
52
  def extract_text_from_pdf(pdf_path):
53
  doc = fitz.open(pdf_path)
54
+ pages = []
55
  for page in doc:
56
+ text = page.get_text()
57
+ # Hier eine einfache Annahme, dass die erste Zeile der Seite die Überschrift ist
58
+ lines = text.split('\n')
59
+ header = lines[0] if lines else ''
60
+ content = '\n'.join(lines[1:]) if len(lines) > 1 else ''
61
+ pages.append({'header': header, 'content': content})
62
+ return pages
63
 
64
+
65
+
66
+ ###########################################################
67
+ #################### Suche init ###########################
68
  # Dynamische Erstellung der Dokumentenliste und Extraktion der Texte
69
+ print("Martix init ........................")
70
+ documents = initialize_documents()
 
 
 
 
71
 
72
+ # Initialisierung des Vektorizers
73
  vectorizer = TfidfVectorizer()
 
 
74
 
75
+ # Extrahieren der Texte aus den Dokumentseiten
76
+ texts = [page['content'] for doc in documents for page in doc['pages']]
77
+
78
+ # Erstellen der TF-IDF-Matrix
79
+ tfidf_matrix = vectorizer.fit_transform(texts)
80
+
81
+
82
+
83
+
84
+ ##########################################################
85
+ ############# weitere Hilsffunktionen ####################
86
  def search_documents(query):
87
  if not query:
88
  return [doc['file'] for doc in documents], "", []
 
93
 
94
  results = []
95
  relevant_text = ""
96
+ relevant_docs = {}
97
  num_pages_per_doc = [len(doc['pages']) for doc in documents]
98
  cumulative_pages = [sum(num_pages_per_doc[:i+1]) for i in range(len(num_pages_per_doc))]
99
 
 
102
  doc_index = next(idx for idx, cumulative in enumerate(cumulative_pages) if i < cumulative)
103
  page_index = i if doc_index == 0 else i - cumulative_pages[doc_index-1]
104
  doc = documents[doc_index]
105
+ page = doc['pages'][page_index]
106
+ page_content = page['content']
107
+ header_content = page.get('header', '')
108
+
109
+ # Überprüfen, ob der Suchtext in der Überschrift oder im Seiteninhalt enthalten ist
110
+ index_in_content = page_content.lower().find(query.lower())
111
+ index_in_header = header_content.lower().find(query.lower())
112
+
113
+ if index_in_content != -1 or index_in_header != -1:
114
+ # Erstellen Sie einen Snippet für die Suchergebnisse
115
+ start = max(0, index_in_content - 400) if index_in_content != -1 else 0
116
+ end = min(len(page_content), index_in_content + 400) if index_in_content != -1 else len(page_content)
117
+ snippet = f"Aus <span class='doc-name'>{doc['file']}</span> (Seite <span class='page-number'>{page_index + 1}</span>):<br>"
118
+
119
+ # Fügen Sie die Überschrift hinzu, falls vorhanden
120
+ if header_content:
121
+ snippet += f"<b>Überschrift:</b> {header_content}<br>"
122
+
123
+ snippet += f"...{page_content[start:end]}...<br><br>"
124
+ relevant_text += snippet
125
+
126
+ if doc['file'] not in relevant_docs:
127
+ relevant_docs[doc['file']] = []
128
+ relevant_docs[doc['file']].append(snippet)
129
+
130
+ results = list(relevant_docs.keys())
131
+ return results, relevant_text
132
 
133
 
134
 
 
201
  return []
202
  return [f for f in os.listdir(SAVE_DIR) if f.endswith('.pdf')]
203
 
204
+ ######################################
205
+ #nach relevanten suche -> download Link der passenden Dokuemtne erstellen
206
+ def download_link(doc_name):
207
+ # URL für das Herunterladen der Datei
208
+ file_url = f"https://huggingface.co/spaces/alexkueck/kkg_suche/resolve/main/kkg_dokumente/{doc_name}?token={HF_READ}"
209
+ return f'<a href="{file_url}" download="{doc_name}" target="_blank">{doc_name}</a>'
210
+
211
+
212
+ #######################################
213
+ #Suche starten und View aktialisieren
214
+ def search_and_update(query):
215
+ if not query.strip():
216
+ return "<div class='no-results'>Bitte geben Sie einen Suchbegriff ein.</div>", "<div class='no-results'>Bitte geben Sie einen Suchbegriff ein.</div>"
217
 
218
+ relevant_docs, relevant_text = search_documents(query)
 
 
219
 
220
+ if not relevant_docs:
221
+ doc_links = "<div class='no-results'>Keine passenden Dokumente gefunden.</div>"
 
 
 
 
222
  else:
223
+ doc_links = ""
224
+ for doc in relevant_docs:
225
+ doc_links += download_link(doc) + "<br>"
 
 
 
 
 
 
 
 
226
 
227
+ if not relevant_text:
228
+ relevant_text = "<div class='no-results'>Kein relevanter Text gefunden.</div>"
229
 
230
+ return doc_links, relevant_text
231
 
232
 
233
  ######################################################################