Advertisement
Hasli4

Untitled

Mar 27th, 2025
249
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.70 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. import telebot
  3. import json
  4. import nltk
  5. import os
  6. from nltk.corpus import stopwords
  7. from nltk.tokenize import word_tokenize
  8.  
  9. # Загрузка необходимых NLTK ресурсов
  10. nltk.download('punkt', quiet=True)
  11. nltk.download('stopwords', quiet=True)
  12.  
  13. class TelegramChatbot:
  14.     def __init__(self, token, reference_file='reference_guide.json'):
  15.         # Инициализация бота и справочника
  16.         self.bot = telebot.TeleBot(token)
  17.         self.reference_file = reference_file
  18.         self.knowledge_base = self.load_reference_file()
  19.        
  20.         # Регистрация обработчиков команд
  21.         self.register_handlers()
  22.  
  23.     def load_reference_file(self):
  24.         """Загрузка справочника из JSON файла"""
  25.         try:
  26.             if not os.path.exists(self.reference_file):
  27.                 # Создание пустого справочника, если файл не существует
  28.                 return {}
  29.            
  30.             with open(self.reference_file, 'r', encoding='utf-8') as file:
  31.                 return json.load(file)
  32.         except Exception as e:
  33.             print(f"Ошибка при загрузке справочника: {e}")
  34.             return {}
  35.  
  36.     def save_reference_file(self):
  37.         """Сохранение справочника в JSON файл"""
  38.         try:
  39.             with open(self.reference_file, 'w', encoding='utf-8') as file:
  40.                 json.dump(self.knowledge_base, file, ensure_ascii=False, indent=4)
  41.         except Exception as e:
  42.             print(f"Ошибка при сохранении справочника: {e}")
  43.  
  44.     def register_handlers(self):
  45.         """Регистрация обработчиков сообщений"""
  46.         @self.bot.message_handler(commands=['start', 'help'])
  47.         def send_welcome(message):
  48.             welcome_text = (
  49.                 "Привет! Я чат-бот с возможностью поиска информации в справочнике. \n"
  50.                 "Команды:\n"
  51.                 "/start - запуск бота\n"
  52.                 "/help - помощь\n"
  53.                 "/add - добавить новую запись в справочник\n"
  54.                 "/exit - завершить работу бота"
  55.             )
  56.             self.bot.reply_to(message, welcome_text)
  57.  
  58.         @self.bot.message_handler(commands=['add'])
  59.         def add_reference(message):
  60.             msg = self.bot.reply_to(message, "Введите ключ и значение через ':' (например, 'университет: Синергия')")
  61.             self.bot.register_next_step_handler(msg, self.process_reference_step)
  62.  
  63.         @self.bot.message_handler(commands=['exit'])
  64.         def exit_bot(message):
  65.             self.bot.reply_to(message, "До свидания!")
  66.             self.save_reference_file()
  67.             os._exit(0)
  68.  
  69.         @self.bot.message_handler(func=lambda message: True)
  70.         def process_message(message):
  71.             if message.text.lower() == 'выход':
  72.                 exit_bot(message)
  73.                 return
  74.  
  75.             answer = self.process_message_text(message.text)
  76.             self.bot.reply_to(message, answer)
  77.  
  78.     def process_reference_step(self, message):
  79.         """Обработка добавления новой записи в справочник"""
  80.         try:
  81.             key, value = message.text.split(':', 1)
  82.             key = key.strip()
  83.             value = value.strip()
  84.            
  85.             self.knowledge_base[key] = value
  86.             self.bot.reply_to(message, f"Добавлена запись: '{key}': '{value}'")
  87.         except Exception as e:
  88.             self.bot.reply_to(message, "Ошибка при добавлении записи. Используйте формат 'ключ: значение'")
  89.  
  90.     def preprocess_text(self, text):
  91.         """Предобработка текста: токенизация и удаление стоп-слов"""
  92.         tokens = word_tokenize(text.lower())
  93.         stop_words = set(stopwords.words('russian'))
  94.         filtered_tokens = [word for word in tokens if word not in stop_words]
  95.         return filtered_tokens
  96.  
  97.     def find_best_match(self, tokens):
  98.         """Поиск наилучшего совпадения в справочнике"""
  99.         best_match = None
  100.         max_match_score = 0
  101.  
  102.         for key, value in self.knowledge_base.items():
  103.             key_tokens = self.preprocess_text(key)
  104.            
  105.             # Подсчет совпадающих токенов
  106.             match_score = len(set(tokens) & set(key_tokens))
  107.            
  108.             if match_score > max_match_score:
  109.                 max_match_score = match_score
  110.                 best_match = value
  111.  
  112.         return best_match if best_match else "Извините, информация не найдена."
  113.  
  114.     def process_message_text(self, text):
  115.         """Обработка входящего сообщения"""
  116.         if text.lower() == 'привет':
  117.             return "Привет! Чем могу помочь?"
  118.        
  119.         tokens = self.preprocess_text(text)
  120.         return self.find_best_match(tokens)
  121.  
  122.     def run(self):
  123.         """Запуск бота"""
  124.         print("Бот запущен...")
  125.         self.bot.polling(none_stop=True)
  126.  
  127. def main():
  128.     # Токен вашего Telegram бота
  129.     TOKEN = '8056069105:AAFYORLCIvp_ImOrFomRakkcpEIhDDMixCA'
  130.    
  131.     # Создание и запуск бота
  132.     bot = TelegramChatbot(TOKEN)
  133.     bot.run()
  134.  
  135. if __name__ == '__main__':
  136.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement