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