|
|
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() |
|
|
|