SkillForge45 commited on
Commit
9c5471e
·
verified ·
1 Parent(s): 58f7dac

Upload SkillForge-1.1-RU.py

Browse files

New Russion SkillForge model:
-Web Search

Files changed (1) hide show
  1. SkillForge-1.1-RU.py +246 -0
SkillForge-1.1-RU.py ADDED
@@ -0,0 +1,246 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import pandas as pd
3
+ import requests
4
+ from io import StringIO
5
+ from sklearn.feature_extraction.text import TfidfVectorizer
6
+ from sklearn.metrics.pairwise import cosine_similarity
7
+ import speech_recognition as sr
8
+ import pyttsx3
9
+ from googlesearch import search
10
+ from bs4 import BeautifulSoup
11
+ import urllib.request
12
+ from urllib.parse import quote
13
+
14
+ class HybridChatBot:
15
+ def __init__(self, dataset_url=None):
16
+ self.dataset_url = dataset_url
17
+ self.qa_pairs = {}
18
+ self.vectorizer = TfidfVectorizer()
19
+ self.X = None
20
+ self.recognizer = sr.Recognizer()
21
+ self.engine = pyttsx3.init()
22
+
23
+ # Настройки голосового движка
24
+ voices = self.engine.getProperty('voices')
25
+ self.engine.setProperty('voice', voices[0].id)
26
+ self.engine.setProperty('rate', 150)
27
+
28
+ if dataset_url:
29
+ self.load_dataset()
30
+ self.train()
31
+
32
+ def load_dataset(self):
33
+ """Загрузка датасета с веб-ресурса"""
34
+ try:
35
+ response = requests.get(self.dataset_url)
36
+ response.raise_for_status()
37
+
38
+ if self.dataset_url.endswith('.csv'):
39
+ data = pd.read_csv(StringIO(response.text))
40
+ elif self.dataset_url.endswith('.json'):
41
+ data = pd.read_json(StringIO(response.text))
42
+ else:
43
+ print("Формат файла не поддерживается")
44
+ return
45
+
46
+ for _, row in data.iterrows():
47
+ self.qa_pairs[row["question"].lower()] = row["answer"]
48
+
49
+ print(f"Загружено {len(self.qa_pairs)} пар вопрос-ответ")
50
+
51
+ except Exception as e:
52
+ print(f"Ошибка загрузки датасета: {e}")
53
+
54
+ def train(self):
55
+ """Обучение модели на загруженных данных"""
56
+ if not self.qa_pairs:
57
+ print("Нет данных для обучения!")
58
+ return
59
+
60
+ questions = list(self.qa_pairs.keys())
61
+ self.X = self.vectorizer.fit_transform(questions)
62
+ print("Модель обучена на загруженных данных")
63
+
64
+ def add_qa_pair(self, question, answer):
65
+ """Добавление новой пары вопрос-ответ"""
66
+ self.qa_pairs[question.lower()] = answer
67
+ self.train()
68
+
69
+ def web_search(self, query, num_results=3):
70
+ """Выполнение веб-поиска и извлечение информации"""
71
+ try:
72
+ print(f"\nВыполняю поиск в интернете: {query}")
73
+ search_results = []
74
+
75
+ # Выполняем поиск в Google
76
+ for url in search(query, num_results=num_results, lang='ru'):
77
+ try:
78
+ # Получаем содержимое страницы
79
+ req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
80
+ with urllib.request.urlopen(req, timeout=5) as response:
81
+ html = response.read()
82
+
83
+ # Парсим HTML
84
+ soup = BeautifulSoup(html, 'html.parser')
85
+
86
+ # Удаляем ненужные элементы (скрипты, стили и т.д.)
87
+ for script in soup(["script", "style", "iframe", "nav", "footer"]):
88
+ script.extract()
89
+
90
+ # Получаем текст страницы
91
+ text = soup.get_text(separator=' ', strip=True)
92
+ text = ' '.join(text.split()[:200]) # Берем первые 200 слов
93
+
94
+ search_results.append({
95
+ 'url': url,
96
+ 'content': text
97
+ })
98
+
99
+ except Exception as e:
100
+ print(f"Ошибка при обработке {url}: {e}")
101
+ continue
102
+
103
+ return search_results
104
+
105
+ except Exception as e:
106
+ print(f"Ошибка при выполнении поиска: {e}")
107
+ return None
108
+
109
+ def get_response(self, user_input):
110
+ """Получение ответа на ввод пользователя"""
111
+ if not self.qa_pairs:
112
+ return "Я еще не обучен. Пожалуйста, добавьте вопросы и ответы."
113
+
114
+ # Проверяем, хочет ли пользователь выполнить веб-поиск
115
+ if "найди в интернете" in user_input.lower() or "найди в интернете" in user_input.lower():
116
+ query = user_input.replace("найди в интернете", "").replace("найди в интернете", "").strip()
117
+ search_results = self.web_search(query)
118
+ if search_results:
119
+ response = "Вот что я нашел в интернете:\n"
120
+ for i, result in enumerate(search_results, 1):
121
+ response += f"\n{i}. {result['content']}\n(Источник: {result['url']})\n"
122
+ return response[:2000] # Ограничиваем длину ответа
123
+ else:
124
+ return "Не удалось найти информацию в интернете."
125
+
126
+ # Обычный поиск в базе вопросов
127
+ user_vec = self.vectorizer.transform([user_input.lower()])
128
+ similarities = cosine_similarity(user_vec, self.X)
129
+ best_match_idx = np.argmax(similarities)
130
+ best_match_score = similarities[0, best_match_idx]
131
+
132
+ if best_match_score > 0.5:
133
+ best_question = list(self.qa_pairs.keys())[best_match_idx]
134
+ return self.qa_pairs[best_question]
135
+ else:
136
+ return "Я не знаю ответ на этот вопрос. Хотите, чтобы я поискал в интернете? (Скажите 'найди в интернете...')"
137
+
138
+ def text_to_speech(self, text):
139
+ """Озвучивание текста"""
140
+ self.engine.say(text)
141
+ self.engine.runAndWait()
142
+
143
+ def speech_to_text(self):
144
+ """Распознавание голоса с микрофона"""
145
+ with sr.Microphone() as source:
146
+ print("\nГоворите сейчас...")
147
+ self.recognizer.adjust_for_ambient_noise(source)
148
+ try:
149
+ audio = self.recognizer.listen(source, timeout=5)
150
+ text = self.recognizer.recognize_google(audio, language="ru-RU")
151
+ print(f"Распознано: {text}")
152
+ return text
153
+ except sr.UnknownValueError:
154
+ print("Речь не распознана")
155
+ return None
156
+ except sr.RequestError:
157
+ print("Ошибка сервиса распознавания")
158
+ return None
159
+ except sr.WaitTimeoutError:
160
+ print("Время ожидания истекло")
161
+ return None
162
+
163
+ def run(self):
164
+ """Улучшенный интерфейс взаимодействия"""
165
+ print("\n" + "="*50)
166
+ print("ДОБРО ПОЖАЛОВАТЬ В ИНТЕЛЛЕКТУАЛЬНЫЙ ЧАТ-БОТ".center(50))
167
+ print("="*50)
168
+
169
+ current_mode = "текст"
170
+ while True:
171
+ print("\n" + "-"*50)
172
+ print(f"Текущий режим ввода: {current_mode.upper()}")
173
+ print("[1] Отправить текстовое сообщение")
174
+ print("[2] Говорить с ботом голосом")
175
+ print("[3] Переключить режим ввода")
176
+ print("[4] Обучить бота новому ответу")
177
+ print("[5] Поиск в интернете")
178
+ print("[6] Выход")
179
+
180
+ try:
181
+ choice = input("Выберите действие (1-6): ").strip()
182
+
183
+ if choice == "1":
184
+ user_input = input("\nВаше сообщение: ")
185
+ if user_input.lower() in ["выход", "стоп"]:
186
+ break
187
+
188
+ response = self.get_response(user_input)
189
+ if response:
190
+ print(f"\nБот: {response}")
191
+ self.text_to_speech(response)
192
+ else:
193
+ print("\nБот: Я не знаю что ответить. Хотите научить меня?")
194
+
195
+ elif choice == "2":
196
+ user_input = self.speech_to_text()
197
+ if user_input:
198
+ if user_input.lower() in ["выход", "стоп"]:
199
+ break
200
+
201
+ response = self.get_response(user_input)
202
+ if response:
203
+ print(f"\nБот: {response}")
204
+ self.text_to_speech(response)
205
+ else:
206
+ print("\nБот: Я не знаю что ответить на это.")
207
+ self.text_to_speech("Я не знаю что ответить на это")
208
+
209
+ elif choice == "3":
210
+ current_mode = "голос" if current_mode == "текст" else "текст"
211
+ print(f"\nРежим изменен на: {current_mode.upper()}")
212
+
213
+ elif choice == "4":
214
+ print("\nОбучение бота:")
215
+ question = input("Введите вопрос: ")
216
+ answer = input("Введите ответ: ")
217
+ self.add_qa_pair(question, answer)
218
+ print("Бот успешно обучен!")
219
+
220
+ elif choice == "5":
221
+ query = input("\nВведите запрос для поиска в интернете: ")
222
+ search_results = self.web_search(query)
223
+ if search_results:
224
+ print("\nРезультаты поиска:")
225
+ for i, result in enumerate(search_results, 1):
226
+ print(f"\n{i}. {result['content']}\n(Источник: {result['url']})\n")
227
+ else:
228
+ print("\nНичего не найдено.")
229
+
230
+ elif choice == "6":
231
+ print("\nЗавершение работы...")
232
+ break
233
+
234
+ else:
235
+ print("\nПожалуйста, выберите вариант от 1 до 6")
236
+
237
+ except KeyboardInterrupt:
238
+ print("\nЗавершение работы...")
239
+ break
240
+
241
+ if __name__ == "__main__":
242
+ # Пример URL датасета (можно заменить на свой)
243
+ DATASET_URL = "https://raw.githubusercontent.com/user/repo/main/qa_data.csv"
244
+
245
+ bot = HybridChatBot(DATASET_URL)
246
+ bot.run()