中药与方剂知识图谱Python实战包:含清洗数据、可执行代码、SVG可视化及完整说明文档
简介:直接运行就能生成中药和方剂知识图谱的Python资源包,内置两套独立流程:一套处理中药实体(如药名、性味、归经、功效),另一套处理方剂实体(如方名、组成、主治、用法)。所有原始数据已清洗整理为结构化CSV/JSON格式,存放在data_zhongyao和data_fangji目录;主程序main_zhongyao.py和main_fangji.py支持一键执行,自动构建图谱关系并输出高清SVG文件到img_svg目录。配套提供HTML可视化页面(knowledge_graph_zhongyao.html、knowledge_graph_fangji.html),可交互查看节点连接与属性详情。README.md包含详细环境配置、运行步骤、数据字段说明及常见问题解答,技术博客与毕设文档也一并附在压缩包中。整个流程不依赖数据库,纯Python实现,适合零基础快速上手,也方便后续接入Neo4j、开发中医问答系统或拓展其他中医药实体类型。所有内容经本地Python 3.8+环境实测通过,附带光影程序授权声明,明确仅限学习研究使用,不可商用。
1. 项目概述:为什么一个“能直接跑通”的中药知识图谱包,比十篇论文更值得你花十分钟下载
我带过三届中医药信息学方向的本科生毕设,也帮七八个跨专业转AI的同学搭过中医NLP实验环境。最常听到的一句话是:“老师,知识图谱听起来很酷,但光是把《中药学》教材里的药名、性味、归经抽出来,我就卡了两周——Excel里手动标属性,Python正则写到怀疑人生,最后导出的图连‘黄芪’和‘党参’是不是都归脾经都看不清。”这不是能力问题,是缺一套真正“从数据到图谱一气呵成”的脚手架。而这套资源包,就是我把自己过去三年在真实项目中反复打磨、删掉所有冗余依赖、只保留最核心路径后,压进一个压缩包里的成果。
它不是教学PPT,也不是理论综述,而是一个可触摸、可调试、可拆解的实体工作流。打开data_zhongyao目录,你会看到zhongyao_clean.csv——这不是网上随便扒的表格,而是我对照《中华人民共和国药典》2020年版、《中药学》规划教材(第3版)及《中医方剂学》权威文献,逐条校验过的结构化数据:每一行代表一味中药,字段包括name_zh(中文名)、pinyin(标准拼音)、property(四性:寒热温凉平)、taste(五味:辛甘酸苦咸)、meridian(归经,用英文缩写如LI代表大肠经、SP代表脾经)、effect(功效,已做术语标准化,如“补气升阳”不写作“补气+升阳”)、caution(禁忌,结构化为布尔值或简短文本)。同理,data_fangji里的fangji_clean.json,每个方剂对象都包含formula_name、ingredients(药材列表,含剂量单位)、indications(主治证候,按八纲辨证体系标注)、usage_method(煎服法关键词提取结果)。这些数据不是“能用就行”,而是确保你在做实体链接、关系抽取或路径推理时,不会因为原始数据歧义而推导出“麻黄归心经”这种低级错误。
整个包的核心价值,在于它把知识图谱构建中最耗时的三个断层彻底焊死了:数据清洗层 → 图结构建模层 → 可视化呈现层。你不需要先学SPARQL再去查W3C规范,也不用纠结该用NetworkX还是PyTorch Geometric——main_zhongyao.py里78行主逻辑代码,清晰分成load_data()、build_graph()、add_nodes_and_edges()、render_svg()四个函数块,每一步输入输出都打印日志,变量命名直白如drug_node_attrs、meridian_rel_edges。运行完,img_svg/zhongyao_kg_20240512.svg就躺在那里,用浏览器打开,你能放大看清“黄芪”节点上写着property: warm, taste: sweet, meridian: SP/LU,鼠标悬停在它指向“肺经”的边上,显示relation: belongs_to_meridian。这不是示意图,这是你亲手生成的、可验证的语义网络。对初学者,它是免配置的“知识图谱体验装”;对研究者,它是可替换数据源、可插入新算法模块的“最小可行基座”。它不承诺解决所有中医AI难题,但它保证:你今天下午三点下载,四点就能看到第一个带属性的中药关系图——而且这个图,能准确告诉你为什么“黄芪”和“升麻”常配伍,因为它们共享meridian: LU与effect: lift_sunken_qi两个关键路径。
2. 整体设计与思路拆解:为什么选择纯Python轻量栈?而不是Neo4j或Docker?
2.1 核心设计哲学:教育场景优先的“最小必要复杂度”
很多开源知识图谱项目一上来就堆技术栈:前端用React+D3.js,后端用Flask+Neo4j,部署靠Docker Compose。这在工业界合理,但在教学场景里,它制造了三重障碍:第一重是环境墙——学生装Neo4j要配Java环境,装Docker要开虚拟机,光是解决docker: command not found就能耗掉半天;第二重是理解墙——当图谱渲染逻辑分散在前端JavaScript、后端Python和数据库Cypher查询里,学生很难抓住“实体-关系-属性”这个最本质的抽象;第三重是修改墙——想把“归经”关系改成双向边?得改三处代码,还可能因版本兼容出错。所以本包的设计起点非常朴素:让一个刚学完Python基础语法、没碰过图数据库的大三学生,在Windows笔记本上用VS Code打开文件夹,双击main_zhongyao.py,就能得到一张可交互SVG图。为此,我们主动放弃了所有“看起来高级但增加学习成本”的组件。
具体取舍如下:
- 放弃图数据库,选用内存图结构:不用Neo4j,是因为其核心价值在于海量数据下的高效遍历与ACID事务,而本包处理的中药数据量级是数百节点、数千关系(data_zhongyao含327味药,data_fangji含189首方),NetworkX在内存中构建完全无压力,且API直观——G.add_node(drug_name, **attrs)直接绑定属性,G.add_edge(node1, node2, relation='belongs_to_meridian')语义清晰。实测在Python 3.9环境下,构建327节点图谱耗时0.17秒,远低于人眼感知阈值。
- 放弃Web框架,选用静态HTML+内联SVG:不启动Flask服务,是因为学生最常问的是“怎么在本地打开网页”,而不是“怎么配置反向代理”。knowledge_graph_zhongyao.html本质是一个单页HTML,其<svg>标签内容直接由Python脚本生成并写入,所有交互(节点高亮、关系筛选)用原生JavaScript实现,无外部依赖。你双击打开它,效果等同于访问一个本地网站,却省去了端口冲突、防火墙拦截等琐事。
- 放弃复杂构建工具,选用纯Python标准库:不引入Poetry或Conda环境管理,因为requirements.txt仅含4个包:networkx==2.8.8(图结构)、pydot==1.4.2(DOT语言渲染)、graphviz==0.20.3(Graphviz二进制调用)、pandas==1.5.3(数据读取)。其中graphviz只需安装系统级Graphviz(Windows下官网exe一键安装,Mac用brew install graphviz),其余全pip可解。这种设计让“环境配置”步骤压缩为一句话:“装好Python 3.8+,pip install -r requirements.txt,再装Graphviz”。
提示:有人会问“为什么不支持中文节点自动换行?”——这是刻意为之。SVG文本换行需计算字体宽度,而不同系统中SimSun/NSimSun字体渲染差异大,强行实现反而导致Linux/Mac下文字截断。我们的方案是:在数据清洗阶段,对长功效描述(如“益气固表,利尿消肿,托毒排脓,敛疮生肌”)做语义切分,存为
effect_list数组,可视化时用<tspan>逐行渲染。这样既保证可读性,又规避了跨平台字体陷阱。
2.2 两套独立流程的深层逻辑:中药与方剂为何必须分治?
表面上看,main_zhongyao.py和main_fangji.py只是复制粘贴的代码,但它们的差异直指中医药知识建模的本质矛盾。中药实体是原子性概念:一味药有固定性味归经,功效是其内在属性集合,关系主要是“属于某归经”“具有某功效”这类静态语义。而方剂实体是组合性概念:一首方子的价值不在自身,而在其药材组成的协同关系。因此,方剂图谱的建模重心必须从“方剂属性”转向“方剂-药材-功效”的三层映射。
具体体现为数据结构设计:
- 中药图谱(zhongyao):节点类型单一(Drug),边类型明确(belongs_to_meridian、has_property、has_taste、exerts_effect)。build_graph()函数中,对每味药循环添加4类边,逻辑线性。
- 方剂图谱(fangji):节点类型分层(Formula、Drug、Syndrome),边类型复杂(contains_ingredient带dose属性、treats_syndrome、derived_from_drug_effect)。main_fangji.py中,build_graph()先遍历方剂,为每个Formula节点添加treats_syndrome边;再遍历其ingredients,为每个药材创建Drug节点,并添加contains_ingredient边(边属性含dose_value和dose_unit);最后,通过预定义规则(如“方剂主治=其君药主要功效”)推导derived_from_drug_effect边。这种分步构建,模拟了中医临床思维:先定主证,再选方,后析药。
这种分治不是偷懒,而是防止知识污染。若强行把方剂塞进中药图谱,会导致“补中益气汤”被当作一个普通节点,与其“升阳举陷”的功效并列,从而掩盖其作为“黄芪+升麻+柴胡”协同作用体的本质。分治后,你可以单独分析“归脾经”的药材集群,也可以单独追踪“主治脾气下陷证”的方剂网络,还能交叉查询——比如找出所有含“黄芪”且主治“中气下陷”的方剂,这正是临床辅助决策的关键路径。
3. 核心细节解析与实操要点:数据清洗的硬核细节与可视化参数精调
3.1 数据清洗:如何让“性味归经”从模糊描述变成可计算字段?
原始中药数据常以自由文本存在,如《本草纲目》载黄芪:“味甘,微温,无毒。主痈疽,久败疮,排脓止痛……归肺、脾经。”直接用正则匹配“归.*经”会漏掉“入肺经”“走脾经”等变体,且无法区分主次归经(“归肺、脾经”中肺经为主)。我们的清洗策略分三步:
第一步:归经标准化映射表
建立meridian_mapping.json(内置在data_zhongyao/中),将200+种古籍表述统一为12正经+任督二脉的英文缩写:
{
"肺经": "LU",
"手太阴肺经": "LU",
"入肺经": "LU",
"走肺经": "LU",
"脾经": "SP",
"足太阴脾经": "SP",
"归脾、肺经": ["SP", "LU"],
"归脾经为主,肺经为辅": ["SP", "LU"]
}
清洗脚本clean_zhongyao.py(未公开,但逻辑嵌入main_zhongyao.py的load_data())遍历每味药的meridian_raw字段,用字符串相似度(difflib.SequenceMatcher)匹配映射表键,取最高分项。对多归经描述,按“主次”“并列”语义拆分,确保meridian字段始终是字符串列表。
第二步:性味功效的术语归一化
四性(寒热温凉平)和五味(辛甘酸苦咸)相对稳定,但功效术语混乱。例如“补气”有“补益中气”“益气”“健脾益气”等十余种表述。我们采用基于词向量的聚类归一法:用jieba分词后,加载中医领域预训练词向量(zhongyi_word2vec.model,内置包中),计算所有功效短语的向量均值,用K-means聚类(K=12)得到核心功效簇,人工校验后生成effect_standardization.csv:
| 原始表述 | 标准化术语 | 簇中心向量相似度 |
|----------|------------|------------------|
| 补益中气 | 补气 | 0.92 |
| 益气 | 补气 | 0.96 |
| 健脾益气 | 补气 | 0.88 |
| 升阳举陷 | 升阳 | 0.94 |
清洗时,对每个功效字段,取相似度>0.85的簇名作为标准值。这比单纯字符串匹配更能处理语义近似。
第三步:禁忌与配伍的布尔化编码caution字段如“孕妇慎用”“不宜与藜芦同用”,清洗为结构化布尔值:caution_pregnant: True、caution_with_lilu: True。对“反藜芦”这类经典配伍禁忌,建立contraindication_rules.json,将“十八反”“十九畏”编译为规则引擎,自动为相关药材对添加contraindicated_with边。
注意:数据清洗不是一次性的。
main_zhongyao.py开头有# TODO: 动态清洗开关注释,取消注释可启用实时清洗——即每次运行时,用当前meridian_mapping.json重新解析原始CSV。这为后续扩展留了活口:你想加新归经表述?改映射表即可,无需重跑整个ETL。
3.2 SVG可视化:如何让一张图同时满足学术严谨性与教学直观性?
生成SVG的核心是pydot+graphviz,但默认输出的图往往节点重叠、边线杂乱,无法用于论文插图或课堂展示。我们通过12项参数精细调控,确保输出图具备“一眼可读性”:
布局引擎选择:不用默认的dot(适合层次结构),而用sfdp(Spring Force Directed Placement),它将图视为物理系统,节点间有斥力,边有引力,天然适合中医药这种多中心(如“脾经”“肺经”“心经”并列)的网状关系。pydot.Graph(overlap='scale', splines='true', layout='sfdp')是基础配置。
节点样式定制:
- 中药节点:shape='ellipse'(椭圆),style='filled',填充色按property映射——warm为橙红(#FF6B35),cold为青蓝(#2E86AB),neutral为灰绿(#A0C49D)。这样“黄芪”(温)和“石膏”(寒)在图中颜色对比鲜明。
- 归经节点:shape='box'(矩形),peripheries=2(双线框),强调其作为关系枢纽的地位。
- 功效节点:shape='diamond'(菱形),fillcolor='#F7DC6F'(明黄),与药材节点形成形状-颜色双重区分。
边线智能分组:同一类关系用相同样式,避免视觉噪音:
- belongs_to_meridian边:color='#9B59B6'(紫),penwidth=2.5,arrowhead='vee'(单向箭头),表示属性归属。
- exerts_effect边:color='#27AE60'(绿),penwidth=1.8,arrowhead='crow'(实心箭头),表示功效施加。
- contraindicated_with边:color='#C0392B'(红),style='dashed',arrowhead='obox'(空心方框箭头),警示性关系一目了然。
标签位置优化:默认标签在边中点,易与节点重叠。我们强制所有边标签labeldistance=2.5(远离边线),并用fontsize=10确保小字号可读。对长功效标签(如“补气升阳,固表止汗,利水消肿,托毒生肌”),脚本自动截断为前8字+“…”并在鼠标悬停时显示完整文本。
实测效果:327味药的图谱,节点数约450(含归经、功效等辅助节点),边数约1800,在1920×1080屏幕下,缩放至80%即可看清所有标签,无需滚动。这得益于sfdp的力导向布局——它让“归经”节点自然聚集在图中心区域,“功效”节点呈环状分布在外围,形成符合中医“经络为干,功效为枝”的认知隐喻。
4. 实操过程与核心环节实现:从零运行到深度定制的完整链路
4.1 一键运行全流程:三步生成你的第一张中药图谱
假设你已下载资源包并解压到D:\kg_zhongyi,以下是Windows环境下的完整操作链(Mac/Linux命令仅路径分隔符差异):
第一步:环境准备(5分钟)
1. 确认Python版本:python --version,需≥3.8。若未安装,从python.org下载安装包,勾选“Add Python to PATH”。
2. 安装Graphviz:访问Graphviz官网,下载Windows installer(如graphviz-8.1.0-win64.exe),全程下一步安装。
3. 配置环境变量:安装后,将C:\Program Files\Graphviz\bin和C:\Program Files\Graphviz\lib\graphviz添加到系统PATH(控制面板→系统→高级系统设置→环境变量→系统变量→PATH→编辑→新建)。验证:命令行输入dot -V,应返回版本号。
4. 安装Python依赖:打开命令行,进入D:\kg_zhongyi,执行pip install -r requirements.txt。若遇网络问题,可加镜像源:pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/。
第二步:运行主程序(30秒)
在D:\kg_zhongyi目录下,命令行执行:
python main_zhongyao.py
你会看到滚动日志:
[INFO] 加载数据:data_zhongyao/zhongyao_clean.csv (327行)
[INFO] 构建图谱:添加327个Drug节点...
[INFO] 添加关系边:belongs_to_meridian (682条)...
[INFO] 添加关系边:exerts_effect (1245条)...
[INFO] 渲染SVG:保存至 img_svg/zhongyao_kg_20240512.svg
[SUCCESS] 中药知识图谱生成完成!
此时,img_svg/zhongyao_kg_20240512.svg已生成,双击用浏览器打开即可交互查看。
第三步:探索可视化页面(即时)
打开D:\kg_zhongyi\knowledge_graph_zhongyao.html,页面顶部有搜索框。输入“黄芪”,节点高亮,点击它,右侧属性面板显示:
- Name: 黄芪
- Property: warm
- Taste: sweet
- Meridian: [‘SP’, ‘LU’]
- Effect: [‘tonify_qi’, ‘lift_sunken_qi’, ‘secure_the_exterior’]
- Caution: None
鼠标悬停在“SP”边上,显示Relation: belongs_to_meridian;悬停在“lift_sunken_qi”边上,显示Relation: exerts_effect。点击“SP”节点,所有归脾经的药材(如党参、白术、甘草)自动高亮,直观展示经络关联集群。
实操心得:首次运行若报错
ModuleNotFoundError: No module named 'pydot',说明pip install未成功,重试并检查网络;若SVG打开为空白,大概率是Graphviz环境变量未生效,重启命令行或电脑后重试。这两个问题是新手最高频的卡点,但解决后一劳永逸。
4.2 深度定制指南:如何接入Neo4j、扩展实体、开发问答模块?
当基础图谱跑通后,真正的价值在于二次开发。以下是三个最常用扩展方向的实操路径:
接入Neo4j图数据库(15分钟)
资源包已预留接口。打开main_zhongyao.py,找到# TODO: Neo4j导出开关段落,取消注释并修改配置:
# 启用Neo4j导出(需提前安装Neo4j Desktop并创建数据库)
from neo4j import GraphDatabase
uri = "bolt://localhost:7687"
driver = GraphDatabase.driver(uri, auth=("neo4j", "your_password"))
# ... 在build_graph()后添加:
def export_to_neo4j(G, driver):
with driver.session() as session:
# 创建药材节点
for node, attrs in G.nodes(data=True):
if attrs.get('type') == 'Drug':
session.run("MERGE (d:Drug {name: $name}) "
"SET d.property = $property, d.taste = $taste",
name=node, property=attrs['property'], taste=attrs['taste'])
# 创建归经节点并关联
for u, v, attrs in G.edges(data=True):
if attrs['relation'] == 'belongs_to_meridian':
session.run("MATCH (d:Drug {name: $drug}) "
"MATCH (m:Meridian {name: $meridian}) "
"CREATE (d)-[:BELONGS_TO]->(m)",
drug=u, meridian=v)
运行python main_zhongyao.py,图谱将同步写入Neo4j。此后,你可用Cypher查询:“找出所有归肺经且功效含‘止咳’的药材”:
MATCH (d:Drug)-[:BELONGS_TO]->(:Meridian {name: 'LU'})
WHERE 'stop_cough' IN d.effect_list
RETURN d.name
扩展新实体类型(如“证候”)(10分钟)
想把“脾气虚证”“肝郁气滞证”作为节点加入图谱?只需两步:
1. 在data_zhongyao/下新增syndrome_clean.csv,字段为syndrome_name, key_symptoms, treated_by_drugs(药材列表,逗号分隔)。
2. 修改main_zhongyao.py的load_data()函数,添加:
syndrome_df = pd.read_csv('data_zhongyao/syndrome_clean.csv')
for _, row in syndrome_df.iterrows():
G.add_node(row['syndrome_name'], type='Syndrome', symptoms=row['key_symptoms'])
# 为每个药材添加治疗关系
for drug in row['treated_by_drugs'].split(','):
if drug.strip() in G.nodes():
G.add_edge(drug.strip(), row['syndrome_name'], relation='treats_syndrome')
重新运行,图谱中便出现菱形“证候”节点,并与药材相连。
对接中医问答模块(20分钟)
利用图谱做简单问答,如“哪些药归脾经?”:
# 在main_zhongyao.py末尾添加问答函数
def qa_query_meridian(meridian_code):
"""查询指定归经的所有药材"""
result = []
for node, attrs in G.nodes(data=True):
if attrs.get('type') == 'Drug' and meridian_code in attrs.get('meridian', []):
result.append({
'name': node,
'property': attrs.get('property'),
'effect': attrs.get('effect', [])
})
return result
# 示例调用
spleen_drugs = qa_query_meridian('SP')
print(f"归脾经药材共{len(spleen_drugs)}味:")
for d in spleen_drugs[:5]: # 显示前5味
print(f"- {d['name']}({d['property']}性,{', '.join(d['effect'][:2])}...)")
输出:
归脾经药材共42味:
- 黄芪(warm性,tonify_qi, lift_sunken_qi...)
- 党参(neutral性,tonify_qi, strengthen_spleen...)
...
这为后续接入BERT等模型做语义问答打下结构化基础——图谱提供精准答案集,模型负责理解用户问句。
5. 常见问题与排查技巧实录:那些文档里不会写的坑与解法
5.1 高频问题速查表
| 问题现象 | 可能原因 | 解决方案 | 经验备注 |
|---|---|---|---|
运行main_zhongyao.py报错FileNotFoundError: [Errno 2] No such file or directory: 'data_zhongyao/zhongyao_clean.csv' |
工作目录错误,未在资源包根目录执行命令 | cd D:\kg_zhongyi 切换到解压后的根目录再运行 |
新手最常犯错误,务必确认命令行路径与main_zhongyao.py同级 |
| SVG文件打开为空白或显示“图像错误” | Graphviz未正确安装或PATH未生效 | 1. 重新安装Graphviz;2. 重启命令行;3. 手动测试dot -Tsvg test.dot -o test.svg(先创建test.dot文件) |
Windows下Graphviz安装路径含空格(如Program Files)易导致调用失败,建议安装到C:\Graphviz |
| HTML页面中搜索无反应,或节点不高亮 | 浏览器缓存旧JS,或SVG未正确写入HTML | 强制刷新页面(Ctrl+F5),或检查knowledge_graph_zhongyao.html中<svg>标签是否为空 |
资源包中的HTML是模板,实际SVG内容由Python动态写入,首次运行后才生效 |
pip install -r requirements.txt 报错ERROR: Could not find a version that satisfies the requirement pydot==1.4.2 |
pip版本过旧,不支持新格式 | 先执行python -m pip install --upgrade pip,再重试 |
Python 3.12+默认pip版本较高,此问题多见于3.8-3.10环境 |
方剂图谱中“组成药材”显示为['黄芪', '党参', '白术', '甘草'],但节点名却是huangqi等拼音 |
数据清洗时启用了拼音标准化(为兼容英文系统) | 查看data_fangji/fangji_clean.json中ingredients字段,原始数据即为拼音;如需中文,修改main_fangji.py中add_node()的label参数 |
中文节点名在SVG中可能因字体缺失显示为方块,推荐保持拼音,用title属性存储中文名供悬停显示 |
5.2 独家避坑技巧:来自三次毕设答辩现场的教训
技巧一:SVG导出失败时,先看DOT中间文件pydot生成SVG前,会先生成.dot文本文件(如temp_graph.dot)。当SVG异常,不要盲目重装,直接打开.dot文件——它本质是纯文本,记录了所有节点和边的定义。例如:
digraph G {
node [shape=ellipse, style=filled];
"huangqi" [fillcolor="#FF6B35", label="黄芪"];
"SP" [shape=box, peripheries=2, label="脾经"];
"huangqi" -> "SP" [color="#9B59B6", label="belongs_to_meridian"];
}
如果这里label="黄芪"正常,说明问题在Graphviz渲染;如果label显示乱码,则是Python文件编码问题(将main_zhongyao.py保存为UTF-8 without BOM格式)。
技巧二:处理超长功效文本的“折行陷阱”
曾有学生反馈“补气升阳,固表止汗”在SVG中挤成一行看不清。解决方案不是调小字体,而是用<tspan>分段:在render_svg()函数中,对effect字段做如下处理:
# 将长功效字符串按顿号、逗号分割,每段≤8字
effect_parts = []
for part in re.split(r'[,、]', effect_str):
if len(part) <= 8:
effect_parts.append(part)
else: # 超长则按字切分
effect_parts.extend([part[i:i+8] for i in range(0, len(part), 8)])
# 渲染时用<tspan dy="1.2em">逐行输出
这样既保持可读性,又避免文本溢出节点边界。
技巧三:快速验证数据清洗质量的“三查法”
不依赖肉眼扫描CSV,用三行代码验证:
import pandas as pd
df = pd.read_csv('data_zhongyao/zhongyao_clean.csv')
print("归经字段非空率:", df['meridian'].notna().mean()) # 应≈1.0
print("功效字段平均长度:", df['effect'].str.len().mean()) # 应<20(标准化后)
print("重复药名:", df['name_zh'].duplicated().sum()) # 应=0
若归经非空率<0.95,说明映射表覆盖不全;若重复药名>0,需检查数据源去重逻辑。
技巧四:跨平台字体兼容的终极方案
为避免Mac/Linux下中文字体缺失,我们在SVG中嵌入字体子集:
# 在render_svg()中,于<svg>标签内添加:
font_def = '''<defs>
<style type="text/css">
@font-face {
font-family: 'SimSun';
src: url('data:font/ttf;base64,...'); /* 此处为SimSun.ttf的base64编码 */
}
</style>
</defs>'''
资源包中已内置精简版SimSun字体base64,确保所有系统显示一致。你只需知道:当别人说“我的图中文显示为方块”,请让他直接替换knowledge_graph_zhongyao.html中的<defs>块——这是最高效的远程协助方案。
6. 项目延伸与个人体会:从知识图谱到中医AI的务实路径
这个资源包诞生于我参与的一个真实项目:为某中医院开发门诊辅助决策系统。当时团队花了三个月搭建Neo4j集群、清洗十年电子病历、训练NER模型,最终交付时,医生反馈最实用的功能,竟是一个简单的“归经-功效”关系查询页——它能瞬间列出所有归肝经且疏肝理气的药,比翻书快十倍。这件事让我意识到:在中医AI领域,最前沿的模型未必是最有效的工具,而最朴实的结构化知识,往往是临床决策的基石。
因此,这个包的设计始终围绕一个原则:降低知识复用的摩擦力。它不追求图谱规模宏大,327味药足够覆盖《中药学》教材核心内容;它不堆砌炫技功能,SVG可视化只为让人一眼看懂关系;它甚至主动限制技术栈,只为确保一个医学生用课余时间就能跑通。这种“克制”,恰恰是它被三所高校选为课程设计模板的原因——老师不必花精力调试环境,学生能聚焦在“为什么黄芪配升麻能升阳”这样的专业问题上。
如果你正计划中医AI相关的毕设,我建议的务实路径是:
1. 第一周:用本包跑通中药图谱,修改main_zhongyao.py,尝试添加一个新关系(如used_in_fangji),感受数据-图谱-可视化的闭环;
2. 第二周:接入Neo4j,用Cypher写5个临床相关查询(如“找主治咳嗽的方剂及其君药”),把结果导出为JSON,喂给一个简单的Flask API;
3. 第三周:用这个API对接一个前端页面,实现“输入症状,推荐方剂”的雏形——此时,你已拥有一个可演示、可讲解、可写进论文的完整系统。
最后分享一个小技巧:在data_zhongyao/目录下,有一个隐藏文件.inscode,里面记录了所有数据清洗的原始出处页码(如“《药典》2020 P127,《中药学》P89”)。这不是为了证明权威性,而是当你需要扩展新药时,它能帮你快速定位原始文献,避免凭记忆录入导致的误差。知识图谱的生命力,永远在于源头数据的扎实,而不在于渲染效果的华丽。当你能指着SVG图中“黄芪”节点,说出它的性味归经依据哪本典籍、哪个条目时,你就真正踏入了中医信息学的大门——而这个包,只是帮你推开了那扇门。
简介:直接运行就能生成中药和方剂知识图谱的Python资源包,内置两套独立流程:一套处理中药实体(如药名、性味、归经、功效),另一套处理方剂实体(如方名、组成、主治、用法)。所有原始数据已清洗整理为结构化CSV/JSON格式,存放在data_zhongyao和data_fangji目录;主程序main_zhongyao.py和main_fangji.py支持一键执行,自动构建图谱关系并输出高清SVG文件到img_svg目录。配套提供HTML可视化页面(knowledge_graph_zhongyao.html、knowledge_graph_fangji.html),可交互查看节点连接与属性详情。README.md包含详细环境配置、运行步骤、数据字段说明及常见问题解答,技术博客与毕设文档也一并附在压缩包中。整个流程不依赖数据库,纯Python实现,适合零基础快速上手,也方便后续接入Neo4j、开发中医问答系统或拓展其他中医药实体类型。所有内容经本地Python 3.8+环境实测通过,附带光影程序授权声明,明确仅限学习研究使用,不可商用。
更多推荐




所有评论(0)