Update app.py
Browse files
app.py
CHANGED
@@ -20,15 +20,15 @@ import torch
|
|
20 |
|
21 |
|
22 |
# Zugriff auf das Secret als Umgebungsvariable
|
23 |
-
HF_WRITE = os.getenv("HF_WRITE")
|
24 |
HF_READ = os.getenv("HF_READ")
|
25 |
|
26 |
# CONSTANTS
|
27 |
-
REPO_ID = "alexkueck/kkg_suche"
|
28 |
-
REPO_TYPE = "space"
|
29 |
|
30 |
# HfApi-Instanz erstellen
|
31 |
-
api = HfApi()
|
32 |
|
33 |
|
34 |
# Relativer Pfad zum Verzeichnis mit den Dokumenten
|
@@ -40,7 +40,9 @@ DOCS_DIR = "kkg_dokumente"
|
|
40 |
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
|
41 |
|
42 |
|
43 |
-
|
|
|
|
|
44 |
def extract_text_from_pdf(pdf_path):
|
45 |
doc = fitz.open(pdf_path)
|
46 |
pages = []
|
@@ -70,7 +72,8 @@ def extract_text_from_docx(docx_path):
|
|
70 |
pages.append({'header': header, 'content': '\n'.join(current_page)})
|
71 |
return pages
|
72 |
|
73 |
-
|
|
|
74 |
def initialize_documents():
|
75 |
documents = []
|
76 |
if os.path.exists(DOCS_DIR):
|
@@ -85,6 +88,21 @@ def initialize_documents():
|
|
85 |
documents.append({"file": file_name, "pages": pages})
|
86 |
return documents
|
87 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
88 |
# Hochladen von Dateien
|
89 |
def upload_pdf(file):
|
90 |
if file is None:
|
@@ -113,25 +131,18 @@ def display_files():
|
|
113 |
file_size = os.path.getsize(file_path) / 1024 # Größe in KB
|
114 |
row_color = "#4f4f4f" if i % 2 == 0 else "#3a3a3a" # Wechselnde Zeilenfarben
|
115 |
files_table += f"<tr style='background-color: {row_color}; border-bottom: 1px solid #ddd;'>"
|
116 |
-
files_table += f"<td>{download_link(file)}</td>"
|
117 |
files_table += f"<td>{file_size:.2f}</td></tr>"
|
118 |
files_table += "</table>"
|
119 |
return files_table
|
120 |
|
121 |
|
|
|
122 |
def list_pdfs():
|
123 |
if not os.path.exists(DOCS_DIR):
|
124 |
return []
|
125 |
return [f for f in os.listdir(SAVE_DIR) if f.endswith('.pdf')]
|
126 |
|
127 |
-
######################################
|
128 |
-
#nach relevanten suche -> download Link der passenden Dokuemtne erstellen
|
129 |
-
def download_link(doc_name):
|
130 |
-
# URL für das Herunterladen der Datei
|
131 |
-
file_url = f"https://huggingface.co/spaces/alexkueck/kkg_suche/resolve/main/kkg_dokumente/{doc_name}?token={HF_READ}"
|
132 |
-
return f'<b><a href="{file_url}" target="_blank" style="color: #b56edc; font-weight: bold;">{doc_name}</a></b>'
|
133 |
-
|
134 |
-
|
135 |
|
136 |
###########################################################
|
137 |
############# KI um Suchanfrage zu Embedden ###############
|
@@ -202,15 +213,12 @@ def search_documents(query):
|
|
202 |
if header_content:
|
203 |
snippet += f"<b>Überschrift:{header_content}</b> <br>"
|
204 |
|
205 |
-
snippet += f"{page_content[start:end]}<br><hr>"
|
206 |
relevant_text += snippet
|
207 |
|
208 |
if doc['file'] not in relevant_docs:
|
209 |
relevant_docs[doc['file']] = []
|
210 |
relevant_docs[doc['file']].append(snippet)
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
|
215 |
# Sortieren nach Relevanz
|
216 |
results = sorted(results, key=lambda x: x[1], reverse=True)
|
@@ -220,7 +228,8 @@ def search_documents(query):
|
|
220 |
return results, relevant_text
|
221 |
|
222 |
|
223 |
-
|
|
|
224 |
#######################################
|
225 |
#Suche starten und View aktialisieren
|
226 |
def search_and_update(query):
|
@@ -240,6 +249,7 @@ def search_and_update(query):
|
|
240 |
relevant_text = "<div class='no-results'>Kein relevanter Text gefunden.</div>"
|
241 |
|
242 |
return doc_links, relevant_text
|
|
|
243 |
|
244 |
######################################################################
|
245 |
############### Anwendung starten ####################################
|
@@ -257,7 +267,7 @@ with gr.Blocks(css="""
|
|
257 |
}
|
258 |
.doc-name {
|
259 |
font-weight: bold;
|
260 |
-
color: #B05DF9; /*
|
261 |
}
|
262 |
.page-number {
|
263 |
font-weight: bold;
|
@@ -273,7 +283,7 @@ with gr.Blocks(css="""
|
|
273 |
width: 100%; /* Volle Breite */
|
274 |
}
|
275 |
#doc_links a {
|
276 |
-
color: #
|
277 |
font-weight: bold;
|
278 |
width: 100%; /* Volle Breite */
|
279 |
}
|
|
|
20 |
|
21 |
|
22 |
# Zugriff auf das Secret als Umgebungsvariable
|
23 |
+
#HF_WRITE = os.getenv("HF_WRITE")
|
24 |
HF_READ = os.getenv("HF_READ")
|
25 |
|
26 |
# CONSTANTS
|
27 |
+
#REPO_ID = "alexkueck/kkg_suche"
|
28 |
+
#REPO_TYPE = "space"
|
29 |
|
30 |
# HfApi-Instanz erstellen
|
31 |
+
#api = HfApi()
|
32 |
|
33 |
|
34 |
# Relativer Pfad zum Verzeichnis mit den Dokumenten
|
|
|
40 |
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
|
41 |
|
42 |
|
43 |
+
########################################################
|
44 |
+
######## Hilfsfunktionen ###############################
|
45 |
+
# Funktion zum Extrahieren von Text aus PDF - und Word
|
46 |
def extract_text_from_pdf(pdf_path):
|
47 |
doc = fitz.open(pdf_path)
|
48 |
pages = []
|
|
|
72 |
pages.append({'header': header, 'content': '\n'.join(current_page)})
|
73 |
return pages
|
74 |
|
75 |
+
|
76 |
+
# Initialisierung der Dokumente - Dictionary um die Dokuemtneteninhalte, Switen und Überschriften zu halten
|
77 |
def initialize_documents():
|
78 |
documents = []
|
79 |
if os.path.exists(DOCS_DIR):
|
|
|
88 |
documents.append({"file": file_name, "pages": pages})
|
89 |
return documents
|
90 |
|
91 |
+
|
92 |
+
######################################
|
93 |
+
#nach relevanten suche -> download Link der passenden Dokuemtne erstellen
|
94 |
+
def download_link(doc_name):
|
95 |
+
# URL für das Herunterladen der Datei
|
96 |
+
file_url = f"https://huggingface.co/spaces/alexkueck/kkg_suche/resolve/main/kkg_dokumente/{doc_name}?token={HF_READ}"
|
97 |
+
return f'<b><a href="{file_url}" target="_blank" style="color: #BB70FC; font-weight: bold;">{doc_name}</a></b>'
|
98 |
+
|
99 |
+
|
100 |
+
# Zeitelumbrüche entfernen
|
101 |
+
def remove_line_breaks(text):
|
102 |
+
return text.replace('\n', ' ').replace('\r', ' ')
|
103 |
+
|
104 |
+
########################################################
|
105 |
+
######## Hilfsfunktionen Datei-Upload ##################
|
106 |
# Hochladen von Dateien
|
107 |
def upload_pdf(file):
|
108 |
if file is None:
|
|
|
131 |
file_size = os.path.getsize(file_path) / 1024 # Größe in KB
|
132 |
row_color = "#4f4f4f" if i % 2 == 0 else "#3a3a3a" # Wechselnde Zeilenfarben
|
133 |
files_table += f"<tr style='background-color: {row_color}; border-bottom: 1px solid #ddd;'>"
|
134 |
+
files_table += f"<td><b>{download_link(file)}</b></td>"
|
135 |
files_table += f"<td>{file_size:.2f}</td></tr>"
|
136 |
files_table += "</table>"
|
137 |
return files_table
|
138 |
|
139 |
|
140 |
+
# gefundene relevante Dokumente auflisten (links)
|
141 |
def list_pdfs():
|
142 |
if not os.path.exists(DOCS_DIR):
|
143 |
return []
|
144 |
return [f for f in os.listdir(SAVE_DIR) if f.endswith('.pdf')]
|
145 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
146 |
|
147 |
###########################################################
|
148 |
############# KI um Suchanfrage zu Embedden ###############
|
|
|
213 |
if header_content:
|
214 |
snippet += f"<b>Überschrift:{header_content}</b> <br>"
|
215 |
|
216 |
+
snippet += f"{remove_line_breaks(page_content[start:end])}<br><hr>"
|
217 |
relevant_text += snippet
|
218 |
|
219 |
if doc['file'] not in relevant_docs:
|
220 |
relevant_docs[doc['file']] = []
|
221 |
relevant_docs[doc['file']].append(snippet)
|
|
|
|
|
|
|
222 |
|
223 |
# Sortieren nach Relevanz
|
224 |
results = sorted(results, key=lambda x: x[1], reverse=True)
|
|
|
228 |
return results, relevant_text
|
229 |
|
230 |
|
231 |
+
###########################################################
|
232 |
+
############## Vorbereitung View in gradio ################
|
233 |
#######################################
|
234 |
#Suche starten und View aktialisieren
|
235 |
def search_and_update(query):
|
|
|
249 |
relevant_text = "<div class='no-results'>Kein relevanter Text gefunden.</div>"
|
250 |
|
251 |
return doc_links, relevant_text
|
252 |
+
|
253 |
|
254 |
######################################################################
|
255 |
############### Anwendung starten ####################################
|
|
|
267 |
}
|
268 |
.doc-name {
|
269 |
font-weight: bold;
|
270 |
+
color: #B05DF9; /* Dunkleres Lila für verlinkte Dokumente */
|
271 |
}
|
272 |
.page-number {
|
273 |
font-weight: bold;
|
|
|
283 |
width: 100%; /* Volle Breite */
|
284 |
}
|
285 |
#doc_links a {
|
286 |
+
color: #BB70FC; /* Helles Lila für Links im doc_links Feld */
|
287 |
font-weight: bold;
|
288 |
width: 100%; /* Volle Breite */
|
289 |
}
|