import numpy as np import pandas as pd import requests from io import StringIO from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity class ChatBotFromWebDataset: def __init__(self, dataset_url): self.dataset_url = dataset_url self.qa_pairs = {} # {"вопрос": "ответ"} self.vectorizer = TfidfVectorizer() self.X = None # Векторизованные вопросы self.load_dataset() # Загружаем датасет при инициализации self.train() # Обучаемся на нём def load_dataset(self): """Загружает датасет с сайта (CSV/JSON)""" try: response = requests.get(self.dataset_url) response.raise_for_status() # Если CSV (можно адаптировать под JSON) data = pd.read_csv(StringIO(response.text)) # Пример: датасет в формате ["question", "answer"] for _, row in data.iterrows(): self.qa_pairs[row["question"]] = row["answer"] print(f"Загружено {len(self.qa_pairs)} пар вопрос-ответ.") except Exception as e: print(f"Ошибка загрузки датасета: {e}") self.qa_pairs = {} def train(self): """Векторизует вопросы для поиска похожих""" if not self.qa_pairs: print("Нет данных для обучения!") return questions = list(self.qa_pairs.keys()) self.X = self.vectorizer.fit_transform(questions) def predict(self, user_input): """Находит ближайший вопрос в датасете и возвращает ответ""" if not self.qa_pairs: return "Я не обучен (датасет не загружен)." # Векторизуем вопрос пользователя user_vec = self.vectorizer.transform([user_input]) # Ищем ближайший вопрос из датасета similarities = cosine_similarity(user_vec, self.X) best_match_idx = np.argmax(similarities) best_match_score = similarities[0, best_match_idx] if best_match_score > 0.6: # Порог схожести best_question = list(self.qa_pairs.keys())[best_match_idx] return self.qa_pairs[best_question] else: return "Я не знаю, что ответить." # Можно добавить обучение на лету def main(): # Пример датасета (можно заменить на любой CSV/JSON с вопросами и ответами) dataset_url = "https://raw.githubusercontent.com/user/repo/main/qa_dataset.csv" bot = ChatBotFromWebDataset(dataset_url) print("Чат-бот (обучен на датасете с сайта). Введите 'стоп' для выхода.") while True: user_input = input("Вы: ").strip() if user_input.lower() == "стоп": break reply = bot.predict(user_input) print(f"Бот: {reply}") if __name__ == "__main__": main()