基于 Apriori 算法的中药配伍审查系统
项目介绍
本系统是一个基于经典 Apriori 关联规则挖掘算法的中药配伍审查平台,使用真实中医药处方数据集(PTM-TKDE2018),实现药材频繁项集挖掘、关联规则生成与配伍禁忌审查。
核心功能
- 数据导入:一键下载并导入真实 PTM 处方数据集到 SQLite(约 811 味药材、6693 条处方事务)
- Apriori 挖掘:频繁项集与关联规则挖掘,支持度/置信度/提升度(lift)可调
- 配伍审查:十八反/十九畏禁忌检测 + 低支持度警告 + 关联规则建议(含药名别名匹配)
- 批量审查:支持多张处方批量审查
- 药材共现分析:指定药材的共现频次统计
- 数据看板:Chart.js 可视化展示高频药材与挖掘历史
- REST API:14 个 API 端点,完整覆盖业务功能
- 审查日志与挖掘历史记录
数据来源
| 数据 | 来源 | 用途 |
|---|
| 药材与处方事务 | PTM-TKDE2018 herbs_contains.txt + pre_herbs.txt | Apriori 事务挖掘 |
| 配伍禁忌 | data/forbidden_canonical.json(药典十八反、十九畏整理,41 条) | 硬性禁忌审查 |
| 药材属性(可选) | DragonTCM | 性味归经增强 |
仅供教学研究,不可替代临床审方。
目录结构
apriori-zhongyao-check/
├── app.py # Flask 主应用(路由定义 + 启动入口)
├── config.py # 应用配置(阈值、数据库路径、分页等)
├── requirements.txt # Python 依赖
├── mac_run.sh # macOS 一键启动脚本
├── window_run.bat # Windows 一键启动脚本
├── 项目说明.md # 本文件
├── 挖掘手册.md # Apriori 挖掘参数与数据集说明
│
├── core/ # 核心算法
│ ├── __init__.py
│ ├── apriori.py # Apriori 频繁项集与关联规则挖掘
│ └── reviewer.py # 配伍审查逻辑(禁忌检测 + 关联建议 + 同义词标注)
│
├── database/ # 数据库层
│ ├── __init__.py
│ ├── db.py # SQLite 访问层(连接管理 + 缓存 + 全部 CRUD)
│ └── importer.py # 数据导入(PTM 文件解析 + 禁忌规则写入)
│
├── routes/ # 路由层
│ ├── __init__.py
│ └── api.py # REST API 蓝图(14 个端点)
│
├── services/ # 服务层
│ ├── __init__.py
│ └── mining.py # Apriori 挖掘服务(参数回退 + 结果持久化)
│
├── scripts/ # 运维脚本
│ ├── download_datasets.py# 从 GitHub/HuggingFace 下载数据集
│ ├── setup_all.py # 一键:下载 → 导入 → 挖掘
│ └── init_and_mine.py # 初始化数据库 + 执行挖掘
│
├── data/ # 数据目录
│ ├── forbidden_canonical.json # 十八反/十九畏禁忌规则
│ ├── tcm.db # SQLite 数据库(运行时生成)
│ ├── raw/ # 原始数据文件
│ │ ├── herbs_contains.txt # PTM 药材名索引(811 行)
│ │ ├── pre_herbs.txt # PTM 处方事务(数值索引,7189 行)
│ │ └── prescriptions.txt # PTM 原始文本方(98334 行,未接入导入)
│ └── imported/ # 已导入数据备份目录
│
├── templates/ # Jinja2 HTML 模板(12 个页面)
│ ├── base.html # 基础布局(导航栏 + 页脚)
│ ├── index.html # 首页(统计概览 + 高频药材图表)
│ ├── dashboard.html # 数据看板(挖掘历史 + 审查日志)
│ ├── check.html # 单方配伍审查
│ ├── batch.html # 批量配伍审查
│ ├── herbs.html # 药材库列表
│ ├── herb_detail.html # 药材详情 + 共现分析
│ ├── prescriptions.html # 方剂库列表
│ ├── forbidden.html # 十八反/十九畏规则表
│ ├── rules.html # Apriori 关联规则 + 频繁项集 + 重新挖掘
│ ├── dataset.html # 数据集说明
│ └── api_docs.html # REST API 文档
│
├── static/
│ └── css/style.css # 自定义样式
│
└── 运行步骤必看/
└── window.md # Windows 运行步骤说明
运行环境
| 项目 | 要求 |
|---|
| Python | >= 3.12 |
| 操作系统 | macOS / Linux / Windows |
| 数据库 | SQLite 3(Python 内置,无需额外安装) |
| 网络 | 首次运行需联网下载 PTM 数据集 |
| 依赖 | Flask >= 3.0、Werkzeug >= 3.0、datasets >= 2.14(可选) |
端口与访问
| 项目 | 值 |
|---|
| 默认端口 | 5050 |
| 环境变量覆盖 | PORT |
| 访问地址 | http://127.0.0.1:5050 |
| API 文档 | http://127.0.0.1:5050/api-docs |
技术架构
浏览器 ←→ Flask (Jinja2 模板 + REST API)
↕
SQLite (tcm.db)
↕
Apriori 算法 + 禁忌审查引擎
↕
PTM-TKDE2018 真实处方数据集
模块职责
| 模块 | 文件 | 职责 |
|---|
| 主应用 | app.py | Flask 应用工厂、页面路由、启动入口、自动引导挖掘 |
| 配置 | config.py | 最小支持度/置信度/提升度、数据库路径、分页大小、密钥 |
| 算法 | core/apriori.py | Apriori 频繁项集挖掘与关联规则生成 |
| 审查 | core/reviewer.py | 禁忌规则检测、低支持度警告、关联规则建议、同义词标注 |
| 数据库 | database/db.py | 连接管理(上下文管理器)、事务缓存、全部 CRUD 操作 |
| 导入 | database/importer.py | PTM 文件解析、药材/处方入库、禁忌规则写入、配置持久化 |
| API | routes/api.py | REST API 蓝图,14 个端点,JSON 输入输出 |
| 挖掘服务 | services/mining.py | 封装 Apriori 执行、参数回退、结果持久化、缓存失效 |
| 下载 | scripts/download_datasets.py | 从 GitHub/HuggingFace 下载数据集到 data/raw/ |
| 初始化 | scripts/init_and_mine.py | 建表 → 导入 → 挖掘(三步合一) |
| 一键部署 | scripts/setup_all.py | 下载 → 导入 → 挖掘(四步合一) |
页面功能
| 页面 | 路由 | 功能 |
|---|
| 首页 | / | 统计概览(药材数/处方数/规则数)、Top 20 高频药材柱状图 |
| 配伍审查 | /check | 输入药材名 → 返回禁忌/警告/建议 |
| 批量审查 | /batch | 多处方批量审查 |
| 药材库 | /herbs | 药材列表(分页、搜索) |
| 药材详情 | /herbs/<name> | 单味药材共现分析、关联规则 |
| 方剂库 | /prescriptions | 处方列表(分页、搜索) |
| 禁忌规则 | /forbidden | 十八反/十九畏规则表 |
| 关联规则 | /rules | 关联规则表 + 频繁项集 + 重新挖掘(参数可调) |
| 数据看板 | /dashboard | 挖掘历史趋势、审查日志 |
| 数据集 | /dataset | PTM 数据集说明 |
| API 文档 | /api-docs | REST API 端点文档 |
REST API 列表
| 方法 | 路径 | 功能 |
|---|
| GET | /api/statistics | 系统统计(药材数/处方数/规则数等) |
| POST | /api/review | 单方配伍审查 {"herbs": ["甘草","海藻"]} |
| POST | /api/review/batch | 批量审查 {"prescriptions": [["甘草","海藻"],["人参","黄芪"]]} |
| GET | /api/herbs | 药材列表(分页、搜索) |
| GET | /api/herbs/<name> | 药材详情与共现 |
| GET | /api/prescriptions | 处方列表(分页、搜索) |
| GET | /api/forbidden | 十八反/十九畏规则 |
| GET | /api/rules | 关联规则列表(分页) |
| GET | /api/itemsets | 频繁项集列表(分页) |
| POST | /api/mine | 重新执行 Apriori 挖掘 |
| GET | /api/config | 获取当前挖掘参数 |
| GET | /api/dataset-meta | 数据集元信息 |
| GET | /api/mining-history | 挖掘历史 |
| GET | /api/review-logs | 审查日志 |
算法说明
Apriori 算法
Apriori 是经典的关联规则挖掘算法,核心思想:如果一个项集是频繁的,则它的所有子集也是频繁的(Apriori 性质)。算法流程:
- 扫描事务数据库,统计每个单项的支持度,过滤低于
min_support 的项 - 逐层产生候选项集:由 k-频繁项集连接生成 (k+1)-候选项集
- 剪枝:移除包含非频繁 k-子集的候选项集
- 计数:再次扫描数据库,统计候选项集支持度
- 重复直到无法生成更大的频繁项集(受
max_k 限制) - 生成规则:对每个频繁项集,计算所有非空子集的置信度和提升度,保留满足
min_confidence 和 min_lift 的规则
关键参数
| 参数 | 默认值 | 说明 |
|---|
min_support | 0.02 | 最小支持度,项集至少在 2% 的处方中出现 |
min_confidence | 0.5 | 最小置信度,规则 A→B 的置信度至少 50% |
min_lift | 1.0 | 最小提升度,大于 1 表示正相关 |
max_k | 4 | 最大项集大小,防止组合爆炸 |
审查逻辑
配伍审查分三层检测:
- 禁忌层(硬性):十八反/十九畏,命中即标记为
forbidden - 警告层(软性):药材组合的支持度低于
min_support,标记为 warning - 建议层(参考):与已输入药材相关的关联规则,标记为
info;同义词对额外标注 ⚠可能是同义词/包含关系
数据流程
PTM 数据集 (GitHub/HuggingFace)
↓ scripts/download_datasets.py
data/raw/herbs_contains.txt + pre_herbs.txt
↓ database/importer.py
SQLite (tcm.db): herbs + prescriptions + forbidden_rules
↓ core/apriori.py + services/mining.py
SQLite: frequent_itemsets + association_rules + apriori_config
↓ core/reviewer.py
配伍审查结果 (forbidden / warning / info)
↓ routes/api.py + app.py
浏览器 (HTML / JSON)
许可证
本项目仅供学习交流使用,请勿用于商业用途。
源码地址:https://www.aiyuanma.vip/posts/apriori-zhongyao-check