SkillForge45's picture
Create model.py
7e24f21 verified
import numpy as np
import random
import re
from bs4 import BeautifulSoup
import requests
import wikipedia
class NeuralNet:
def __init__(self, input_size, hidden_size, output_size):
self.Wxh = np.random.randn(hidden_size, input_size) * 0.01
self.Whh = np.random.randn(hidden_size, hidden_size) * 0.01
self.Why = np.random.randn(output_size, hidden_size) * 0.01
self.bh = np.zeros((hidden_size, 1))
self.by = np.zeros((output_size, 1))
def forward(self, inputs, h_prev):
h = np.tanh(np.dot(self.Wxh, inputs) + np.dot(self.Whh, h_prev) + self.bh)
y = np.dot(self.Why, h) + self.by
return y, h
def train(self, X, Y, learning_rate=0.01, epochs=1000):
for epoch in range(epochs):
loss = 0
h_prev = np.zeros((self.Whh.shape[0], 1))
for i in range(len(X)):
x = np.array(X[i]).reshape(-1, 1)
y_true = np.array(Y[i]).reshape(-1, 1)
# Forward pass
y_pred, h_prev = self.forward(x, h_prev)
# Compute loss
loss += np.sum((y_pred - y_true) ** 2)
# Backward pass
dy = y_pred - y_true
dWhy = np.dot(dy, h_prev.T)
dby = dy
dh = np.dot(self.Why.T, dy)
dh_raw = (1 - h_prev ** 2) * dh
dWxh = np.dot(dh_raw, x.T)
dWhh = np.dot(dh_raw, h_prev.T)
dbh = dh_raw
# Update weights
self.Wxh -= learning_rate * dWxh
self.Whh -= learning_rate * dWhh
self.Why -= learning_rate * dWhy
self.bh -= learning_rate * dbh
self.by -= learning_rate * dby
if epoch % 100 == 0:
print(f'Epoch {epoch}, Loss: {loss}')
class MaestroAssistant:
def __init__(self):
self.wake_word = "эй маэстро"
self.vocab = {}
self.intents = {
'greet': ['привет', 'здравствуй', 'добрый день'],
'search': ['найди', 'поищи', 'что такое', 'кто такой'],
'joke': ['расскажи шутку', 'пошути', 'анекдот'],
'time': ['который час', 'сколько времени', 'время']
}
self.responses = {
'greet': ['Приветствую!', 'Здравствуйте!', 'Привет! Чем могу помочь?'],
'search': ['Ищу информацию...', 'Сейчас найду...', 'Одну секунду...'],
'joke': ['Я не умею шутить, но могу найти сайт для генерации шуток!', 'Я не создавать шутки, но могу найти сайт с ними, просто скажите: Эй Маэстро, найди сайт со смешными шутками!'],
'default': ['Не понял вас', 'Повторите, пожалуйста', 'Я вас не понял, скажите повторно!']
}
self.init_vocab()
input_size = len(self.vocab)
hidden_size = 64
output_size = len(self.intents)
self.nn = NeuralNet(input_size, hidden_size, output_size)
self.train()
def init_vocab(self):
words = set()
for intent in self.intents.values():
for phrase in intent:
words.update(phrase.split())
self.vocab = {word: i for i, word in enumerate(words)}
def text_to_vector(self, text):
vector = np.zeros(len(self.vocab))
for word in text.split():
if word in self.vocab:
vector[self.vocab[word]] += 1
return vector
def train(self):
X = []
y = []
for i, (intent, phrases) in enumerate(self.intents.items()):
for phrase in phrases:
X.append(self.text_to_vector(phrase))
y_vec = np.zeros(len(self.intents))
y_vec[i] = 1
y.append(y_vec)
X = np.array(X)
y = np.array(y)
self.nn.train(X, y, epochs=1000, learning_rate=0.01)
def predict_intent(self, text):
vector = self.text_to_vector(text)
output, _ = self.nn.forward(vector.reshape(-1, 1), np.zeros((self.nn.Whh.shape[0], 1)))
intent_idx = np.argmax(output)
return list(self.intents.keys())[intent_idx]
def handle_command(self, command):
if not command.startswith(self.wake_word):
return None
command = command[len(self.wake_word):].strip()
intent = self.predict_intent(command)
if intent == 'greet':
return random.choice(self.responses['greet'])
elif intent == 'joke':
return random.choice(self.responses['joke'])
elif intent == 'search':
query = re.sub(r'(найди|поищи|что такое|кто такой)', '', command).strip()
return self.search(query)
else:
return random.choice(self.responses['default'])
def search(self, query):
try:
wikipedia.set_lang('ru')
result = wikipedia.summary(query, sentences=2)
return f"Вот что я нашел в Википедии: {result}"
except:
pass
try:
url = f"https://www.google.com/search?q={query}"
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
result = soup.find('div', class_='BNeawe').text
return f"Вот что я нашел: {result[:200]}..."
except Exception as e:
return f"Не удалось найти информацию: {str(e)}"