|
|
import gradio as gr |
|
|
import json |
|
|
import random |
|
|
import re |
|
|
from difflib import get_close_matches |
|
|
|
|
|
try: |
|
|
with open("patterns.json", "r", encoding="utf-8") as f: |
|
|
PATTERNS = json.load(f) |
|
|
except Exception as e: |
|
|
PATTERNS = {"default": [f"Ошибка загрузки: {e}"]} |
|
|
|
|
|
|
|
|
KEYWORDS = { |
|
|
"привет": ["привет", "здравствуй", "хай", "прив"], |
|
|
"как дела": ["дела", "как ты", "настроение"], |
|
|
"имя": ["имя", "кто ты", "зовут"], |
|
|
"школа": ["школа", "урок", "задача", "математика"], |
|
|
"пока": ["пока", "выход", "до свидания"], |
|
|
"knowledge": ["что такое", "как приготовить", "расскажи про"] |
|
|
} |
|
|
|
|
|
def preprocess(text): |
|
|
return re.sub(r'[^а-яё\s]', ' ', text.lower()).strip() |
|
|
|
|
|
def find_response(user_input): |
|
|
clean = preprocess(user_input) |
|
|
if not clean: |
|
|
return "Пожалуйста, напиши что-нибудь!" |
|
|
if any(w in clean for w in ["пока", "выход", "стоп"]): |
|
|
return "До свидания! Возвращайся скорее! 😊" |
|
|
|
|
|
knowledge = PATTERNS.get("knowledge", {}) |
|
|
if clean in knowledge: |
|
|
return knowledge[clean] |
|
|
matches = get_close_matches(clean, knowledge.keys(), n=1, cutoff=0.6) |
|
|
if matches: |
|
|
return knowledge[matches[0]] |
|
|
|
|
|
all_keywords = [] |
|
|
keyword_to_intent = {} |
|
|
for intent, words in KEYWORDS.items(): |
|
|
if intent == "knowledge": continue |
|
|
for word in words: |
|
|
all_keywords.append(word) |
|
|
keyword_to_intent[word] = intent |
|
|
|
|
|
for token in clean.split(): |
|
|
matches = get_close_matches(token, all_keywords, n=1, cutoff=0.6) |
|
|
if matches: |
|
|
return random.choice(PATTERNS[keyword_to_intent[matches[0]]]) |
|
|
return random.choice(PATTERNS["default"]) |
|
|
|
|
|
gr.Interface( |
|
|
fn=find_response, |
|
|
inputs="text", |
|
|
outputs="text", |
|
|
title="Newton Micro - теперь умнее! ;)", |
|
|
description="Сверхлёгкий ИИ на Python. Поддерживает опечатки и рецепты." |
|
|
).launch() |