Бот не отвечает на кодовые слова
Делаю бота, который должен отправлять картинку по кодовому слову, к примеру:
бот, скинь картинку с собачками
Вот мой код :
@bot.message_handler(content_types=['text'])
def get_photo(message):
words = "бот картинку картинка картины".split()
dogs = "собак собака собаки собаку собачками".split()
plac = "пейзажи пейзаж пейзажем".split()
space = "космос космосом".split()
if message.text.lower() in words:
if message.text.lower() in dogs and words:
bot.send_message(message.chat.id,"* картинка с собакой *")
elif message.text.lower() in plac:
bot.send_message(message.chat.id,"* картинка с пейзажем *")
elif message.text.lower() in space:
bot.send_message(message.chat.id,"* картинка с космосом *")
#else:
#bot.send_message(message.chat.id,"не было введено кодового слова")
Не понимаю, почему оно ничего не выводит? Ведь после того, как идет проверка на ключевое слово бот или картинка, должна быть проверка на тему картинки и, если слово, к примеру, собака, то кидать фото из группы собак?
Ответы (1 шт):
У вас в message.text будет строка "бот, скинь картинку с собачками" и по коду вы пытаетесь всю эту строку найти как элемент списка words.
А по факту, нужно наоборот -- разделять message.text на слова и эти слова искать в words и dogs. Анализ слов запрос позволит понять намерения пользователя.
Накидал простенький пример анализа слов запроса. В качестве токенизатора использовал регулярку. Но можно использовать полноценный токенизатор и кроме вытаскивания слов, убрать ненужные токены, а слова, например привести в начальную форму.
Пример:
import re
...
words = "бот картинку картинка картины".split()
dogs = "собак собака собаки собаку собачками".split()
plac = "пейзажи пейзаж пейзажем".split()
space = "космос космосом".split()
text = message.text.lower()
tokens = re.findall(r'\w+', text)
# Если в запросе есть слово из words
if any(x in words for x in tokens):
# Если в запросе есть слово из dogs
if any(x in dogs for x in tokens):
bot.send_message(message.chat.id, "* картинка с собакой *")
elif any(x in plac for x in tokens):
bot.send_message(message.chat.id, "* картинка с пейзажем *")
elif any(x in space for x in tokens):
bot.send_message(message.chat.id, "* картинка с космосом *")
Можно сделать без токенизации, тогда, проверка немного меняется -- ключевые слова ищутся в тексте запроса (но нужно внимательнее слова подбирать, т.к. тут поиск будет по подстроке в тексте запроса):
text = message.text.lower()
if any(x in text for x in words):
if any(x in text for x in dogs):
bot.send_message(message.chat.id, "* картинка с собакой *")
elif any(x in text for x in plac):
bot.send_message(message.chat.id, "* картинка с пейзажем *")
elif any(x in text for x in space):
bot.send_message(message.chat.id, "* картинка с космосом *")