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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +60 -84
app.py CHANGED
@@ -13,7 +13,7 @@ from huggingface_hub import hf_hub_download
13
  # ==========================
14
 
15
  st.set_page_config(
16
- page_title="Поиск релевантных диссертаций",
17
  layout="wide",
18
  )
19
 
@@ -45,12 +45,12 @@ COLUMN_LABELS_RU = {
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
 
@@ -187,8 +187,11 @@ def run_search(query: str, top_k: int):
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)
@@ -196,106 +199,79 @@ def run_search(query: str, top_k: int):
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
  # ==========================
209
  # UI НА STREAMLIT
210
  # ==========================
211
 
212
- st.title("Поиск релевантных диссертаций")
213
- st.caption(
214
- "Введите текстовый запрос на естественном языке, например: "
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:
268
- st.dataframe(
269
- df_res,
270
- use_container_width=True,
271
- )
272
 
273
- if excel_bytes is not None:
274
- st.download_button(
275
- label="💾 Скачать результаты в Excel",
276
- data=excel_bytes,
277
- file_name="search_results.xlsx",
278
- mime=(
279
- "application/vnd.openxmlformats-officedocument."
280
- "spreadsheetml.sheet"
281
- ),
282
- )
283
-
284
- with tab_info:
285
- st.markdown(
286
- """
287
- **Пояснения к полям:**
288
-
289
- - **№** — порядковый номер результата
290
- - **Сходство** — косинусное сходство запроса с документом (чем выше, тем релевантнее)
291
- - **Регистрационный номер** — регистрационный номер диссертации
292
- - **Название работы** — полное название диссертации
293
- - **Фамилия / Имя / Отчество автора** — ФИО автора
294
- - **Организация автора** — организация, с которой связан автор
295
- - **Тип диссертации** — вид диссертации
296
- - **Дата создания / регистрации** — дата создания / регистрации работы
297
- - **Аннотация** — краткое содержание диссертации
298
- """
299
  )
300
  else:
301
- st.info("Введите запрос в поле выше и нажмите кнопку «Поиск».")
 
13
  # ==========================
14
 
15
  st.set_page_config(
16
+ page_title="Поиск диссертаций",
17
  layout="wide",
18
  )
19
 
 
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
 
 
187
  query = query.strip()
188
  if not query:
189
  empty_df = pd.DataFrame(columns=["№", "score"] + COLUMNS_ORDER)
190
+ empty_df_ru = empty_df.rename(columns=COLUMN_LABELS_RU)
191
+ # для отображения: ставим № как индекс, чтобы не было двойной нумерации
192
+ df_display = empty_df_ru.set_index("№") if "№" in empty_df_ru.columns else empty_df_ru
193
+
194
+ return df_display, None
195
 
196
  results = search_core(query, top_k)
197
  df_res = build_result_df(results)
 
199
  # Переименовываем колонки в русский вариант
200
  df_res_ru = df_res.rename(columns=COLUMN_LABELS_RU)
201
 
202
+ # Для отображения: используем как индекс, чтобы не было второй нумерации
203
+ df_display = df_res_ru.set_index("№")
204
+
205
+ # Формируем Excel в памяти (с русскими заголовками и явным столбцом №)
206
  output = io.BytesIO()
207
  with pd.ExcelWriter(output, engine="xlsxwriter") as writer:
208
  df_res_ru.to_excel(writer, index=False)
209
  output.seek(0)
210
 
211
+ return df_display, output
212
 
213
 
214
  # ==========================
215
  # UI НА STREAMLIT
216
  # ==========================
217
 
218
+ st.title("Поиск диссертаций")
219
+
220
+ # 4) Слайдер между заголовком и полем ввода
221
+ top_k = st.slider(
222
+ "Сколько результатов показать",
223
+ min_value=1,
224
+ max_value=100,
225
+ value=20,
226
+ step=1,
227
  )
228
 
229
+ # 5) Поле ввода: высота ~4 строки (text_area)
230
+ query = st.text_area(
231
+ "Введите запрос",
232
+ height=120, # примерно 4 строки
233
+ placeholder="Например: пластификаторы для самоуплотняющихся бетонов",
234
+ key="query",
235
+ )
 
 
 
 
 
 
 
 
 
236
 
237
+ # Кнопки под полем поиска
238
+ col1, col2 = st.columns([1, 1])
239
+ with col1:
240
+ do_search = st.button("🔍 Поиск", type="primary")
241
+ with col2:
242
+ clear = st.button("🧹 Очистить")
 
 
 
 
 
 
 
 
243
 
244
+ # 3) Корректная очистка: не трогаем конкретные ключи после создания виджетов,
245
+ # а чистим всё состояние и перезапускаем скрипт
246
+ if clear:
247
+ st.session_state.clear()
248
+ st.experimental_rerun()
249
 
250
  # ---- ОСНОВНАЯ ОБЛАСТЬ РЕЗУЛЬТАТОВ ----
251
  if do_search:
252
  with st.spinner("Идёт поиск по базе диссертаций..."):
253
+ df_res, excel_bytes = run_search(query, top_k)
254
 
255
  if df_res.empty:
256
  st.warning("Ничего не найдено. Попробуйте изменить формулировку запроса.")
257
  else:
258
  st.success(f"Найдено записей: {len(df_res)}")
259
 
260
+ # 6) Без вкладок — просто таблица + кнопка скачивания
261
+ st.dataframe(
262
+ df_res,
263
+ use_container_width=True,
264
+ )
 
 
265
 
266
+ if excel_bytes is not None:
267
+ st.download_button(
268
+ label="💾 Скачать результаты в Excel",
269
+ data=excel_bytes,
270
+ file_name="search_results.xlsx",
271
+ mime=(
272
+ "application/vnd.openxmlformats-officedocument."
273
+ "spreadsheetml.sheet"
274
+ ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
275
  )
276
  else:
277
+ st.info("Введите запрос выше и нажмите кнопку «Поиск».")