SkillForge45 commited on
Commit
728a506
·
verified ·
1 Parent(s): 624e949

Create model.py

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