这里我们来介绍一个简易的医疗导诊系统,基于我们产品有五大测量的功能:心电,血氧,血压,血糖和体脂。这个医疗导诊系统主要是通过用户描述的一些症状来判断用户可能的指标异常,然后引导用户进行相关指标的测量,如果测量得到相关指标有异常的话,那么就指导用户去医院相关科室就诊。整个流程如图所示:
所以说首先我们要了解症状如何来对应指标的异常呢,首先我们得统计出五大测量的功能对应哪些病症,这些病症又对应哪些症状,我自行百度了一下,总结出如下的症状对照图:
好了,整理好了这些症状对照表之后,我们可以开始用一个字典来存储它:
# 症状列表
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 = 1
OXYGEN = 2
PRESSURE = 3
FAT = 4
SUGAR = 5
class Gender(Enum):
MALE = 1
FEMALE = 2
UNKNOWN = 3
class SugarType(Enum):
EMPTY = 1
FULL = 2
def 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-140
if mesure_value[0] < 100:
print('您的心率过低,请您前往心血管内科咨询医生')
elif mesure_value[0] > 140:
print('您的心率过高,请您前往心血管内科咨询医生')
else:
print('您的心率正常')
elif 3 < age < 50: # 3-50岁 60-100
if mesure_value[0] < 60: # 心率过低
print('您的心率过低,请您前往心血管内科咨询医生')
elif mesure_value[0] > 100:
print('您的心率过高,请您前往心血管内科咨询医生')
else:
print('您的心率正常')
elif age >= 50: # 50岁以上 50-80
if 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('您患有重度低血氧症,请前往医院内科咨询医生')
# PRESSURE
if mesure_type == MesureType.PRESSURE: # 60-89 90-139
if 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('您的血压正常')
# FAT
if 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('您的体脂正常')
# SUGAR
if 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('您有患糖尿病的风险,请您前往医院内分泌科咨询医生')
我们来看一下效果:
这样可以看出,根据测量结果,我们可以准确得判断用户的相关指标是否有异常,从而指导用户进行相关指标的重视和就诊,这就是一个简易的医疗导诊系统的流程,简单又实用。