Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- import telebot
- import json
- import nltk
- import os
- from nltk.corpus import stopwords
- from nltk.tokenize import word_tokenize
- # Загрузка необходимых NLTK ресурсов
- nltk.download('punkt', quiet=True)
- nltk.download('stopwords', quiet=True)
- class TelegramChatbot:
- def __init__(self, token, reference_file='reference_guide.json'):
- # Инициализация бота и справочника
- self.bot = telebot.TeleBot(token)
- self.reference_file = reference_file
- self.knowledge_base = self.load_reference_file()
- # Регистрация обработчиков команд
- self.register_handlers()
- def load_reference_file(self):
- """Загрузка справочника из JSON файла"""
- try:
- if not os.path.exists(self.reference_file):
- # Создание пустого справочника, если файл не существует
- return {}
- with open(self.reference_file, 'r', encoding='utf-8') as file:
- return json.load(file)
- except Exception as e:
- print(f"Ошибка при загрузке справочника: {e}")
- return {}
- def save_reference_file(self):
- """Сохранение справочника в JSON файл"""
- try:
- with open(self.reference_file, 'w', encoding='utf-8') as file:
- json.dump(self.knowledge_base, file, ensure_ascii=False, indent=4)
- except Exception as e:
- print(f"Ошибка при сохранении справочника: {e}")
- def register_handlers(self):
- """Регистрация обработчиков сообщений"""
- @self.bot.message_handler(commands=['start', 'help'])
- def send_welcome(message):
- welcome_text = (
- "Привет! Я чат-бот с возможностью поиска информации в справочнике. \n"
- "Команды:\n"
- "/start - запуск бота\n"
- "/help - помощь\n"
- "/add - добавить новую запись в справочник\n"
- "/exit - завершить работу бота"
- )
- self.bot.reply_to(message, welcome_text)
- @self.bot.message_handler(commands=['add'])
- def add_reference(message):
- msg = self.bot.reply_to(message, "Введите ключ и значение через ':' (например, 'университет: Синергия')")
- self.bot.register_next_step_handler(msg, self.process_reference_step)
- @self.bot.message_handler(commands=['exit'])
- def exit_bot(message):
- self.bot.reply_to(message, "До свидания!")
- self.save_reference_file()
- os._exit(0)
- @self.bot.message_handler(func=lambda message: True)
- def process_message(message):
- if message.text.lower() == 'выход':
- exit_bot(message)
- return
- answer = self.process_message_text(message.text)
- self.bot.reply_to(message, answer)
- def process_reference_step(self, message):
- """Обработка добавления новой записи в справочник"""
- try:
- key, value = message.text.split(':', 1)
- key = key.strip()
- value = value.strip()
- self.knowledge_base[key] = value
- self.bot.reply_to(message, f"Добавлена запись: '{key}': '{value}'")
- except Exception as e:
- self.bot.reply_to(message, "Ошибка при добавлении записи. Используйте формат 'ключ: значение'")
- def preprocess_text(self, text):
- """Предобработка текста: токенизация и удаление стоп-слов"""
- tokens = word_tokenize(text.lower())
- stop_words = set(stopwords.words('russian'))
- filtered_tokens = [word for word in tokens if word not in stop_words]
- return filtered_tokens
- def find_best_match(self, tokens):
- """Поиск наилучшего совпадения в справочнике"""
- best_match = None
- max_match_score = 0
- for key, value in self.knowledge_base.items():
- key_tokens = self.preprocess_text(key)
- # Подсчет совпадающих токенов
- match_score = len(set(tokens) & set(key_tokens))
- if match_score > max_match_score:
- max_match_score = match_score
- best_match = value
- return best_match if best_match else "Извините, информация не найдена."
- def process_message_text(self, text):
- """Обработка входящего сообщения"""
- if text.lower() == 'привет':
- return "Привет! Чем могу помочь?"
- tokens = self.preprocess_text(text)
- return self.find_best_match(tokens)
- def run(self):
- """Запуск бота"""
- print("Бот запущен...")
- self.bot.polling(none_stop=True)
- def main():
- # Токен вашего Telegram бота
- TOKEN = '8056069105:AAFYORLCIvp_ImOrFomRakkcpEIhDDMixCA'
- # Создание и запуск бота
- bot = TelegramChatbot(TOKEN)
- bot.run()
- if __name__ == '__main__':
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement