Несколько месяцев назад я написал статью про бота определяющего болезни кошек. За это время я сделал несколько улучшений и создал еще одного бота, но уже для собак. Ссылка на бота для кошек Бот для определения болезни кошек / Хабр (habr.com)
Бот может по симптомам определить болезнь собаки. Всего в списке есть 32 болезни. Это и заболевания внутренних органов, и опорно-двигательной системы и так же банальная чумка и бешенство.
Принцип работы бота - бот отправляет вам симптом а вы нажимаете на кнопочку Да/Нет. В конце опроса появляется статистика какие заболевания могут быть у вашего котика и какие симптомы есть у этого заболевания.
Так же если вам надоело отвечать на вопросы, то есть кнопка "Завершить тест". При нажатие кнопки бот отправит вам результат опроса, где будут учтены ваши ответы, но тогда диагноз станет менее точнее, ведь не все симптомы будут проверены. Это одно из нововведений.
Другое нововведение - это уменьшение количества вопросов за счет группировки симптомов по группам, что позволило сократить количество вопросов в 5-7 раз.
Так же добавлена процентовка, которая показывает на сколько процентов пройден опрос и как долго еще осталось.
Ниже приведен код сердца моей программы, а именно сам алгоритм перебора и учета ответов пользователя. Суть вкратце - получает ответы и проверяет повторяемость симптомов. Так же выдает новый симптом из массива для отправки пользователю. При окончание симптомов готовит ответ для пользователя о болезнях собаки.
self.str_off.update({self.mass[self.first_row][self.first_col]: "Was"})
exit_for = 0
if self.go_column == 0:
for self.first_row in range(self.first_row, self.heigth):
for col in range(1, self.width):
if self.mass[self.first_row][col] != '':
phrase = self.mass[self.first_row][col]
if self.quest_off.get(phrase) != None:
if self.quest_off.get(phrase) == "Да" and self.str_off.get("Was"):
self.cnt_positive[self.first_row] += 1
elif self.quest_off.get(phrase) == "Нет" and self.str_off.get("Was"):
self.cnt_negative[self.first_row] += 1
else:
self.first_row = self.first_row
self.first_col = col
exit_for = 1
break
if exit_for:
break
self.first_col = 1
else:
for self.first_col in range(self.first_col, self.width + 1):
if self.first_col == self.width:
#print("Перебранны все болезни")
sick_cnt = 0
str_out = '\nМы проверили все симптомы. Ниже приведенна вероятность болезни котика:\n'
for i in range(1,self.heigth):
if self.cnt_positive[i] > 0:
sick_cnt = sick_cnt + 1
str_out += "\n\n{0} -{1:9.1f}% \n".format(self.mass[i][0], self.cnt_positive[i]/self.calc_simptom_in_row(i) * 100 )
str_out += "Связанные с этой болезнью симптомы:\n "
for z in range(1,self.width):
if self.mass[i][z] != '':
str_out += self.mass[i][z] + ";\n"
if sick_cnt > 0:
return str_out
else:
return "Кошка здорова"
Ну и внешний вид бота
Бот написан на Python 3.10. Базы данных для его реализации не используется. Все работает простым перебором в цикле. Для бота я использовал библиотеку telebot. Общее затраченное время - 3 недели. Боты крутятся на VPS серваке. Все трудности в процессе написания кода решались при помощи дебагера.
Ссылка на бота для собак:
Telegram@DogDoctorbot
Ссылки на бота для кошек:
Telegram @AnimalDocBot
Boilerplate
А бот учитывает только совпадение признаков, или учитывает также вероятность самого заболевания? А то условно можно на "чихает" поставить 33% - простуда, 33% - туберкулез, 33% - чума.
vyatkh1
А 1% куда пропал? И да комменты на статью про бота котиков как-бы намекают (я прогнал и тоже как бы намекаю). Мы таким в школе балова\лись (Экспертная система называлось).