当前位置: 首页 > news >正文

F040 python中医药图谱问答|双推荐算法+知识图谱+智能问答+vue+flask+neo4j前后端分离B/S架构|爬虫|图谱生成|全套

文章结尾部分有CSDN官方提供的学长 联系方式名片
博主为全网中医知识图谱+大模型类项目道祖

关注B站,有好处!

编号: 🌿 F040

视频讲解

https://www.bilibili.com/video/BV15g4y1N7dx/

1 前言

技术架构:Vue+flask+neo4j
系统简介:本系统是一个基于Vue+Flask+Neo4j+MySQL的中医药图谱问答系统,其核心功能围绕中医药数据的展示、智能问答、推荐算法及用户管理展开。主要包括:首页,用于展示系统概览和轮播图;数据卡片,提供中医药数据的概览,并支持通过Neo4j数据库进行深入浏览及用户点赞“喜欢”的功能;可视化模块,通过D3.js实现中医药知识图谱的可视化展示,支持数据检索和关键词提取;智能问答模块,利用知识图谱和自然语言处理技术为用户提供关于药物构成和治疗方案的智能咨询;推荐算法模块,结合UserCF和ItemCF算法,为用户提供个性化的中药药方推荐;文本分析模块,对中医药文本进行关键词提取、功效分析以及词云生成,帮助用户理解中医药信息;搜索模块,支持中药和药方的快速检索;以及用户管理模块,包含登录与注册功能,和个人设置(允许用户修改个人信息、头像及密码),确保系统的安全性和个性化体验。
该系统采用典型的B/S(浏览器/服务器)架构模式。用户通过浏览器访问Vue前端界面,该前端由HTML、CSS、JavaScript以及Vue.js生态系统中的Vuex(用于状态管理)、Vue Router(用于路由导航)和D3.js(用于数据可视化)等组件构建。前端通过API请求与Flask后端进行数据交互,Flask后端则负责业务逻辑处理,并利用SQLAlchemy(或类似ORM工具)与MySQL数据库进行持久化数据存储。此外,系统还包含一个独立的爬虫模块,负责从外部来源抓取药材、药方等中医药相关数据,并将其导入Neo4j数据库,为整个系统提供数据支撑。Neo4j数据库用于存储和管理中医药知识图谱数据,支持高效的查询和检索功能。

2 实现思路 & 项目特性

这个项目中比较困难的部分是知识图谱的可视化,因为我们使用vue来开发前端,我们使用也是选中了echarts 和 d3.js 两种不同的实现方式:
在这里插入图片描述

3 功能设计

  • 药材数据的爬取:中药的信息从网上进行爬取;
  • 方剂数据导入:以excel方式导入到mysql、neo4j数据库中;
  • 智能问答,基于模型的药方中医疾病知识问答;
  • 两种推荐算法推荐药方;
  • 方剂药材的知识图谱可视化;
  • 方剂、药材的关键词分析;

3.1 逻辑架构图 && 功能模块图

在这里插入图片描述
在这里插入图片描述

3.2 设计背景

随着中医药现代化建设的推进,传统中药知识的数字化表达与智能化应用面临重大挑战。当前中药领域存在两大核心问题:

  1. 数据孤岛现象严重:方剂、药材、性味归经等关键信息分散在文献典籍与网络资源中,缺乏统一的结构化整合
  2. 知识关联分析薄弱:传统文献检索难以直观呈现方剂与药材间复杂的"君臣佐使"关系网络,制约了中医药知识的传承与创新应用
    为解决上述痛点,本项目设计开发了基于知识图谱的中药知识分析系统。通过:
    ✔️ 构建结构化中药数据库(整合1200+经典方剂与580+中药材数据)
    ✔️ 建立多维关系图谱(方剂-药材-功效-症候四维关联模型)
    ✔️ 开发可视化分析工具(支持动态关系探索与数据挖掘)
    实现三大核心价值:
    🔍 知识结构化:将百度文库获取的原始方剂数据与网络爬取的药材数据,经人工校验后构建标准化知识体系
    🌐 关系可视化:创新采用双引擎图谱渲染(d3.js力导向图+Echarts关系图),直观展示中药配伍网络
    📊 智能分析:通过关键词抽取与词云分析技术,揭示方剂主治症候的分布规律
    项目响应《"十四五"中医药信息化发展规划》提出的"构建中医药知识服务系统"要求,为临床用药分析、方剂配伍研究、中医药教学提供数字化支撑平台,推动中医药知识从静态文献向动态智能服务的转化。### 3.3 技术选型
    语言与框架: Vue、Python3.8、Flask等
    数据库: MySQL5.7、Neo4j3.5 (双数据库)、LTP(智能问答)
    关键技术: d3js(知识图谱)、echarts(可视化)、pandas等
    开发时间:

4功能实现

4.1 中医药数据爬取

  1. 读取 http://www.zhongyoo.com/name/ 网中药药材信息;
  2. 爬取图片;
  3. 选择需要存入数据库的列,然后进行数据清洗,重新设置列名称,存入数据库中。
    Flask端与neo4j的交互,并且给前端提供封装好的数据(模糊搜索查询接口、这里两种知识图谱可视化要求的json数据不同,需要分开开发)默认一次显示50个药方,已实现模糊搜索接口,d3js 力导向图方式的可视化
    在这里插入图片描述

4.2 知识图谱的构造

利用python代码进行知识图谱的构造:
在这里插入图片描述
在neo4j自带的浏览器中进行查看:
在这里插入图片描述

4.3 neo4j知识图谱的可视化

Neo4j 按照某个属性来搜索,后台对应不同的方法即可
中药数据可视化与知识图谱
采用d3.js实现的知识图谱
在这里插入图片描述
实现对知识图图谱的查询,基于dj.js的知识图谱,支持方剂名称、来源典籍、主治症候 三种类型的模糊查询与可视化:
在这里插入图片描述

4.4 主页

主页: 轮播图、中药方剂信息卡片展示
在这里插入图片描述

4.5两种推荐算法药方推荐

在这里插入图片描述
在这里插入图片描述

4.6 搜索药方 和 搜索药材

搜索方剂:模糊搜索方剂,展示信息卡片
在这里插入图片描述
药材详情:
在这里插入图片描述
搜索药材:模糊搜索药材,展示信息卡片
在这里插入图片描述

4.7 数据分析

数据可视化大屏:中药方剂、药材的可视化分析,主要用echarts、d3.js的技术实现多维度分析
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/70686bfe80614fb8a5ea001db555ed51.png

4.8 文本数据分析

关键词分析,采用主题词提取、textrank算法、tf-idf算法实现的关键词提取:
在这里插入图片描述
词云分析:实现一个中药方剂的【主治症候】的词云
在这里插入图片描述### 4.9 智能问答
实现智能问答,对药方、疾病治疗方法的问答:
在这里插入图片描述

4.10 个人设置

设置功能(修改用户信息、头像)
在这里插入图片描述
修改密码
在这里插入图片描述
登录:
在这里插入图片描述
注册:
在这里插入图片描述

5 文档截图

高达12000字的详细说明文档,从需求设计、概要设计、数据库设计到详细设计、测试结果无所不包:
在这里插入图片描述

6 程序代码

6.1 概要介绍

代码说明:本中药知识图谱系统基于Vue.js 2.0实现,采用响应式数据驱动设计理念。系统核心包含三个数据模型:方剂、药材和属性,构成知识图谱的核心节点。系统使用计算属性动态构建节点间关系:方剂与药材的组成关系,药材与属性的关联关系。图谱可视化方面,动态计算节点位置关系并自适应生成连接线。组件化开发将界面拆分为方剂列表、知识图谱和详细信息三大模块,实现高内聚低耦合。交互功能包括节点点击查看详情、图谱重新布局等功能。UI设计采用自然和谐的绿色色调,符合中医药传统审美,并通过卡片、节点和动效增强视觉层级。系统兼具知识展示与学习功能,帮助用户直观理解中药材之间的复杂关系网络。

6.2 流程图

在这里插入图片描述

6.3 代码实例

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>中药方剂与药材知识图谱系统</title><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css"><script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script><style>* {margin: 0;padding: 0;box-sizing: border-box;font-family: 'Microsoft YaHei', sans-serif;}body {background: linear-gradient(135deg, #1a4620, #2d5e2d, #1a4620);color: #f0f0f0;min-height: 100vh;padding: 20px;}.container {max-width: 1200px;margin: 0 auto;}header {text-align: center;padding: 30px 0;margin-bottom: 20px;background: rgba(0, 30, 0, 0.7);border-radius: 15px;box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);border: 1px solid rgba(80, 120, 80, 0.5);}h1 {font-size: 2.8rem;margin-bottom: 15px;color: #d8e9a0;text-shadow: 0 0 10px rgba(216, 233, 160, 0.5);letter-spacing: 2px;}.subtitle {font-size: 1.1rem;color: #c8e080;max-width: 800px;margin: 0 auto;line-height: 1.6;}.main-content {display: flex;flex-wrap: wrap;gap: 25px;margin-top: 20px;justify-content: center;}.panel {background: rgba(0, 20, 0, 0.85);border-radius: 15px;padding: 25px;box-shadow: 0 8px 32px rgba(0, 0, 0, 0.6);border: 1px solid rgba(80, 140, 80, 0.4);transition: transform 0.3s ease;flex: 1;min-width: 300px;max-width: 600px;}.panel:hover {transform: translateY(-5px);}.panel-header {display: flex;justify-content: space-between;align-items: center;margin-bottom: 25px;padding-bottom: 15px;border-bottom: 2px solid rgba(100, 180, 100, 0.4);}.panel-title {font-size: 1.6rem;color: #aff5d0;display: flex;align-items: center;}.panel-title i {margin-right: 12px;color: #70d070;}.tcm-card {background: rgba(5, 40, 5, 0.9);border-radius: 12px;padding: 20px;margin-bottom: 18px;border: 1px solid rgba(80, 160, 80, 0.3);transition: all 0.3s ease;cursor: pointer;}.tcm-card:hover {background: rgba(10, 60, 10, 0.9);transform: translateX(5px);border-color: rgba(120, 200, 120, 0.5);}.tcm-card h3 {color: #c8f0a0;margin-bottom: 10px;font-size: 1.4rem;display: flex;align-items: center;}.tcm-card h3 i {margin-right: 10px;color: #a0e060;}.tcm-info {display: flex;flex-wrap: wrap;gap: 15px;}.info-item {background: rgba(10, 50, 10, 0.7);padding: 8px 15px;border-radius: 20px;font-size: 0.9rem;color: #e0f0b0;display: flex;align-items: center;}.info-item i {margin-right: 6px;color: #80d080;}.kg-component {height: 450px;background: rgba(0, 20, 0, 0.8);border-radius: 15px;display: flex;flex-direction: column;overflow: hidden;position: relative;}.kg-header {padding: 20px;background: rgba(0, 40, 0, 0.7);border-bottom: 1px solid rgba(80, 140, 80, 0.4);display: flex;justify-content: space-between;}.kg-body {flex: 1;display: flex;justify-content: center;align-items: center;position: relative;overflow: hidden;}.graph-container {position: relative;width: 90%;height: 90%;}.graph-info {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);background: rgba(0, 20, 0, 0.9);padding: 30px;border-radius: 15px;border: 2px solid rgba(100, 200, 100, 0.4);max-width: 480px;text-align: center;z-index: 10;box-shadow: 0 0 30px rgba(0, 0, 0, 0.8);}.legend {display: flex;justify-content: center;gap: 20px;margin-top: 20px;flex-wrap: wrap;}.legend-item {display: flex;align-items: center;}.legend-color {width: 20px;height: 20px;border-radius: 50%;margin-right: 8px;}.legend-formula {background: #aabb40;}.legend-herb {background: #5a9965;}.legend-property {background: #4a7799;}.selected-info {margin-top: 25px;background: rgba(0, 30, 0, 0.7);padding: 25px;border-radius: 15px;}.info-grid {display: grid;grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));gap: 20px;margin-top: 15px;}@media (max-width: 768px) {.main-content {flex-direction: column;}.panel, .kg-component {max-width: 100%;}h1 {font-size: 2.2rem;}}.relation-line {position: absolute;height: 3px;background: linear-gradient(90deg, transparent, #80ff80, transparent);transform-origin: 0 0;}.node {position: absolute;width: 100px;height: 100px;border-radius: 50%;display: flex;align-items: center;justify-content: center;text-align: center;font-weight: bold;padding: 10px;cursor: pointer;transition: all 0.4s ease;box-shadow: 0 5px 15px rgba(0, 0, 0, 0.4);z-index: 2;}.node:hover {transform: scale(1.1);z-index: 3;}.formula-node {background: radial-gradient(circle, #aabb40, #667a2a);color: #1a3000;}.herb-node {background: radial-gradient(circle, #5a9965, #3a6340);color: #d0f0d0;}.property-node {background: radial-gradient(circle, #4a7799, #2a4559);color: #e0f0ff;}button {background: linear-gradient(to right, #3a6340, #2a4a30);color: #e0f0e0;border: none;padding: 12px 25px;border-radius: 30px;cursor: pointer;font-size: 1rem;font-weight: bold;margin-top: 15px;transition: all 0.3s ease;box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);}button:hover {background: linear-gradient(to right, #4a7450, #305a38);transform: translateY(-3px);box-shadow: 0 6px 15px rgba(0, 0, 0, 0.4);}.highlight {animation: pulse 2s ease-in-out infinite;box-shadow: 0 0 15px #aaffaa;}@keyframes pulse {0% { box-shadow: 0 0 5px #aaffaa; }50% { box-shadow: 0 0 20px #aaffaa; }100% { box-shadow: 0 0 5px #aaffaa; }}</style>
</head>
<body><div id="app"><div class="container"><header><h1><i class="fas fa-leaf"></i> 中药方剂与药材知识图谱</h1><p class="subtitle">探索中药方剂组成、药材属性及其关系。本知识图谱展示了方剂、药材、药用属性三者之间的复杂关系网络。</p></header><div class="main-content"><div class="panel"><div class="panel-header"><h2 class="panel-title"><i class="fas fa-prescription-bottle-alt"></i> 方剂列表</h2></div><div class="tcm-card" v-for="formula in formulas" :key="formula.id" @click="selectNode(formula)" :class="{'highlight': selectedNode === formula}"><h3><i class="fas fa-file-medical"></i> {{ formula.name }}</h3><div class="tcm-info"><div class="info-item"><i class="fas fa-list-alt"></i> {{ formula.category }}</div><div class="info-item"><i class="fas fa-user-md"></i> {{ formula.source }}</div><div class="info-item"><i class="fas fa-seedling"></i> {{ formula.ingredients.length }} 味药材</div></div></div></div><div class="kg-component"><div class="kg-header"><h2 class="panel-title"><i class="fas fa-project-diagram"></i> 知识图谱</h2><button @click="randomLayout">重新排列布局</button></div><div class="kg-body"><div class="graph-container"><div class="relation-line" v-for="(line, index) in relationLines" :key="index" :style="lineStyle(line)"></div><div class="node" v-for="node in allNodes" :key="node.id" :class="node.type + '-node highlight'":style="nodeStyle(node)"@click="selectNode(node)">{{ node.shortName || node.name }}</div><div v-if="!allNodes.length" class="graph-info"><h3><i class="fas fa-info-circle"></i> 知识图谱信息</h3><p>图谱中的节点表示中药方剂、药材及其属性,线条表示它们之间的关系。</p><div class="legend"><div class="legend-item"><div class="legend-color legend-formula"></div><div>方剂</div></div><div class="legend-item"><div class="legend-color legend-herb"></div><div>药材</div></div><div class="legend-item"><div class="legend-color legend-property"></div><div>属性</div></div></div><p style="margin-top: 20px;">点击任意节点查看详细信息</p></div></div></div></div></div><div v-if="selectedNode" class="selected-info"><h2 class="panel-title"><i class="fas fa-info-circle"></i> {{ selectedNode.name }} 详细信息</h2><div class="info-grid"><div class="tcm-card"><h3><i class="fas fa-tag"></i> 基本信息</h3><p v-if="selectedNode.category"><strong>分类:</strong> {{ selectedNode.category }}</p><p v-if="selectedNode.source"><strong>来源:</strong> {{ selectedNode.source }}</p><p v-if="selectedNode.effect"><strong>功效:</strong> {{ selectedNode.effect }}</p><p v-if="selectedNode.property"><strong>属性:</strong> {{ selectedNode.property }}</p></div><div class="tcm-card" v-if="selectedNode.ingredients"><h3><i class="fas fa-seedling"></i> 组成药材</h3><div class="info-item" v-for="(ing, idx) in selectedNode.ingredients" :key="idx"><i class="fas fa-cannabis"></i> {{ ing.name }} ({{ ing.part }})</div></div><div class="tcm-card" v-if="selectedNode.composition"><h3><i class="fas fa-flask"></i> 主要化学成分</h3><div class="info-item" v-for="(chem, idx) in selectedNode.composition" :key="idx"><i class="fas fa-atom"></i> {{ chem }}</div></div></div></div></div></div><script>new Vue({el: '#app',data: {formulas: [],herbs: [],properties: [],selectedNode: null,nodePositions: {}},computed: {allNodes() {return [...this.formulas, ...this.herbs, ...this.properties];},relationLines() {const lines = [];// 添加方剂 -> 药材的关系this.formulas.forEach(formula => {formula.ingredients.forEach(ing => {const herb = this.herbs.find(h => h.id === ing.id);if (herb) {lines.push({from: formula,to: herb});}});});// 添加药材 -> 属性的关系this.herbs.forEach(herb => {if (this.properties.length) {const relatedProp = this.properties[Math.floor(Math.random() * this.properties.length)];lines.push({from: herb,to: relatedProp});}});return lines;}},mounted() {this.fetchData();},methods: {fetchData() {// 模拟数据获取this.formulas = [{id: 'f1',name: '桂枝汤',shortName: '桂枝汤',type: 'formula',category: '解表剂',source: '《伤寒论》',effect: '解肌发表,调和营卫',ingredients: [{id: 'h1', name: '桂枝', part: '嫩枝'},{id: 'h2', name: '芍药', part: '根'},{id: 'h3', name: '甘草', part: '根及根茎'},{id: 'h4', name: '生姜', part: '根茎'},{id: 'h5', name: '大枣', part: '果实'}]},{id: 'f2',name: '四物汤',shortName: '四物汤',type: 'formula',category: '补血剂',source: '《太平惠民和剂局方》',effect: '补血调血',ingredients: [{id: 'h6', name: '当归', part: '根'},{id: 'h7', name: '川芎', part: '根茎'},{id: 'h8', name: '白芍', part: '根'},{id: 'h9', name: '熟地黄', part: '块根'}]}];this.herbs = [{id: 'h1', name: '桂枝', shortName: '桂枝', type: 'herb', property: '辛、甘,温', effect: '发汗解肌,温通经脉'},{id: 'h2', name: '芍药', shortName: '芍药', type: 'herb', property: '苦、酸,微寒', effect: '养血调经,敛阴止汗'},{id: 'h3', name: '甘草', shortName: '甘草', type: 'herb', property: '甘,平', effect: '补脾益气,清热解毒'},{id: 'h4', name: '生姜', shortName: '生姜', type: 'herb', property: '辛,微温', effect: '解表散寒,温中止呕'},{id: 'h5', name: '大枣', shortName: '大枣', type: 'herb', property: '甘,温', effect: '补中益气,养血安神'},{id: 'h6', name: '当归', shortName: '当归', type: 'herb', property: '甘、辛,温', effect: '补血活血,调经止痛'},{id: 'h7', name: '川芎', shortName: '川芎', type: 'herb', property: '辛,温', effect: '活血行气,祛风止痛'},{id: 'h8', name: '白芍', shortName: '白芍', type: 'herb', property: '苦、酸,微寒', effect: '养血调经,平肝止痛'},{id: 'h9', name: '熟地黄', shortName: '熟地', type: 'herb', property: '甘,微温', effect: '补血养阴,填精益髓'}];this.properties = [{id: 'p1', name: '辛温解表', shortName: '辛温解表', type: 'property', composition: ['挥发性油', '生物碱']},{id: 'p2', name: '养血活血', shortName: '养血活血', type: 'property', composition: ['多糖类', '皂苷类']},{id: 'p3', name: '补气健脾', shortName: '补气健脾', type: 'property', composition: ['多糖类', '氨基酸']}];// 初始化节点位置this.randomLayout();},randomLayout() {// 随机生成节点位置const positions = {};const containerWidth = 800;const containerHeight = 300;// 方剂节点在左侧this.formulas.forEach((formula, i) => {positions[formula.id] = {x: 100,y: 100 + i * 100};});// 药材节点在中间this.herbs.forEach((herb, i) => {positions[herb.id] = {x: 300 + i%3 * 150,y: 100 + Math.floor(i/3) * 150};});// 属性节点在右侧this.properties.forEach((prop, i) => {positions[prop.id] = {x: 700,y: 150 + i * 100};});this.nodePositions = positions;},nodeStyle(node) {const pos = this.nodePositions[node.id] || {x: 0, y: 0};return {left: `${pos.x}px`,top: `${pos.y}px`,width: node.shortName ? '100px' : '110px',height: node.shortName ? '100px' : '110px',};},lineStyle(line) {const from = this.nodePositions[line.from.id] || {x: 0, y: 0};const to = this.nodePositions[line.to.id] || {x: 0, y: 0};const dx = to.x - from.x;const dy = to.y - from.y;const length = Math.sqrt(dx * dx + dy * dy);const angle = Math.atan2(dy, dx) * 180 / Math.PI;return {left: `${from.x + 50}px`,top: `${from.y + 50}px`,width: `${length}px`,transform: `rotate(${angle}deg)`};},selectNode(node) {this.selectedNode = node;}}});</script>
</body>
</html>
http://www.dtcms.com/a/545943.html

相关文章:

  • 南京做网站企业如何建网站做推广
  • 网页设计素材螺蛳粉图seo 网站两个ip
  • Blender骨骼笔记
  • 6.4 大数据方法论与实践指南-计算成本治理(省钱)
  • 开发BUG修复汇总(持续更新)
  • html5网站模板怎么用个人社保缴费证明怎么查询
  • 网站规划思想方法有哪些内容手机微网站平台登录入口
  • 【docker】bashrc文件的合理配置
  • Docker Desktop 安装教程和最佳实践
  • 6 mysql对order by group by join limit count的实现
  • Rust:Trait 抽象与 unsafe 底层掌控力的深度实践
  • 安全员C证(全国版)模拟考试练习题答案解析
  • (huawei)最小栈
  • 四川建设网官网住房和城乡厅网站文字很少怎么做优化
  • apache 配置网站茶叶网站源码php
  • 南昌自主建站模板建设标准网站
  • PyTorch 基础详解:tensor.item() 方法
  • 外贸网站 php基于云平台网站群建设
  • 产品设计网站官网制作人是做什么的
  • 【每天一个知识点】“社区检测”(Community Detection)
  • 建站之星 discuz广州开发区东区
  • 04-函数与模块-练习
  • 网站seo教材中国建设银行校园招聘网站
  • 原型样网站做网站代理
  • 临海响应式网站设计wordpress移动应用
  • Rust生命周期与泛型的组合使用深度解析
  • 张家港网站建设服务全网营销公司排名前十
  • 网站建设廴金手指花总壹陆陈村九江网站建设
  • 合并两个排序的链表
  • 网站维护和建设工作范围昆明网站建设电话