Нужно сделать простейший чат-бот. Не получается правильное срабатывание бота на любое сочетание слов из предложенного списка
Подскажите, как решить такую задачу, пожалуйста! Нужен тестовый бот. Он должен выполнить print('Ну, тогда до свидания!'), если на вопрос "Чем Вам помочь?: " пользователь ответит любыми словами из списка 'ни', 'чем', 'не', 'нужно', 'сам', 'справлюсь', 'деньгами', 'помоги', 'материально', причём важно, чтобы он реагировал на эти слова, или на набор из этих слов, в любом сочетании. Т.е. и "ни" , и "ни чем", и "справлюсь сам", и "помоги деньгами", и "не сам". Иначе, если ни одного из этих слов в ответе нет, то print('Я тебя не понимаю') При одном из вариантов ответа бот переходит на блок, в котором опять задаёт вопрос, на который существует 2 варианта ответов. По той же схеме, из списка слов. Мой вариант решения работает только, когда последовательность слов из списка не нарушается. Вот блок-схема бота. В моём решении бот работает правильно, только если слова в ответе идут подряд.
print('Тестовый бот для работы по "ключевикам"')
answer = input("Чем Вам помочь?: ")
if answer.lower() in ['ни', 'чем', 'не', 'нужно', 'сам', 'справлюсь', 'деньгами', 'помоги', 'материально']:
print('Ну, тогда до свидания!')
elif answer.lower() in ['какой', 'язык', 'ты', 'знаешь', 'на', 'каком', 'языке', 'разговариваешь']:
question = input('Я знаю только "Python". Задавай вопросы: ')
if question.lower() in ['кто', 'тебя', 'создал', 'придумал', 'твой', 'создатель']:
print('Знакомый')
elif question.lower() in ['что', 'ты', 'умеешь', 'что', 'ты', 'можешь']:
print('Я только учусь!')
else:
print('Я тебя не понимаю')
Ответы (1 шт):
Вы проверяете, что введенный текст находится среди списка слов. А нужно наоборот проверять, что любое из слов входит во введенный текст:
words = ['ни', 'чем', 'не', 'нужно', 'сам', 'справлюсь', 'деньгами', 'помоги', 'материально']
answer = input("Чем Вам помочь?: ").lower()
if any(word in answer for word in words):
print('Ну, тогда до свидания!')
else:
print('Я тебя не понимаю')
Вообще, лучше работать не на уровне отдельных слов, а на уровне фраз. То есть проверять, не что во фразе есть какие-то слова, а что введена именно конкретная фраза:
answer = input("Чем Вам помочь?: ").lower()
if answer in ['ни чем', 'ничем', 'не нужно', 'сам справлюсь', 'деньгами', 'помоги материально']:
print('Ну, тогда до свидания!')
else:
print('Я тебя не понимаю')
Для удобства можно выделить в отдельную функцию, и еще убирать из текста все лишнее (дублирующиеся пробелы, знаки препинания и т.д.), в данном случае сделано через регулярные выражения:
import re
def check_phrases(text: str, phrases: list):
# получить набор слов без дублирующихся пробелов и без знаков препинания
text = " ".join(re.findall(r"\w+", text.lower())) # Если очистка не нужна - убрать эту строку
return text in phrases
answer = input("Чем Вам помочь?: ")
if check_phrases(answer, ["ни чем", "ничем", "не нужно", "сам справлюсь", "деньгами", "помоги материально", "материально"]):
print('Ну, тогда до свидания!')
elif check_phrases(answer, ['какой язык ты знаешь', 'какой язык знаешь', 'на каком языке разговариваешь', 'на каком языке ты разговариваешь']):
question = input('Я знаю только "Python". Задавай вопросы: ')
if check_phrases(question, ['кто тебя создал', 'кто тебя придумал', 'кто твой создатель']):
print('Знакомый')
elif check_phrases(question, ['что ты умеешь', 'что ты можешь']):
print('Я только учусь!')
else:
print('Я тебя не понимаю')
Тут видно, что приходится некоторые фразы повторять в нескольких вариантах написания. Чтобы избежать необходимости перечисления всех возможных вариантов, можно использовать проверку фраз через регулярные выражения:
import re
def check_phrases(text: str, phrases: list):
words = re.findall(r"\w+", text.lower()) # получить список слов, без пробелов и знаков препинания
return any(re.search(phrase, " ".join(words)) is not None for phrase in phrases)
answer = input("Чем Вам помочь?: ")
if check_phrases(answer, ["ни ?чем", "не нужно", "сам справлюсь", "(помоги )?(деньгами|материально)"]):
print('Ну, тогда до свидания!')
elif check_phrases(answer, ['какой язык (ты )?знаешь', 'на каком языке (ты )?разговариваешь']):
question = input('Я знаю только "Python". Задавай вопросы: ')
if check_phrases(question, ['кто тебя (создал|придумал)', 'кто твой создатель']):
print('Знакомый')
elif check_phrases(question, ['что (ты )?(умеешь|можешь)']):
print('Я только учусь!')
else:
print('Я тебя не понимаю')
else:
print('Я тебя не понимаю')
Например, в первой фразе бот "поймет" и "ничем", и "ни чем", и "деньгами" или "материально" без "помоги", и с "помоги".
