alexkueck commited on
Commit
1296e00
·
verified ·
1 Parent(s): 38e3f46

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +38 -29
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
- # Laden des BERT-Modells und Tokenizers
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
- doc_index = next(idx for idx, cumulative in enumerate(cumulative_pages) if i < cumulative)
154
- page_index = i if doc_index == 0 else i - cumulative_pages[doc_index-1]
155
- doc = documents[doc_index]
156
- page = doc['pages'][page_index]
157
- page_content = page['content']
158
- header_content = page.get('header', '')
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
- snippet += f"...{page_content[start:end]}...<br><br>"
175
- relevant_text += snippet
 
176
 
177
- if doc['file'] not in relevant_docs:
178
- relevant_docs[doc['file']] = []
179
- relevant_docs[doc['file']].append(snippet)
 
 
 
 
 
 
 
 
 
 
 
 
 
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