Upload 2 files
Browse files- app.py +60 -0
- requirements.txt +1 -0
app.py
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
import json
|
| 3 |
+
import random
|
| 4 |
+
import re
|
| 5 |
+
from difflib import get_close_matches
|
| 6 |
+
|
| 7 |
+
try:
|
| 8 |
+
with open("patterns.json", "r", encoding="utf-8") as f:
|
| 9 |
+
PATTERNS = json.load(f)
|
| 10 |
+
except Exception as e:
|
| 11 |
+
PATTERNS = {"default": [f"Ошибка загрузки: {e}"]}
|
| 12 |
+
|
| 13 |
+
# === Логика обработки ===
|
| 14 |
+
KEYWORDS = {
|
| 15 |
+
"привет": ["привет", "здравствуй", "хай", "прив"],
|
| 16 |
+
"как дела": ["дела", "как ты", "настроение"],
|
| 17 |
+
"имя": ["имя", "кто ты", "зовут"],
|
| 18 |
+
"школа": ["школа", "урок", "задача", "математика"],
|
| 19 |
+
"пока": ["пока", "выход", "до свидания"],
|
| 20 |
+
"knowledge": ["что такое", "как приготовить", "расскажи про"]
|
| 21 |
+
}
|
| 22 |
+
|
| 23 |
+
def preprocess(text):
|
| 24 |
+
return re.sub(r'[^а-яё\s]', ' ', text.lower()).strip()
|
| 25 |
+
|
| 26 |
+
def find_response(user_input):
|
| 27 |
+
clean = preprocess(user_input)
|
| 28 |
+
if not clean:
|
| 29 |
+
return "Пожалуйста, напиши что-нибудь!"
|
| 30 |
+
if any(w in clean for w in ["пока", "выход", "стоп"]):
|
| 31 |
+
return "До свидания! Возвращайся скорее! 😊"
|
| 32 |
+
|
| 33 |
+
knowledge = PATTERNS.get("knowledge", {})
|
| 34 |
+
if clean in knowledge:
|
| 35 |
+
return knowledge[clean]
|
| 36 |
+
matches = get_close_matches(clean, knowledge.keys(), n=1, cutoff=0.6)
|
| 37 |
+
if matches:
|
| 38 |
+
return knowledge[matches[0]]
|
| 39 |
+
|
| 40 |
+
all_keywords = []
|
| 41 |
+
keyword_to_intent = {}
|
| 42 |
+
for intent, words in KEYWORDS.items():
|
| 43 |
+
if intent == "knowledge": continue
|
| 44 |
+
for word in words:
|
| 45 |
+
all_keywords.append(word)
|
| 46 |
+
keyword_to_intent[word] = intent
|
| 47 |
+
|
| 48 |
+
for token in clean.split():
|
| 49 |
+
matches = get_close_matches(token, all_keywords, n=1, cutoff=0.6)
|
| 50 |
+
if matches:
|
| 51 |
+
return random.choice(PATTERNS[keyword_to_intent[matches[0]]])
|
| 52 |
+
return random.choice(PATTERNS["default"])
|
| 53 |
+
|
| 54 |
+
gr.Interface(
|
| 55 |
+
fn=find_response,
|
| 56 |
+
inputs="text",
|
| 57 |
+
outputs="text",
|
| 58 |
+
title="Newton Micro - теперь умнее! ;)",
|
| 59 |
+
description="Сверхлёгкий ИИ на Python. Поддерживает опечатки и рецепты."
|
| 60 |
+
).launch()
|
requirements.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
gradio>=2.0,<3.0
|