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

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

目录


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

构建字典数据

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

构建 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

目录
相关文章
|
11月前
|
人工智能 JavaScript API
零基础构建MCP服务器:TypeScript/Python双语言实战指南
作为一名深耕技术领域多年的博主摘星,我深刻感受到了MCP(Model Context Protocol)协议在AI生态系统中的革命性意义。MCP作为Anthropic推出的开放标准,正在重新定义AI应用与外部系统的交互方式,它不仅解决了传统API集成的复杂性问题,更为开发者提供了一个统一、安全、高效的连接框架。在过去几个月的实践中,我发现许多开发者对MCP的概念理解透彻,但在实际动手构建MCP服务器时却遇到了各种技术壁垒。从环境配置的细节问题到SDK API的深度理解,从第一个Hello World程序的调试到生产环境的部署优化,每一个环节都可能成为初学者的绊脚石。因此,我决定撰写这篇全面的实
2487 67
零基础构建MCP服务器:TypeScript/Python双语言实战指南
|
8月前
|
人工智能 测试技术 API
构建AI智能体:二、DeepSeek的Ollama部署FastAPI封装调用
本文介绍如何通过Ollama本地部署DeepSeek大模型,结合FastAPI实现API接口调用。涵盖Ollama安装、路径迁移、模型下载运行及REST API封装全过程,助力快速构建可扩展的AI应用服务。
2552 7
|
11月前
|
机器学习/深度学习 算法 量子技术
GQNN框架:让Python开发者轻松构建量子神经网络
为降低量子神经网络的研发门槛并提升其实用性,本文介绍一个名为GQNN(Generalized Quantum Neural Network)的Python开发框架。
290 4
GQNN框架:让Python开发者轻松构建量子神经网络
|
10月前
|
人工智能 自然语言处理 安全
Python构建MCP服务器:从工具封装到AI集成的全流程实践
MCP协议为AI提供标准化工具调用接口,助力模型高效操作现实世界。
1659 1
|
12月前
|
数据采集 数据可视化 JavaScript
用Python采集CBC新闻:如何借助海外代理IP构建稳定采集方案
本文介绍了如何利用Python技术栈结合海外代理IP采集加拿大CBC新闻数据。内容涵盖使用海外代理IP的必要性、青果代理IP的优势、实战爬取流程、数据清洗与可视化分析方法,以及高效构建大规模新闻采集方案的建议。适用于需要获取国际政治经济动态信息的商业决策、市场预测及学术研究场景。
|
12月前
|
数据采集 Web App开发 自然语言处理
利用Python构建今日头条搜索结果的可视化图表
利用Python构建今日头条搜索结果的可视化图表
|
JSON 前端开发 API
使用Python和Flask构建简易Web API
使用Python和Flask构建简易Web API
1157 86
|
机器学习/深度学习 设计模式 API
Python 高级编程与实战:构建 RESTful API
本文深入探讨了使用 Python 构建 RESTful API 的方法,涵盖 Flask、Django REST Framework 和 FastAPI 三个主流框架。通过实战项目示例,详细讲解了如何处理 GET、POST 请求,并返回相应数据。学习这些技术将帮助你掌握构建高效、可靠的 Web API。
|
机器学习/深度学习 设计模式 测试技术
Python 高级编程与实战:构建自动化测试框架
本文深入探讨了Python中的自动化测试框架,包括unittest、pytest和nose2,并通过实战项目帮助读者掌握这些技术。文中详细介绍了各框架的基本用法和示例代码,助力开发者快速验证代码正确性,减少手动测试工作量。学习资源推荐包括Python官方文档及Real Python等网站。

推荐镜像

更多