File size: 3,438 Bytes
a24b86b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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()