Advertisement
Hasli4

Untitled

Apr 3rd, 2025
432
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.02 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. """
  3. Полноценная реализация чат-бота для Telegram.
  4. Бот обрабатывает входящие сообщения следующим образом:
  5. 1. Получает сообщение от пользователя.
  6. 2. С помощью NLTK:
  7.   - Токенизирует текст,
  8.   - Удаляет стоп-слова,
  9.   - Оставляет только слова (без знаков препинания и чисел).
  10. 3. Приводит слова к нормальной форме (лемматизация) с помощью spaCy.
  11. 4. Загружает таблицу "Лекарства.xlsx" с данными (предполагается, что в первой колонке находятся названия лекарств).
  12. 5. Для каждого лемматизированного токена производит поиск по столбцам таблицы и подсчитывает количество совпадений.
  13. 6. Если совпадения обнаружены только в первом столбце – выводит список лекарств (уникальные значения найденных строк).
  14. 7. В противном случае – сообщает, что условие не выполнено.
  15. 8. Бот также обрабатывает стандартные команды /start, /help и команду "Выход" для завершения работы.
  16. """
  17.  
  18. import telebot
  19. import pandas as pd
  20. import nltk
  21. from nltk.tokenize import word_tokenize
  22. from nltk.corpus import stopwords
  23. import spacy
  24.  
  25. # Загружаем необходимые ресурсы NLTK
  26. nltk.download('punkt')
  27. nltk.download('stopwords')
  28.  
  29. # Загружаем spaCy модель для русского языка
  30. # Для корректной работы требуется модель "ru_core_news_md" (ее можно установить командой: python -m spacy download ru_core_news_md)
  31. nlp = spacy.load("ru_core_news_md")
  32.  
  33. # Загружаем Excel-файл с лекарствами.
  34. # Файл "Лекарства.xlsx" должен находиться в рабочем каталоге.
  35. try:
  36.     df = pd.read_excel("Лекарства.xlsx")
  37. except Exception as e:
  38.     print("Ошибка при загрузке файла Excel:", e)
  39.     df = None
  40.  
  41. # Инициализация Telegram-бота (укажите свой токен)
  42. bot = telebot.TeleBot('ВАШ_ТОКЕН_ЗДЕСЬ')  # замените 'ВАШ_ТОКЕН_ЗДЕСЬ' на реальный токен
  43.  
  44. def process_message(text):
  45.     """
  46.    Обработка входящего текста:
  47.    1. Приведение к нижнему регистру.
  48.    2. Токенизация с помощью NLTK.
  49.    3. Удаление стоп-слов и оставление только буквенных токенов.
  50.    4. Лемматизация с помощью spaCy.
  51.    
  52.    Возвращает список нормализованных токенов (лемм).
  53.    """
  54.     # Приводим текст к нижнему регистру
  55.     text = text.lower()
  56.     # Токенизируем текст
  57.     tokens = word_tokenize(text, language="russian")
  58.     # Фильтруем токены: оставляем только слова и удаляем стоп-слова
  59.     filtered_tokens = [token for token in tokens if token.isalpha() and token not in stopwords.words("russian")]
  60.     # Лемматизация с помощью spaCy: объединяем токены в строку и анализируем
  61.     doc = nlp(" ".join(filtered_tokens))
  62.     lemmas = [token.lemma_ for token in doc]
  63.     return lemmas
  64.  
  65. def search_tokens_in_table(tokens, dataframe):
  66.     """
  67.    Ищет в таблице совпадения по каждому столбцу для списка токенов.
  68.    
  69.    Параметры:
  70.        tokens: список нормализованных токенов (строк)
  71.        dataframe: объект pandas.DataFrame, загруженный из Excel
  72.        
  73.    Возвращает:
  74.        col_matches: словарь, где ключ – имя столбца, значение – количество совпадений
  75.        col_matches_rows: словарь, где ключ – имя столбца, значение – список индексов строк,
  76.                          в которых обнаружены совпадения.
  77.    """
  78.     col_matches = {col: 0 for col in dataframe.columns}
  79.     col_matches_rows = {col: [] for col in dataframe.columns}
  80.    
  81.     # Для каждого токена ищем его наличие в каждой ячейке таблицы
  82.     for token in tokens:
  83.         for col in dataframe.columns:
  84.             for idx, value in dataframe[col].iteritems():
  85.                 if pd.notnull(value):
  86.                     # Приводим значение ячейки к строке, приводим к нижнему регистру и проверяем наличие токена
  87.                     if token in str(value).lower():
  88.                         col_matches[col] += 1
  89.                         col_matches_rows[col].append(idx)
  90.     return col_matches, col_matches_rows
  91.  
  92. # Определяем функцию для ветвления логики в зависимости от результатов поиска
  93. def analyze_results(col_matches, col_matches_rows, dataframe):
  94.     """
  95.    Анализирует результаты поиска.
  96.    Если совпадения есть только в первом столбце, возвращает список лекарств по найденным индексам.
  97.    Иначе возвращает сообщение о том, что условие не выполнено.
  98.    """
  99.     # Предполагаем, что первый столбец содержит названия лекарств
  100.     primary_col = dataframe.columns[0]
  101.     other_cols = [col for col in dataframe.columns if col != primary_col]
  102.    
  103.     # Если в первом столбце есть совпадения и в остальных нет
  104.     if col_matches[primary_col] > 0 and all(col_matches[col] == 0 for col in other_cols):
  105.         # Получаем уникальные значения (названия лекарств) для найденных строк
  106.         matched_indices = set(col_matches_rows[primary_col])
  107.         drugs = dataframe.loc[matched_indices, primary_col].unique()
  108.         return "Найденные лекарства: " + ", ".join([str(drug) for drug in drugs])
  109.     else:
  110.         return "Результаты поиска не удовлетворяют условию (совпадения обнаружены не только в первом столбце)."
  111.  
  112. # Обработчик команд /start и /help
  113. @bot.message_handler(commands=['start', 'help'])
  114. def send_welcome(message):
  115.     bot.reply_to(message, 'Привет! Чем могу помочь? Напиши "Выход" для завершения работы.')
  116.  
  117. # Обработчик текстовых сообщений
  118. @bot.message_handler(content_types=['text'])
  119. def get_text_messages(message):
  120.     # Если пользователь пишет "Выход", завершаем работу бота
  121.     if message.text.strip().lower() == "выход":
  122.         bot.send_message(message.from_user.id, "Бот завершает работу. До свидания!")
  123.         exit_program()
  124.         return
  125.  
  126.     # Обрабатываем входящий текст: нормализация и лемматизация
  127.     tokens = process_message(message.text)
  128.     print("Обработанные токены:", tokens)
  129.    
  130.     # Если таблица не загружена, выводим сообщение об ошибке
  131.     if df is None:
  132.         bot.send_message(message.from_user.id, "Ошибка: не удалось загрузить таблицу с данными.")
  133.         return
  134.  
  135.     # Производим поиск токенов в таблице
  136.     col_matches, col_matches_rows = search_tokens_in_table(tokens, df)
  137.     print("Совпадения по столбцам:", col_matches)
  138.    
  139.     # Анализируем результаты поиска
  140.     result = analyze_results(col_matches, col_matches_rows, df)
  141.    
  142.     # Отправляем ответ пользователю
  143.     bot.send_message(message.from_user.id, result)
  144.  
  145. def exit_program():
  146.     """
  147.    Функция для завершения работы бота.
  148.    """
  149.     print("Завершение работы программы...")
  150.     bot.stop_polling()
  151.     quit()
  152.  
  153. # Запуск бота в режиме polling (постоянное прослушивание сообщений)
  154. if __name__ == "__main__":
  155.     print("Запуск бота...")
  156.     bot.polling(none_stop=True, interval=0)
  157.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement