vkr-chat-bot / app.py
Wplotnikow's picture
Update app.py
2b2154a verified
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()