yogl commited on
Commit
50f9bde
·
verified ·
1 Parent(s): f81cc0c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +62 -38
app.py CHANGED
@@ -18,21 +18,15 @@ st.set_page_config(
18
  )
19
 
20
  # ---- Hugging Face ----
21
- # Секрет HF_TOKEN нужно задать в Settings → Variables and secrets вашего Space.
22
  HF_TOKEN = os.getenv("HF_TOKEN")
23
-
24
- # repo_id приватного датасета с файлами ALL_data.xlsx и embeddings_full.json
25
- # Можешь зашить строкой или задать в переменной окружения HF_DATA_REPO.
26
  HF_DATA_REPO = os.getenv("HF_DATA_REPO", "yogl/dissertation-search-data")
27
 
28
- # Имена файлов в датасете
29
  ALL_DATA_FILENAME = "ALL_data.xlsx"
30
  EMBEDDINGS_FILENAME = "embeddings_full.json"
31
 
32
- # Модель для эмбеддингов
33
  MODEL_NAME = os.getenv("MODEL_NAME", "intfloat/multilingual-e5-base")
34
 
35
- # Порядок колонок в выдаче
36
  COLUMNS_ORDER = [
37
  "registration_number",
38
  "name",
@@ -45,6 +39,20 @@ COLUMNS_ORDER = [
45
  "abstract",
46
  ]
47
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
 
49
  if HF_TOKEN is None:
50
  st.error(
@@ -179,18 +187,22 @@ def run_search(query: str, top_k: int):
179
  query = query.strip()
180
  if not query:
181
  empty_df = pd.DataFrame(columns=["№", "score"] + COLUMNS_ORDER)
 
182
  return empty_df, None
183
 
184
  results = search_core(query, top_k)
185
  df_res = build_result_df(results)
186
 
187
- # Формируем Excel в памяти
 
 
 
188
  output = io.BytesIO()
189
  with pd.ExcelWriter(output, engine="xlsxwriter") as writer:
190
- df_res.to_excel(writer, index=False)
191
  output.seek(0)
192
 
193
- return df_res, output
194
 
195
 
196
  # ==========================
@@ -203,43 +215,53 @@ st.caption(
203
  "«пластификаторы для самоуплотняющихся бетонов»."
204
  )
205
 
206
- with st.sidebar:
207
- st.subheader("Параметры поиска")
208
- query = st.text_area(
209
- "Запрос",
210
- height=120,
 
 
 
 
 
 
 
211
  placeholder="Например: пластификаторы для самоуплотняющихся бетонов",
212
- )
213
- top_k = st.slider(
214
- "Сколько результатов показать",
215
- min_value=1,
216
- max_value=100,
217
- value=20,
218
- step=1,
219
  )
220
 
221
- col_btn1, col_btn2 = st.columns(2)
222
- with col_btn1:
 
 
 
 
 
 
 
 
 
223
  do_search = st.button("🔍 Поиск", type="primary")
224
- with col_btn2:
225
  clear = st.button("🧹 Очистить")
226
 
227
  if clear:
228
- # Полный сброс состояния
229
- st.session_state.clear()
230
  st.experimental_rerun()
231
 
232
- # Основная область
233
  if do_search:
234
  with st.spinner("Идёт поиск по базе диссертаций..."):
235
- df_res, excel_bytes = run_search(query, top_k)
236
 
237
  if df_res.empty:
238
  st.warning("Ничего не найдено. Попробуйте изменить формулировку запроса.")
239
  else:
240
  st.success(f"Найдено записей: {len(df_res)}")
241
 
242
- # Можно разделить на вкладки: таблица и детали по столбцам
243
  tab_table, tab_info = st.tabs(["Таблица результатов", "Описание полей"])
244
 
245
  with tab_table:
@@ -264,14 +286,16 @@ if do_search:
264
  """
265
  **Пояснения к полям:**
266
 
267
- - `registration_number` — регистрационный номер диссертации
268
- - `name` — название работы
269
- - `author_surname`, `author_name`, `author_patronymic` ФИО автора
270
- - `author_organization__short_name` — организация автора
271
- - `dissertation_type` тип диссертации
272
- - `created_date` — дата создания / регистрации
273
- - `abstract`аннотация
 
 
274
  """
275
  )
276
  else:
277
- st.info("Введите запрос в левом сайдбаре и нажмите кнопку «Поиск».")
 
18
  )
19
 
20
  # ---- Hugging Face ----
 
21
  HF_TOKEN = os.getenv("HF_TOKEN")
 
 
 
22
  HF_DATA_REPO = os.getenv("HF_DATA_REPO", "yogl/dissertation-search-data")
23
 
 
24
  ALL_DATA_FILENAME = "ALL_data.xlsx"
25
  EMBEDDINGS_FILENAME = "embeddings_full.json"
26
 
 
27
  MODEL_NAME = os.getenv("MODEL_NAME", "intfloat/multilingual-e5-base")
28
 
29
+ # Порядок колонок в выдаче (внутренние имена)
30
  COLUMNS_ORDER = [
31
  "registration_number",
32
  "name",
 
39
  "abstract",
40
  ]
41
 
42
+ # Отображаемые заголовки (русские имена колонок)
43
+ COLUMN_LABELS_RU = {
44
+ "№": "№",
45
+ "score": "Сходство",
46
+ "registration_number": "Регистрационный номер",
47
+ "name": "Название работы",
48
+ "author_surname": "Фамилия автора",
49
+ "author_name": "Имя автора",
50
+ "author_patronymic": "Отчество автора",
51
+ "author_organization__short_name": "Организация автора",
52
+ "dissertation_type": "Тип диссертации",
53
+ "created_date": "Дата создания / регистрации",
54
+ "abstract": "Аннотация",
55
+ }
56
 
57
  if HF_TOKEN is None:
58
  st.error(
 
187
  query = query.strip()
188
  if not query:
189
  empty_df = pd.DataFrame(columns=["№", "score"] + COLUMNS_ORDER)
190
+ empty_df = empty_df.rename(columns=COLUMN_LABELS_RU)
191
  return empty_df, None
192
 
193
  results = search_core(query, top_k)
194
  df_res = build_result_df(results)
195
 
196
+ # Переименовываем колонки в русский вариант
197
+ df_res_ru = df_res.rename(columns=COLUMN_LABELS_RU)
198
+
199
+ # Формируем Excel в памяти (тоже с русскими заголовками)
200
  output = io.BytesIO()
201
  with pd.ExcelWriter(output, engine="xlsxwriter") as writer:
202
+ df_res_ru.to_excel(writer, index=False)
203
  output.seek(0)
204
 
205
+ return df_res_ru, output
206
 
207
 
208
  # ==========================
 
215
  "«пластификаторы для самоуплотняющихся бетонов»."
216
  )
217
 
218
+ # Инициализация значений по умолчанию для состояния
219
+ if "query" not in st.session_state:
220
+ st.session_state["query"] = ""
221
+ if "top_k" not in st.session_state:
222
+ st.session_state["top_k"] = 20
223
+
224
+ # ---- ПОИСКОВАЯ ПАНЕЛЬ СВЕРХУ ----
225
+ with st.container():
226
+ # Имитация "поисковика": большое поле ввода по центру
227
+ query = st.text_input(
228
+ label="Запрос",
229
+ value=st.session_state["query"],
230
  placeholder="Например: пластификаторы для самоуплотняющихся бетонов",
231
+ label_visibility="collapsed", # скрываем текст "Запрос" сверху
232
+ key="query",
 
 
 
 
 
233
  )
234
 
235
+ col1, col2, col3 = st.columns([2, 1, 1])
236
+ with col1:
237
+ top_k = st.slider(
238
+ "Сколько результатов показать",
239
+ min_value=1,
240
+ max_value=100,
241
+ value=st.session_state["top_k"],
242
+ step=1,
243
+ key="top_k",
244
+ )
245
+ with col2:
246
  do_search = st.button("🔍 Поиск", type="primary")
247
+ with col3:
248
  clear = st.button("🧹 Очистить")
249
 
250
  if clear:
251
+ st.session_state["query"] = ""
252
+ st.session_state["top_k"] = 20
253
  st.experimental_rerun()
254
 
255
+ # ---- ОСНОВНАЯ ОБЛАСТЬ РЕЗУЛЬТАТОВ ----
256
  if do_search:
257
  with st.spinner("Идёт поиск по базе диссертаций..."):
258
+ df_res, excel_bytes = run_search(st.session_state["query"], st.session_state["top_k"])
259
 
260
  if df_res.empty:
261
  st.warning("Ничего не найдено. Попробуйте изменить формулировку запроса.")
262
  else:
263
  st.success(f"Найдено записей: {len(df_res)}")
264
 
 
265
  tab_table, tab_info = st.tabs(["Таблица результатов", "Описание полей"])
266
 
267
  with tab_table:
 
286
  """
287
  **Пояснения к полям:**
288
 
289
+ - **№**порядковый номер результата
290
+ - **Сходство**косинусное сходство запроса с документом (чем выше, тем релевантнее)
291
+ - **Регистрационный номер**регистрационный номер диссертации
292
+ - **Название работы** полное название диссертации
293
+ - **Фамилия / Имя / Отчество автора** — ФИО автора
294
+ - **Организация автора** организация, с которой связан автор
295
+ - **Тип диссертации** вид диссертации
296
+ - **Дата создания / регистрации** — дата создания / регистрации работы
297
+ - **Аннотация** — краткое содержание диссертации
298
  """
299
  )
300
  else:
301
+ st.info("Введите запрос в поле выше и нажмите кнопку «Поиск».")