SkillForge45 commited on
Commit
7e24f21
·
verified ·
1 Parent(s): a57b4ec

Create model.py

Browse files
Files changed (1) hide show
  1. model.py +165 -0
model.py ADDED
@@ -0,0 +1,165 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import numpy as np
3
+ import random
4
+ import re
5
+ from bs4 import BeautifulSoup
6
+ import requests
7
+ import wikipedia
8
+
9
+ class NeuralNet:
10
+ def __init__(self, input_size, hidden_size, output_size):
11
+ self.Wxh = np.random.randn(hidden_size, input_size) * 0.01
12
+ self.Whh = np.random.randn(hidden_size, hidden_size) * 0.01
13
+ self.Why = np.random.randn(output_size, hidden_size) * 0.01
14
+ self.bh = np.zeros((hidden_size, 1))
15
+ self.by = np.zeros((output_size, 1))
16
+
17
+ def forward(self, inputs, h_prev):
18
+ h = np.tanh(np.dot(self.Wxh, inputs) + np.dot(self.Whh, h_prev) + self.bh)
19
+ y = np.dot(self.Why, h) + self.by
20
+ return y, h
21
+
22
+ def train(self, X, Y, learning_rate=0.01, epochs=1000):
23
+ for epoch in range(epochs):
24
+ loss = 0
25
+ h_prev = np.zeros((self.Whh.shape[0], 1))
26
+
27
+ for i in range(len(X)):
28
+ x = np.array(X[i]).reshape(-1, 1)
29
+ y_true = np.array(Y[i]).reshape(-1, 1)
30
+
31
+ # Forward pass
32
+ y_pred, h_prev = self.forward(x, h_prev)
33
+
34
+ # Compute loss
35
+ loss += np.sum((y_pred - y_true) ** 2)
36
+
37
+ # Backward pass
38
+ dy = y_pred - y_true
39
+ dWhy = np.dot(dy, h_prev.T)
40
+ dby = dy
41
+
42
+ dh = np.dot(self.Why.T, dy)
43
+ dh_raw = (1 - h_prev ** 2) * dh
44
+
45
+ dWxh = np.dot(dh_raw, x.T)
46
+ dWhh = np.dot(dh_raw, h_prev.T)
47
+ dbh = dh_raw
48
+
49
+ # Update weights
50
+ self.Wxh -= learning_rate * dWxh
51
+ self.Whh -= learning_rate * dWhh
52
+ self.Why -= learning_rate * dWhy
53
+ self.bh -= learning_rate * dbh
54
+ self.by -= learning_rate * dby
55
+
56
+ if epoch % 100 == 0:
57
+ print(f'Epoch {epoch}, Loss: {loss}')
58
+
59
+ class MaestroAssistant:
60
+ def __init__(self):
61
+ self.wake_word = "эй маэстро"
62
+ self.vocab = {}
63
+ self.intents = {
64
+ 'greet': ['привет', 'здравствуй', 'добрый день'],
65
+ 'search': ['найди', 'поищи', 'что такое', 'кто такой'],
66
+ 'joke': ['расскажи шутку', 'пошути', 'анекдот'],
67
+ 'time': ['который час', 'сколько времени', 'время']
68
+ }
69
+ self.responses = {
70
+ 'greet': ['Приветствую!', 'Здравствуйте!', 'Привет! Чем могу помочь?'],
71
+ 'search': ['Ищу информацию...', 'Сейчас найду...', 'Одну секунду...'],
72
+ 'joke': ['Я не умею шутить, но могу найти сайт для генерации шуток!', 'Я не создавать шутки, но могу найти сайт с ними, просто скажите: Эй Маэстро, найди сайт со смешными шутками!'],
73
+ 'default': ['Не понял вас', 'Повторите, пожалуйста', 'Я вас не понял, скажите повторно!']
74
+ }
75
+
76
+
77
+ self.init_vocab()
78
+ input_size = len(self.vocab)
79
+ hidden_size = 64
80
+ output_size = len(self.intents)
81
+ self.nn = NeuralNet(input_size, hidden_size, output_size)
82
+
83
+
84
+ self.train()
85
+
86
+ def init_vocab(self):
87
+
88
+ words = set()
89
+ for intent in self.intents.values():
90
+ for phrase in intent:
91
+ words.update(phrase.split())
92
+ self.vocab = {word: i for i, word in enumerate(words)}
93
+
94
+ def text_to_vector(self, text):
95
+
96
+ vector = np.zeros(len(self.vocab))
97
+ for word in text.split():
98
+ if word in self.vocab:
99
+ vector[self.vocab[word]] += 1
100
+ return vector
101
+
102
+ def train(self):
103
+
104
+ X = []
105
+ y = []
106
+ for i, (intent, phrases) in enumerate(self.intents.items()):
107
+ for phrase in phrases:
108
+ X.append(self.text_to_vector(phrase))
109
+ y_vec = np.zeros(len(self.intents))
110
+ y_vec[i] = 1
111
+ y.append(y_vec)
112
+
113
+
114
+ X = np.array(X)
115
+ y = np.array(y)
116
+
117
+
118
+ self.nn.train(X, y, epochs=1000, learning_rate=0.01)
119
+
120
+ def predict_intent(self, text):
121
+
122
+ vector = self.text_to_vector(text)
123
+ output, _ = self.nn.forward(vector.reshape(-1, 1), np.zeros((self.nn.Whh.shape[0], 1)))
124
+ intent_idx = np.argmax(output)
125
+ return list(self.intents.keys())[intent_idx]
126
+
127
+ def handle_command(self, command):
128
+
129
+ if not command.startswith(self.wake_word):
130
+ return None
131
+
132
+ command = command[len(self.wake_word):].strip()
133
+ intent = self.predict_intent(command)
134
+
135
+ if intent == 'greet':
136
+ return random.choice(self.responses['greet'])
137
+ elif intent == 'joke':
138
+ return random.choice(self.responses['joke'])
139
+ elif intent == 'search':
140
+ query = re.sub(r'(найди|поищи|что такое|кто такой)', '', command).strip()
141
+ return self.search(query)
142
+ else:
143
+ return random.choice(self.responses['default'])
144
+
145
+ def search(self, query):
146
+
147
+ try:
148
+ wikipedia.set_lang('ru')
149
+ result = wikipedia.summary(query, sentences=2)
150
+ return f"Вот что я нашел в Википедии: {result}"
151
+ except:
152
+ pass
153
+
154
+
155
+ try:
156
+ url = f"https://www.google.com/search?q={query}"
157
+ headers = {'User-Agent': 'Mozilla/5.0'}
158
+ response = requests.get(url, headers=headers)
159
+ soup = BeautifulSoup(response.text, 'html.parser')
160
+
161
+
162
+ result = soup.find('div', class_='BNeawe').text
163
+ return f"Вот что я нашел: {result[:200]}..."
164
+ except Exception as e:
165
+ return f"Не удалось найти информацию: {str(e)}"