这里我们来介绍一个简易的医疗导诊系统,基于我们产品有五大测量的功能:心电,血氧,血压,血糖和体脂。这个医疗导诊系统主要是通过用户描述的一些症状来判断用户可能的指标异常,然后引导用户进行相关指标的测量,如果测量得到相关指标有异常的话,那么就指导用户去医院相关科室就诊。整个流程如图所示:

所以说首先我们要了解症状如何来对应指标的异常呢,首先我们得统计出五大测量的功能对应哪些病症,这些病症又对应哪些症状,我自行百度了一下,总结出如下的症状对照图:

好了,整理好了这些症状对照表之后,我们可以开始用一个字典来存储它:

# 症状列表
symptoms = ['心悸', '心跳加速', '头晕', '胸闷', '胸痛', '气急', '多汗', '面色苍白', '四肢发冷', '抽搐', '心慌', '心悸', '心跳加速', '头晕', '呼吸困难', '胸闷', '气短', '乏力', '心悸', '耳鸣', '头疼', '头痛', '头晕', '畏冷', '脸色苍白', '疲劳', '恶心', '头晕', '多饮', '多食', '多尿', '体重减轻', '心悸', '多汗', '饥饿', '大汗', '乏力', '胸闷', '气短']
symptoms = set(symptoms)
print(symptoms)
{'四肢发冷', '头疼', '心悸', '耳鸣', '胸痛', '多汗', '乏力', '胸闷', '心跳加速', '多尿', '恶心', '体重减轻', '疲劳', '畏冷', '头晕', '饥饿', '头痛', '大汗', '抽搐', '多食', '面色苍白', '心慌', '气急', '呼吸困难', '多饮', '气短', '脸色苍白'}

症状表达完成之后,可以用字典来对应起来:

# 建立五大量测的正排表
mesure_set = {'心率不齐': ['心悸', '心跳加速', '头晕', '胸闷', '胸痛', '气急', '多汗', '面色苍白', '四肢发冷', '抽搐'],# 心率不齐'心率过快': ['心慌', '心悸', '心跳加速', '头晕', '呼吸困难'],# 心率过快'心率过慢': ['胸闷', '气短', '乏力'],# 心率过慢'高血压': ['心悸', '耳鸣', '头疼', '头痛'],# 高血压'低血压': ['头晕', '畏冷', '脸色苍白', '疲劳', '恶心', '头晕'],# 低血压'血氧不足': ['乏力', '胸闷', '气短'],# 血氧不足'高血糖': ['多饮', '多食', '多尿', '体重减轻'],# 高血糖'低血糖': ['心悸', '多汗', '饥饿', '大汗']# 低血糖
}

我们需要的是通过症状来推测病症,所以我们需要建立这些症状的倒排表:

# 建立五大量测的倒排表
invert_mesure_set = dict()
for symptom in symptoms:temp = []for word in mesure_set.keys():if symptom in mesure_set[word]:temp.append(word)invert_mesure_set[symptom] = temp
print(invert_mesure_set){'四肢发冷': ['心率不齐'], '头疼': ['高血压'], '心悸': ['心率不齐', '心率过快', '高血压', '低血糖'],
'耳鸣': ['高血压'], '胸痛': ['心率不齐'], '多汗': ['心率不齐', '低血糖'], '乏力': ['心率过慢', '血氧不足'],
'胸闷': ['心率不齐', '心率过慢', '血氧不足'], '心跳加速': ['心率不齐', '心率过快'], '多尿': ['高血糖'],
'恶心': ['低血压'], '体重减轻': ['高血糖'], '疲劳': ['低血压'], '畏冷': ['低血压'], '头晕': ['心率不齐', '心率过快', '低血压'],
'饥饿': ['低血糖'], '头痛': ['高血压'], '大汗': ['低血糖'], '抽搐': ['心率不齐'], '多食': ['高血糖'],
'面色苍白': ['心率不齐'], '心慌': ['心率过快'], '气急': ['心率不齐'], '呼吸困难': ['心率过快'],
'多饮': ['高血糖'], '气短': ['心率过慢', '血氧不足'], '脸色苍白': ['低血压']}

有了这个倒排表,我们就可以通过一些症状来判断一些指标的异常了,这里我们可以做一些文本的替换来扩展我们的话术:

# 对症状进行建议测量的方法
def advice(query):degree = ['有点','特别','相当','很','比较','非常']for word in degree:if word in degree:query = query.replace(word , '')# 脸色苍白complexion = ['脸发白','脸色发白','脸色不好','气色不好','气色差','脸色差','面色发白','面色苍白', '面色差', '面色不好']for word in complexion:if word in query:query = query.replace(word, '脸色苍白')# 乏力weak = ['无力','没力气','没力','没劲','没劲儿']for word in weak:if word in query:query = query.replace(word, '乏力')# 饥饿    hungry = ['饿', '想吃东西']for word in hungry:if word in query:query = query.replace(word, '饥饿')# 疲劳    tired = ['累','劳累','疲倦']for word in tired:if word in query:query = query.replace(word, '疲劳')# 大汗hidrosis = ['多汗','汗']for word in hidrosis:if word in query:query = query.replace(word, '大汗')# 气急flustered = ['气喘']for word in flustered:if word in query:query = query.replace(word, '气急')# 多饮polydipsia = ['喝得多','饮得多']for word in polydipsia:if word in query:query = query.replace(word, '多饮')# 头head = ['脑袋','脑壳']for word in head:if word in query:query = query.replace(word, '头')# 多食polyphagia = ['吃得多','能吃']for word in polyphagia:if word in query:query = query.replace(word, '多食')# 心跳加速heartbeat = ['心跳','心']for word in heartbeat:if word in query:query = query.replace(word, '心跳加速')# 胸chest = ['胸口','胸部','心口']for word in chest:if word in query:query = query.replace(word, '胸')# 痛hurt = ['不舒服','难受']for word in hurt:if word in query:query = query.replace(word, '痛')mesure = []for symptom in symptoms:if symptom in query:# 对应的症状print('针对您的症状,我们考虑您可能是:',invert_mesure_set[symptom])for word in invert_mesure_set[symptom]:if '心率' in word:mesure.append('心率')elif '血压' in word:mesure.append('血压')elif '血糖' in word:mesure.append('血糖')elif '血氧' in word:mesure.append('血氧')print('我们建议您在小域精灵上进行以下项目测量:',list(set(mesure)))if len(mesure) == 0:print('暂时无法判断您的症状,请您前往医院咨询医生')

好了,方法写完了,我们来看一下效果:


只要是关于五大测量的症状,我们都可以引导用户进行相关项目的测量,然后就是测量之后,测量数据的分析:

from enum import Enum
class MesureType(Enum):ECG = 1OXYGEN = 2PRESSURE = 3FAT = 4SUGAR = 5class Gender(Enum):MALE = 1FEMALE = 2UNKNOWN = 3class SugarType(Enum):EMPTY = 1FULL = 2def judge(*mesure_value, mesure_type, gender=Gender.UNKNOWN, age=0, sugar_type=SugarType.EMPTY):# ECG 心率测量assert len(mesure_value) > 0, '测量数据不能为空'assert age >= 0, '年龄不能小于0'if mesure_type == MesureType.ECG:assert age >= 0, '年龄必须为正数'if age == 0:  # 没有填写年龄,按一般情况处理 60-100次if mesure_value[0] < 60:  # 心率过低print('您的心率过低,请您前往心血管内科咨询医生')elif mesure_value[0] > 100:  # 心率过高print('您的心率过高,请您前往心血管内科咨询医生')else:print('您的心率正常')else:  # 指定年龄if age <= 3:  # 小于三岁 100-140if mesure_value[0] < 100:print('您的心率过低,请您前往心血管内科咨询医生')elif mesure_value[0] > 140:print('您的心率过高,请您前往心血管内科咨询医生')else:print('您的心率正常')elif 3 < age < 50:  # 3-50岁 60-100if mesure_value[0] < 60:  # 心率过低print('您的心率过低,请您前往心血管内科咨询医生')elif mesure_value[0] > 100:print('您的心率过高,请您前往心血管内科咨询医生')else:print('您的心率正常')elif age >= 50:  # 50岁以上 50-80if mesure_value[0] < 50:print('您的心率过低,请您前往心血管内科咨询医生')elif mesure_value[0] > 80:print('您的心率过高,请您前往心血管内科咨询医生')else:print('您的心率正常')# OXYGEN 血氧测量if mesure_type == MesureType.OXYGEN:  # 正常值高于95%if mesure_value[0] >= 0.95:  # 血氧含量正常print('您的血氧含量正常')elif 0.95 > mesure_value[0] >= 0.9:  # 供氧不足print('您的血氧含量不足,请前往医院内科咨询医生')elif 0.9 > mesure_value[0] >= 0.8:  # 低血氧症print('您患有低血氧症,请前往医院内科咨询医生')elif mesure_value[0] < 0.8:  # 重度低血氧症print('您患有重度低血氧症,请前往医院内科咨询医生')# PRESSUREif mesure_type == MesureType.PRESSURE:  # 60-89 90-139if mesure_value[0][0] > 139:print('您的收缩压偏高,请前往医院内科咨询医生')elif mesure_value[0][0] < 90:print('您的收缩压偏低,请前往医院内科咨询医生')if mesure_value[0][1] > 89:print('您的舒张压偏高,请前往医院内科咨询医生')elif mesure_value[0][1] < 60:print('您的舒张压偏低,请前往医院内科咨询医生')elif 90 <= mesure_value[0][0] <= 139 and 60 <= mesure_value[0][1] <= 89:print('您的血压正常')# FATif mesure_type == MesureType.FAT:  # 体脂if gender == Gender.UNKNOWN:  # 性别未知print('无法评估您的体脂')elif gender == Gender.MALE:if age == 0:  # 年龄不详 男性 14%-20%if mesure_value[0] < 0.14:print('您的体脂偏低')elif mesure_value[0] > 0.2:print('您的体脂偏高')else:print('您的体脂正常')elif 0 < age < 30:  # 0-30岁 14%-20%if mesure_value[0] < 0.14:print('您的体脂偏低')elif mesure_value[0] > 0.2:print('您的体脂偏高')else:print('您的体脂正常')elif 30 <= age <= 55:  # 30-55岁 17%-23%if mesure_value[0] < 0.17:print('您的体脂偏低')elif mesure_value[0] > 0.23:print('您的体脂偏高')else:print('您的体脂正常')elif age > 55:  # 55岁以上 每5岁上调3%if mesure_value[0] < 0.17 + 0.03 * (age - 55) / 5:print('您的体脂偏低')elif mesure_value[0] > 0.23 + 0.03 * (age - 55) / 5:print('您的体脂偏高')else:print('您的体脂正常')elif gender == Gender.FEMALE:if age == 0:  # 年龄不详 女性 17%-24%if mesure_value[0] < 0.17:print('您的体脂偏低')elif mesure_value[0] > 0.24:print('您的体脂偏高')else:print('您的体脂正常')elif 0 < age < 30:  # 0-30岁 17%-24%if mesure_value[0] < 0.17:print('您的体脂偏低')elif mesure_value[0] > 0.24:print('您的体脂偏高')else:print('您的体脂正常')elif 30 <= age <= 55:  # 30-55岁 20%-27%if mesure_value[0] < 0.2:print('您的体脂偏低')elif mesure_value[0] > 0.27:print('您的体脂偏高')else:print('您的体脂正常')elif age > 55:  # 55岁以上 每5岁上调3%if mesure_value[0] < 0.20 + 0.03 * (age - 55) / 5:print('您的体脂偏低')elif mesure_value[0] > 0.27 + 0.03 * (age - 55) / 5:print('您的体脂偏高')else:print('您的体脂正常')# SUGARif mesure_type == MesureType.SUGAR:  # 血糖测量if sugar_type == SugarType.EMPTY:  # 空腹if mesure_value[0] < 3.61:print('您的血糖偏低,请您前往医院内分泌科咨询医生')elif 3.61 <= mesure_value[0] < 6.11:print('您的血糖正常')elif 6.11 <= mesure_value[0] <= 7:print('您的血糖偏高,请您前往医院内分泌科咨询医生')elif mesure_value[0] > 7:print('您有患糖尿病的风险,请您前往医院内分泌科咨询医生')elif sugar_type == SugarType.FULL:  # 饭后if mesure_value[0] < 3.9:print('您的血糖偏低,请您前往医院内分泌科咨询医生')elif 3.9 <= mesure_value[0] < 7.8:print('您的血糖正常')elif 7.8 <= mesure_value[0] <= 11.1:print('您的血糖偏高,请您前往医院内分泌科咨询医生')elif mesure_value[0] > 11.1:print('您有患糖尿病的风险,请您前往医院内分泌科咨询医生')

我们来看一下效果:

这样可以看出,根据测量结果,我们可以准确得判断用户的相关指标是否有异常,从而指导用户进行相关指标的重视和就诊,这就是一个简易的医疗导诊系统的流程,简单又实用。

搭建一个简易的医疗导诊系统相关推荐

  1. HTML+CSS+PHP+COOKIE在本地搭建一个简易的登陆注册网页

    昨天晚上看了一叶飘零大佬的直播,大佬说:初学者最好自己先动手去做一些项目,这样能更好的了解原理,恰好学长要求做一个简易的登陆注册系统,利用这个机会再学习一波. 做了两天,搞懂了很多概念,也遇到了很多问 ...

  2. 快速搭建一个简易的HTTP服务器用于文件分享与下载

    需要快速搭建一个简易的HTTP服务器进行文件的分享与下载.主要有以下两种方法: 1. 使用python 来实现 import http.server import socketserverPORT = ...

  3. 如何搭建一个简易的Web框架

    Web框架本质 什么是Web框架, 如何自己搭建一个简易的Web框架?其实, 只要了解了HTTP协议, 这些问题将引刃而解. 简单的理解:  所有的Web应用本质上就是一个socket服务端, 而用户 ...

  4. 如何在本地搭建一个Android应用crashing跟踪系统-ACRA

    https://github.com/bboyfeiyu/android-tech-frontier/tree/master/others/%E5%A6%82%E4%BD%95%E5%9C%A8%E6 ...

  5. 以太坊开发入门,如何搭建一个区块链DApp投票系统

    点击关注异步图书,置顶公众号 每天与你分享 IT好书 技术干货 职场知识 第一节 概述 对于初学者,需要了解以太坊开发相关的基本概念,另外就是如何构建一个基于以太坊的完整去中心化应用例如一个区块链投票 ...

  6. 微信字 签到 java_java微信签到功能实现:java做的一个简易的微信签到系统

    java微信签到功能实现,现在微信签到功能很流行,这个签到功能帮助微信用户更好的管理自己的微信公众号,那你想知道java微信签到功能如何实现呢,今天小编就特意为大家分享一个关于java微信签到功能实现 ...

  7. java设计按月每天签到_java微信签到功能实现:java做的一个简易的微信签到系统的案例...

    java微信签到功能实现,现在微信签到功能很流行,这个签到功能帮助微信用户更好的管理自己的微信公众号,那你想知道java微信签到功能如何实现呢,今天小编就特意为大家分享一个关于java微信签到功能实现 ...

  8. [单片机框架] [kv_sys] 实现一个简易KV键值系统(最终版)

    [单片机框架] [kv_sys] 实现一个简易KV键值系统 [单片机框架] [kv_sys] 实现一个简易KV键值系统(升级版) 本版本改为数据任意长度,灵活性更高. 版本 Code byte RO ...

  9. [单片机框架] [kv_sys] 实现一个简易KV键值系统(升级版)

    [单片机框架] [kv_sys] 实现一个简易KV键值系统 Env 小型KV数据库,支持 写平衡(磨损平衡) 及掉电保护模式 让Flash变为NoSQL(非关系型数据库)模型的小型键值(Key-Val ...

最新文章

  1. 火爆全网,却只有4页!ICLR爆款论文「你只需要Patch」到底香不香?
  2. html精灵图坐标如何确定,如何使用HTML中的精灵图
  3. python在线课程-《Python程序设计与应用》在线课程使用说明
  4. [codility]Min-abs-sum
  5. 佛祖保佑代码无bug图片_程序员都有哪些奇趣的代码注释,细思极恐
  6. opencv 霍夫变换检测直线和圆
  7. Mac上emacs gpg: 无法检查签名:没有公钥
  8. 韩顺平java30天Utils包下的工具类
  9. 更新一些CAD中比较容易混淆的概念
  10. Qt 之 直播流播放Qt-Vlc
  11. Chapter9:Simulink建模与仿真
  12. SD-WAN 系列--企业专线、企业互联网
  13. ubuntu16.04+cuda8.0安装pytorch
  14. blender玻璃材质
  15. python学习之编写学员管理系统
  16. 鸿蒙EMUI10升级体验,华为P30升级EMUI10,体验如何?我给大家说一说!
  17. 特殊数字符号整理 - 圆圈数字
  18. HTTP服务(超文本传输协议)
  19. wc 一个进程结果是2_用开放的wc创建一个Web组件
  20. 啊哈C——学习4.10一起来找茬

热门文章

  1. 流量主系列|独立版在线答题微信小程序源码
  2. [Android]自定义系统菜单的背景
  3. stm32f1+ov7725进行图像处理
  4. 软件测试 - 功能测试Ⅰ
  5. 如何保证缓存和数据库的一致性?
  6. iOS小技能:Xcode13的使用技巧
  7. Seate 1.4.2运行seata-server.bat数据库连接失败解决方案
  8. Ubuntu18.4双网卡同时上内网和外网
  9. L440的2*2 11b/g/n Wireless LAN M.2 Adapter停止服务的解决方法
  10. 数据库中的表导出成excel表格 并发送给客户端