ekaterina-simonova commited on
Commit
907aa22
·
verified ·
1 Parent(s): 82d9c01

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +44 -21
app.py CHANGED
@@ -52,8 +52,24 @@ except Exception as e:
52
  raise
53
 
54
  # 3. Инициализация NLTK
55
- nltk.download('punkt', quiet=True)
56
- nltk.download('stopwords', quiet=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
 
58
  # 4. Константы
59
  XLSX_FILE_PATH = "Test_questions_from_diagnostpb (1).xlsx"
@@ -150,17 +166,10 @@ class HybridSearch:
150
  cursor = conn.cursor()
151
 
152
  try:
153
- # Проверяем наличие необходимых таблиц
154
- cursor.execute("SELECT name FROM sqlite_master WHERE type='table'")
155
- tables = {row['name'] for row in cursor.fetchall()}
156
- required_tables = {'content', 'map', 'documents'}
157
- missing_tables = required_tables - tables
158
-
159
- if missing_tables:
160
- raise ValueError(f"Отсутствуют необходимые таблицы: {missing_tables}")
161
-
162
  cursor.execute("SELECT COUNT(*) FROM content")
163
  count = cursor.fetchone()[0]
 
 
164
  if count == 0:
165
  raise ValueError("Таблица content пуста")
166
 
@@ -174,24 +183,28 @@ class HybridSearch:
174
  continue
175
 
176
  tokens = self._preprocess_text(text)
177
- if len(tokens) >= 2:
178
  self.corpus.append(tokens)
179
  self.doc_ids.append(row['id'])
180
  valid_docs += 1
 
 
181
  except Exception as e:
182
  logger.warning(f"Ошибка обработки документа ID {row['id']}: {str(e)}")
183
 
184
  if valid_docs == 0:
185
  raise ValueError("Нет пригодных документов после обработки")
186
 
 
187
  self.bm25 = BM25Okapi(self.corpus)
188
- logger.info(f"BM25 инициализирован с {valid_docs} документами")
189
 
190
  except Exception as e:
191
  logger.error(f"Ошибка при инициализации BM25: {str(e)}")
192
  raise
193
  finally:
194
  conn.close()
 
195
 
196
  def _create_fallback_index(self):
197
  """Создаем минимальный резервный индекс"""
@@ -234,16 +247,26 @@ class HybridSearch:
234
  return []
235
 
236
  text = re.sub(r"[^\w\s\-']", " ", text.lower())
 
 
 
237
  tokens = word_tokenize(text, language='russian')
238
- return [
239
- token for token in tokens
240
- if token not in self.stop_words
241
- and len(token) > 2
242
- and not token.isdigit()
243
- ]
244
  except Exception as e:
245
- logger.warning(f"Ошибка обработки текста: {str(e)}")
246
- return []
 
 
 
 
 
 
 
 
 
 
 
 
 
247
 
248
  def search(self, query, top_k=5):
249
  """Поиск с помощью BM25"""
 
52
  raise
53
 
54
  # 3. Инициализация NLTK
55
+ try:
56
+ nltk.download('punkt', quiet=True)
57
+ nltk.download('stopwords', quiet=True)
58
+ nltk.download('punkt_tab', quiet=True)
59
+ nltk.download('punkt_tab/russian', quiet=True)
60
+
61
+ # Проверяем загрузку
62
+ from nltk.tokenize import word_tokenize
63
+ test_text = "тестовый текст"
64
+ tokens = word_tokenize(test_text, language='russian')
65
+ logger.info(f"NLTK успешно инициализирован. Тестовая токенизация: {tokens}")
66
+
67
+ except Exception as e:
68
+ logger.error(f"Ошибка при инициализации NLTK: {str(e)}")
69
+ # Используем простую токенизацию как запасной вариант
70
+ def word_tokenize(text, language=None):
71
+ return text.lower().split()
72
+ logger.warning("Используется упрощенная токенизация")
73
 
74
  # 4. Константы
75
  XLSX_FILE_PATH = "Test_questions_from_diagnostpb (1).xlsx"
 
166
  cursor = conn.cursor()
167
 
168
  try:
 
 
 
 
 
 
 
 
 
169
  cursor.execute("SELECT COUNT(*) FROM content")
170
  count = cursor.fetchone()[0]
171
+ logger.info(f"Найдено {count} документов в таблице content")
172
+
173
  if count == 0:
174
  raise ValueError("Таблица content пуста")
175
 
 
183
  continue
184
 
185
  tokens = self._preprocess_text(text)
186
+ if tokens and len(tokens) >= 2: # Проверяем, что токены не пустые
187
  self.corpus.append(tokens)
188
  self.doc_ids.append(row['id'])
189
  valid_docs += 1
190
+ if valid_docs % 1000 == 0: # Логируем прогресс
191
+ logger.info(f"Обработано {valid_docs} документов")
192
  except Exception as e:
193
  logger.warning(f"Ошибка обработки документа ID {row['id']}: {str(e)}")
194
 
195
  if valid_docs == 0:
196
  raise ValueError("Нет пригодных документов после обработки")
197
 
198
+ logger.info(f"Создание BM25 индекса для {valid_docs} документов")
199
  self.bm25 = BM25Okapi(self.corpus)
200
+ logger.info(f"BM25 успешно инициализирован с {valid_docs} документами")
201
 
202
  except Exception as e:
203
  logger.error(f"Ошибка при инициализации BM25: {str(e)}")
204
  raise
205
  finally:
206
  conn.close()
207
+
208
 
209
  def _create_fallback_index(self):
210
  """Создаем минимальный резервный индекс"""
 
247
  return []
248
 
249
  text = re.sub(r"[^\w\s\-']", " ", text.lower())
250
+
251
+ try:
252
+ # Пробуем использовать NLTK токенизацию
253
  tokens = word_tokenize(text, language='russian')
 
 
 
 
 
 
254
  except Exception as e:
255
+ # При ошибке используем простую токенизацию
256
+ logger.warning(f"Ошибка NLTK токенизации: {str(e)}")
257
+ tokens = text.split()
258
+
259
+ # Фильтруем токены
260
+ return [
261
+ token for token in tokens
262
+ if token not in self.stop_words
263
+ and len(token) > 2
264
+ and not token.isdigit()
265
+ ]
266
+ except Exception as e:
267
+ logger.warning(f"Ошибка обработки текста: {str(e)}")
268
+ # Возвращаем простую токенизацию как последнее средство
269
+ return [t for t in text.lower().split() if len(t) > 2]
270
 
271
  def search(self, query, top_k=5):
272
  """Поиск с помощью BM25"""