| | 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() |
| | |
| | |
| | data = pd.read_csv(StringIO(response.text)) |
| | |
| | |
| | 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(): |
| | |
| | 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() |
| |
|