在线问诊 Python、FastAPI、Neo4j — 构建问题分类器

在线,问诊,python,fastapi,neo4j,构建,问题,分类器 · 浏览次数 : 54

小编点评

**字典构建** - 提取症状词的集合 `region_words`。 - 利用 `Aho-Corasick` 算法构建 Trie 字典树,将症状词分组到不同的类别中。 - 构建词对应类型字典 `wd_dict`,存储症状词的分类类别。 **问题分析** - 使用 AC 自动机过滤关键词,根据关键词的类型进行分类。 - 提取问题中的关键词并组装成一个字典 `medical_dict`。 - 返回问题的类型及其参数。 **知识图片字典化** - 创建一个包含症状词的集合 `symptom_dict`。 - 利用 `Aho-Corasick` 算法构建 Trie 字典树,将症状词分组到不同的类别中。 - 将症状词的集合 `symptom_dict` 融入 `wd_dict` 中。 **总结** - 构建了一个 Trie 字典树,用于症状分类。 - 利用 AC 自动机对关键词进行分类,并构建知识图片字典。 - 将症状词的分类结果和知识图片字典集成到 CQL 语句源代码中。

正文


将问题进行分析,和系统已有的分类进行关联

构建字典数据

将构建的知识图片字典化, 用于后面对问题的解析,下图为症状的字典,其它字典同理
image

构建 Trie 字典树

将建字典数据,组装集合

cur_dir = '/'.join(os.path.abspath(__file__).split('/')[:-1])
#  特征词路径
self.disease_path = os.path.join(cur_dir, '../dict/disease.txt')
self.check_path = os.path.join(cur_dir, '../dict/examine.txt')
self.drug_path = os.path.join(cur_dir, '../dict/drug.txt')
self.food_path = os.path.join(cur_dir, '../dict/food.txt')
self.symptom_path = os.path.join(cur_dir, '../dict/symptom.txt')
self.deny_path = os.path.join(cur_dir, '../dict/deny.txt')
# 加载数据
self.disease_wds = [i.strip() for i in open(self.disease_path, encoding="utf-8") if i.strip()]   # ['干眼', '右膝髌上囊及关节腔少量积液']
self.check_wds = [i.strip() for i in open(self.check_path, encoding="utf-8") if i.strip()]  # ['膝关节核磁', '视力', '砂眼', '辨色力', '角膜', '眼底']
self.drug_wds = [i.strip() for i in open(self.drug_path, encoding="utf-8") if i.strip()]
self.food_wds = [i.strip() for i in open(self.food_path, encoding="utf-8") if i.strip()]
self.symptom_wds = [i.strip() for i in open(self.symptom_path, encoding="utf-8") if i.strip()] # ['畏光','干涩','看东西有时候清楚有时候不清楚']

# 读出所有 dict 里面的字典数据,并拼接成一个大而全的 集合
# ['干眼', '右膝髌上囊及关节腔少量积液','膝关节核磁', '视力', '砂眼', '辨色力', '角膜', '眼底','畏光','干涩','看东西有时候清楚有时候不清楚']
self.region_words = set(self.disease_wds + self.check_wds + self.drug_wds + self.food_wds + self.symptom_wds)

构建 Trie 字典树
Trie字典树:https://www.cnblogs.com/vipsoft/p/17722820.html
Aho-Corasick 算法 AC自动机实现:https://www.cnblogs.com/vipsoft/p/17722761.html

# 目的是为了将来对用户提的问题,进行关键词快速提取
def build_actree(self, word_list):
    """
    构造actree,加速过滤
    :param word_list:
    :return:
    """
    actree = ahocorasick.Automaton()
    for index, word in enumerate(word_list):
        actree.add_word(word, (index, word))  # 向trie树中添加单词
    actree.make_automaton()
    return actree

按实体组装字典

# 将 ['干眼', '右膝髌上囊及关节腔少量积液','膝关节核磁', '视力', '砂眼', '辨色力', '角膜', '眼底'],进行分类,组装成不同类型的字典
def build_wdtype_dict(self):
    """
    构造词对应的类型
    :return:
    """
    wd_dict = dict()
    for wd in self.region_words:
        wd_dict[wd] = []
        if wd in self.disease_wds:
            wd_dict[wd].append('disease')
        if wd in self.check_wds:
            wd_dict[wd].append('check')
        if wd in self.drug_wds:
            wd_dict[wd].append('drug')
        if wd in self.food_wds:
            wd_dict[wd].append('food')
        if wd in self.symptom_wds:
            wd_dict[wd].append('symptom')
    return wd_dict

问题分析

通过AC算法,过滤关键词

# "请问最近看东西有时候清楚有时候不清楚是怎么回事"
def check_medical(self, question):
    """
    问句过滤
    :param question:
    :return:
    """
    region_wds = []
    for i in self.region_tree.iter(question):  # 从问题中,找出关键词
        wd = i[1][1]  # 看东西有时候清楚有时候不清楚
        region_wds.append(wd)
    stop_wds = []
    for wd1 in region_wds:
        for wd2 in region_wds:
            if wd1 in wd2 and wd1 != wd2:
                stop_wds.append(wd1)
    final_wds = [i for i in region_wds if i not in stop_wds]  # '看东西有时候清楚有时候不清楚'
    medical_dict = {i: self.wdtype_dict.get(i) for i in final_wds}  # {'看东西有时候清楚有时候不清楚': ['symptom']}
    return medical_dict

解析出问题的类型

data['args'] = medical_dict
# 若没有查到相关的外部查询信息,那么则将该疾病的描述信息返回
if question_types == [] and 'symptom' in types:
   question_types = ['symptom_disease']
# 将多个分类结果进行合并处理,组装成一个字典
data['question_types'] = question_types

输出字典

question = "请问最近看东西有时候清楚有时候不清楚是怎么回事"
# 最终输出
data = {'args': {'看东西有时候清楚有时候不清楚': ['symptom']}, 'question_types': ['symptom_disease']}

question = "干眼常用药有哪些"
# 最终输出
data = {'args': {'干眼': ['disease']}, 'question_types': ['disease_drug']}

question = "干眼哪些不能吃"
data = {'args': {'干眼': ['disease']}, 'question_types': ['disease_not_food']}

后面根据 question_types 生成 CQL语句

源代码地址:https://gitee.com/VipSoft/VipQA

与在线问诊 Python、FastAPI、Neo4j — 构建问题分类器相似的内容:

在线问诊 Python、FastAPI、Neo4j — 构建问题分类器

目录构建字典数据构建 Trie 字典树按实体组装字典问题分析 将问题进行分析,和系统已有的分类进行关联 构建字典数据 将构建的知识图片字典化, 用于后面对问题的解析,下图为症状的字典,其它字典同理 构建 Trie 字典树 将建字典数据,组装集合 cur_dir = '/'.join(os.path.

在线问诊 Python、FastAPI、Neo4j — 生成 Cypher 语句

目录构建节点字典构建Cypher CQL语句Test 这边只是为了测试,演示效果和思路,实际应用中,可以通过NLP构建CQL 接上一篇的问题分类 question = "请问最近看东西有时候清楚有时候不清楚是怎么回事" # 最终输出 data = {'args': {'看东西有时候清楚有时候不清楚'

在线问诊 Python、FastAPI、Neo4j — 提供咨询接口服务

目录构建服务层接口路由层PostMan 调用 采用 Fast API 搭建服务接口: https://www.cnblogs.com/vipsoft/p/17684079.html Fast API 文档:https://fastapi.tiangolo.com/zh/ 构建服务层 qa_servi

在线问诊 Python、FastAPI、Neo4j — 创建药品节点

目录前提条件创建节点 Demo准备数据创建药品标签节点 在线问诊 Python、FastAPI、Neo4j — 创建节点 Neo4j 节点的标签可以理解为 Java 中的实体。 根据常规流程:首先有什么症状,做哪些对应的检查,根据检查诊断什么疾病,需要用什么药物治疗,服药期间要注意哪些饮食,需要做哪

在线问诊 Python、FastAPI、Neo4j — 创建症状节点

目录症状数据创建节点附学习 电子病历中,患者主诉对应的相关检查,得出的诊断以及最后的用药情况。症状一般可以从主诉中提取。 症状数据 symptom_data.csv CSV 中,没有直接一行一个症状,主要想后面将 症状 => 疾病 做关联,最后会在一个 Excel 中表达 所以每行实际对应一个症病,

在线问诊 Python、FastAPI、Neo4j — 创建 检查节点

目录检查数据创建节点 根据不同的症状,会建议做些相对应的检验、检查 检查数据 examine_data.csv 建议值用“”引起来。避免中间有,号造成误识别 检查 "膝关节核磁" "眼睛酸胀" "视力" "砂眼" "辨色力" "角膜" "眼底" 创建节点 参考 创建药品 节点。 import log

在线问诊 Python、FastAPI、Neo4j — 创建 饮食节点

目录饮食数据创建节点 根据疾病、症状,判断出哪些饮食不能吃,哪些建议多吃 饮食数据 foods_data.csv 建议值用“”引起来。避免中间有,号造成误识别 饮食 "辣椒" "大蒜" "芥末" "海鲜" "胡萝卜" "核桃仁" "菠菜" "西红柿" "香蕉" 创建节点 重构代码,将 def exe

在线问诊 Python、FastAPI、Neo4j — 创建 节点关系

目录关系:症状-检查关系:疾病-症状代码重构 relationship_data.csv 症状,检查,疾病,药品,宜吃,忌吃 "上下楼梯疼,不能久站,感觉有点肿","膝关节核磁","右膝髌上囊及关节腔少量积液","扶他林","西红柿,香蕉","辣椒,大蒜" "眼睛胀痛,干涩,畏光,眼胀,眼痛,看东西

在线问诊 Python、FastAPI、Neo4j — 问题咨询

目录查出节点拼接节点属性测试结果问答演示 通过节点关系,找出对应的节点,获取节点属性值,并拼接成想要的结果。 接上节生成的CQL # 输入 question_class = {'args': {'看东西有时候清楚有时候不清楚': ['symptom']}, 'question_types': ['s

在线问诊 Python、FastAPI、Neo4j — 创建 疾病节点

目录疾病数据创建节点 根据检查结果、医生的临床经验得出疾病 疾病数据 disease_data.csv 建议值用“”引起来。避免中间有,号造成误识别 疾病 "干眼" "右膝髌上囊及关节腔少量积液" 创建节点 import logging import pandas as pd from utils.