Update app.py
Browse files
app.py
CHANGED
@@ -13,6 +13,7 @@ from docx import Document
|
|
13 |
import asyncio
|
14 |
import docx
|
15 |
from transformers import AutoTokenizer, AutoModel
|
|
|
16 |
import torch
|
17 |
|
18 |
|
@@ -32,6 +33,10 @@ api = HfApi()
|
|
32 |
# Relativer Pfad zum Verzeichnis mit den Dokumenten
|
33 |
DOCS_DIR = "kkg_dokumente"
|
34 |
|
|
|
|
|
|
|
|
|
35 |
|
36 |
|
37 |
# Funktion zum Extrahieren von Text aus PDF
|
@@ -111,14 +116,16 @@ def download_link(doc_name):
|
|
111 |
file_url = f"https://huggingface.co/spaces/alexkueck/kkg_suche/resolve/main/kkg_dokumente/{doc_name}?token={HF_READ}"
|
112 |
return f'<a href="{file_url}" download="{doc_name}" target="_blank">{doc_name}</a>'
|
113 |
|
114 |
-
|
115 |
-
tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
|
116 |
-
model = AutoModel.from_pretrained('bert-base-uncased')
|
117 |
|
118 |
###########################################################
|
119 |
############# KI um Suchanfrage zu Embedden ###############
|
120 |
# Funktion zur Berechnung der Embeddings
|
121 |
def get_embeddings(texts):
|
|
|
|
|
|
|
|
|
122 |
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
|
123 |
with torch.no_grad():
|
124 |
outputs = model(**inputs)
|
@@ -136,8 +143,9 @@ def search_documents(query):
|
|
136 |
# Embedding des Queries
|
137 |
query_embedding = get_embeddings([query])
|
138 |
|
|
|
139 |
# Berechnung der Ähnlichkeit
|
140 |
-
similarities = cosine_similarity(query_embedding, text_embeddings).flatten()
|
141 |
|
142 |
# Sortieren nach Relevanz
|
143 |
related_docs_indices = similarities.argsort()[::-1]
|
@@ -150,33 +158,34 @@ def search_documents(query):
|
|
150 |
cumulative_pages = [sum(num_pages_per_doc[:i+1]) for i in range(len(num_pages_per_doc))]
|
151 |
|
152 |
for i in related_docs_indices:
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
# Überprüfen, ob der Suchtext in der Überschrift oder im Seiteninhalt enthalten ist
|
161 |
-
index_in_content = page_content.lower().find(query.lower())
|
162 |
-
index_in_header = header_content.lower().find(query.lower())
|
163 |
-
|
164 |
-
if index_in_content != -1 or index_in_header != -1:
|
165 |
-
# Erstellen Sie einen Snippet für die Suchergebnisse
|
166 |
-
start = max(0, index_in_content - 400) if index_in_content != -1 else 0
|
167 |
-
end = min(len(page_content), index_in_content + 400) if index_in_content != -1 else len(page_content)
|
168 |
-
snippet = f"Aus <span class='doc-name'>{doc['file']}</span> (Seite <span class='page-number'>{page_index + 1}</span>):<br>"
|
169 |
-
|
170 |
-
# Fügen Sie die Überschrift hinzu, falls vorhanden
|
171 |
-
if header_content:
|
172 |
-
snippet += f"<b>Überschrift:</b> {header_content}<br>"
|
173 |
|
174 |
-
|
175 |
-
|
|
|
176 |
|
177 |
-
if
|
178 |
-
|
179 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
180 |
|
181 |
results = list(relevant_docs.keys())
|
182 |
return results, relevant_text
|
|
|
13 |
import asyncio
|
14 |
import docx
|
15 |
from transformers import AutoTokenizer, AutoModel
|
16 |
+
from sentence_transformers import SentenceTransformer
|
17 |
import torch
|
18 |
|
19 |
|
|
|
33 |
# Relativer Pfad zum Verzeichnis mit den Dokumenten
|
34 |
DOCS_DIR = "kkg_dokumente"
|
35 |
|
36 |
+
########################################################
|
37 |
+
##########Ki Modell für Embeddings der Suchanfrage nutzen
|
38 |
+
# Laden des Sentence-Transformer-Modells
|
39 |
+
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
|
40 |
|
41 |
|
42 |
# Funktion zum Extrahieren von Text aus PDF
|
|
|
116 |
file_url = f"https://huggingface.co/spaces/alexkueck/kkg_suche/resolve/main/kkg_dokumente/{doc_name}?token={HF_READ}"
|
117 |
return f'<a href="{file_url}" download="{doc_name}" target="_blank">{doc_name}</a>'
|
118 |
|
119 |
+
|
|
|
|
|
120 |
|
121 |
###########################################################
|
122 |
############# KI um Suchanfrage zu Embedden ###############
|
123 |
# Funktion zur Berechnung der Embeddings
|
124 |
def get_embeddings(texts):
|
125 |
+
return model.encode(texts, convert_to_tensor=True)
|
126 |
+
|
127 |
+
# Funktion zur Berechnung der Embeddings
|
128 |
+
def get_embeddingsback(texts):
|
129 |
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
|
130 |
with torch.no_grad():
|
131 |
outputs = model(**inputs)
|
|
|
143 |
# Embedding des Queries
|
144 |
query_embedding = get_embeddings([query])
|
145 |
|
146 |
+
|
147 |
# Berechnung der Ähnlichkeit
|
148 |
+
similarities = cosine_similarity(query_embedding.cpu(), text_embeddings.cpu()).flatten()
|
149 |
|
150 |
# Sortieren nach Relevanz
|
151 |
related_docs_indices = similarities.argsort()[::-1]
|
|
|
158 |
cumulative_pages = [sum(num_pages_per_doc[:i+1]) for i in range(len(num_pages_per_doc))]
|
159 |
|
160 |
for i in related_docs_indices:
|
161 |
+
if similarities[i] > 0:
|
162 |
+
doc_index = next(idx for idx, cumulative in enumerate(cumulative_pages) if i < cumulative)
|
163 |
+
page_index = i if doc_index == 0 else i - cumulative_pages[doc_index-1]
|
164 |
+
doc = documents[doc_index]
|
165 |
+
page = doc['pages'][page_index]
|
166 |
+
page_content = page['content']
|
167 |
+
header_content = page.get('header', '')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
168 |
|
169 |
+
# Überprüfen, ob der Suchtext in der Überschrift oder im Seiteninhalt enthalten ist
|
170 |
+
index_in_content = page_content.lower().find(query.lower())
|
171 |
+
index_in_header = header_content.lower().find(query.lower())
|
172 |
|
173 |
+
if index_in_content != -1 or index_in_header != -1:
|
174 |
+
# Erstellen Sie einen Snippet für die Suchergebnisse
|
175 |
+
start = max(0, index_in_content - 400) if index_in_content != -1 else 0
|
176 |
+
end = min(len(page_content), index_in_content + 400) if index_in_content != -1 else len(page_content)
|
177 |
+
snippet = f"Aus <span class='doc-name'>{doc['file']}</span> (Seite <span class='page-number'>{page_index + 1}</span>):<br>"
|
178 |
+
|
179 |
+
# Fügen Sie die Überschrift hinzu, falls vorhanden
|
180 |
+
if header_content:
|
181 |
+
snippet += f"<b>Überschrift:</b> {header_content}<br>"
|
182 |
+
|
183 |
+
snippet += f"...{page_content[start:end]}...<br><br>"
|
184 |
+
relevant_text += snippet
|
185 |
+
|
186 |
+
if doc['file'] not in relevant_docs:
|
187 |
+
relevant_docs[doc['file']] = []
|
188 |
+
relevant_docs[doc['file']].append(snippet)
|
189 |
|
190 |
results = list(relevant_docs.keys())
|
191 |
return results, relevant_text
|