Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import glob | |
| from docx import Document | |
| def get_all_text_from_docx(): | |
| docx_list = glob.glob("*.docx") | |
| if not docx_list: | |
| return ["Файл .docx с методичкой не найден!"] | |
| doc = Document(docx_list[0]) | |
| blocks = [] | |
| # Извлекаем все нестандартные абзацы (пропускаем короткие технические, например '4') | |
| for p in doc.paragraphs: | |
| txt = p.text.strip() | |
| if txt and not (len(txt) <= 3 and txt.isdigit()): | |
| blocks.append(txt) | |
| # Вытаскиваем ТЕКСТ из ТАБЛИЦ. | |
| for table in doc.tables: | |
| for row in table.rows: | |
| # склеиваем все ячейки строки таблицы через " | " | |
| row_text = " | ".join(cell.text.strip() for cell in row.cells if cell.text.strip()) | |
| if row_text: # отсекаем совсем пустые строки | |
| blocks.append(row_text) | |
| # дополнительно: удаляем дубли (могут встречаться в Word после копирования) | |
| seen = set() | |
| uniq_blocks = [] | |
| for b in blocks: | |
| if b not in seen: | |
| uniq_blocks.append(b) | |
| seen.add(b) | |
| return uniq_blocks | |
| paragraphs = get_all_text_from_docx() | |
| # Проверьте, сколько блоков реально читается! | |
| print("Блоков для поиска:", len(paragraphs)) | |
| from sklearn.feature_extraction.text import TfidfVectorizer | |
| from sklearn.metrics.pairwise import cosine_similarity | |
| vectorizer = TfidfVectorizer().fit(paragraphs) | |
| paragraph_matrix = vectorizer.transform(paragraphs) | |
| def search_faq(question): | |
| if not question.strip(): | |
| return "Пожалуйста, введите вопрос." | |
| if len(paragraphs) < 2: | |
| return "Ошибка: база знаний пуста или слишком мала. Проверьте содержимое .docx или перезагрузите файл с материалами." | |
| user_vec = vectorizer.transform([question]) | |
| sims = cosine_similarity(user_vec, paragraph_matrix)[0] | |
| idx = sims.argmax() | |
| score = sims[idx] | |
| if score < 0.12: | |
| return "Не найдено подходящего ответа. Попробуйте иначе сформулировать вопрос или обратитесь к преподавателю." | |
| return paragraphs[idx] | |
| EXAMPLES = [ | |
| "Какие требования к объему магистерской диссертации?", | |
| "Как оформить список литературы?", | |
| "Какие сроки сдачи и защиты ВКР?", | |
| "Что должно быть во введении?", | |
| "Какой процент оригинальности требуется?" | |
| ] | |
| with gr.Blocks() as demo: | |
| gr.Markdown( | |
| """ | |
| # Чат-бот по ВКР на базе вашей методички | |
| Задайте вопрос — бот ищет точный ответ в вашем документе, в том числе в таблицах! | |
| """ | |
| ) | |
| question = gr.Textbox(label="Ваш вопрос", lines=2) | |
| ask_btn = gr.Button("Получить ответ") | |
| answer = gr.Textbox(label="Ответ", lines=8, interactive=False) | |
| ask_btn.click(search_faq, question, answer) | |
| question.submit(search_faq, question, answer) | |
| gr.Markdown("#### Примеры вопросов:") | |
| gr.Examples(EXAMPLES, inputs=question) | |
| gr.Markdown(""" | |
| --- | |
| ### Контакты (заполните сами) | |
| Преподаватель: ___________________ | |
| Email: ___________________________ | |
| Кафедра: _________________________ | |
| """) | |
| demo.launch() | |