gephi和python_Python语言结合Gephi对中医方剂简单可视化

曾经读了那么多中医书,历史上那么多浩瀚的方剂方名,印象都渐渐模糊。但是,作为基本构件,那些中药之间的联系,确是令人难忘的,比如芍草药对,比如桑菊药对。

本文目的,旨在通过可视化分析第七版中医方剂学药物联系,来加深认知中药网络的联系。当对中药网络有了更深的认知,就会避免盲目地记忆、搜罗处方、验方,从而让方剂为我所用。

快速复现操作流程如下

1.项目呈现

以上是一张药物网络关系图,绿色-平和,蓝色-寒凉,红色-温热。

它基于第七版中医方剂学的一百八十一个代表方中药物的共现关系而得出。

当然,它也可以调换背景,字色如以下这样。

2.项目启发点

这源于我在网上看到的的实验。Python 基于共现提取《釜山行》人物关系_Python_实验楼 - 实验楼。也可以在简书上简易观看图文Python 自然语言处理 入门——提取《釜山行》的人物关系 。

16年末,实验楼用python的jieba分词,提取出人名,基于共现,最终从釜山行小说的每一段落中都提取出人物关系,并在最后汇总关系,生成csv文件,用gephi导入csv,并设置参数,最后导出如下的人物关系图。从下图可以看出,主人公是一名叫做石宇的人类。

这样的呈现方式,有两个优点。1)从节点大小和节点中心化程度,反映了人物权重。2)从节点之间的边,以节点间的距离,反映了人物间联系与紧密程度。

3.项目推衍

如果我们可以将小说中每个段落中的人物关系都提取出来

那么我们也可将方剂书每个方剂中的药物关系都提取出来

所以我们完全可以将这种处理方式迁移过来

4.项目改进

当然,我们要做一些改进,变动如下。

1) 不再使用jieba库,改用自建药物列表

jieba库对人名有更好的识别,可以归类人名为nr,但是还没有药名识别。

我之前也试用jieba的自定义词典方法,但效果欠佳,比如对于药物青木香,如果词典里有木香和青木香这两个不同的药物,jieba就会将青木香分出两个词,造成混淆。

所以我们新采用了自建列表方法,将之置放在表格文档中。

2)加入药性选项,对节点颜色赋能

如果一个药材从颜色上标注了它的药性,那么这张网络图将更有意义,更加丰富。

事实上你会发现,在药物网络图的中心,平性药茯苓、芍药、生甘草、炙甘草占据了主导。

3)自建方剂文件

对一百八十一个方剂进行录入,包括方名以及药物组成,并用空格来切割每个药物。这样也会让python的spilt(' ')方法更好应用。

5.项目准备

工具(有三):安装好python,python是现在最流行的编程语言,素有“伪代码”之称,并pip install xlrd 库(这将用于读取表格文件)。gephi,它可以将所有对象以网络化展示。

文档(有二):一个存有一百八十一个方剂的txt文档,一个有270味药的含药名、药性的表格词典。【事实上这里面的药物名称、药性肯定会有争议。比如张仲景方中的人参可否更改成党参,以及人参的性味倒地是寒是热。当然我在方剂学语义下选择尊重教科书,所以选择使用中药学教科书所记载的药物。事实上在另一个伤寒论项目中,我使用了神农本草经与名医别录的药性,它的描述与现在差别较大,比如人参是微寒的】

文档都是我一字一字打出来的,已载在文末,当然你也可以自己收集。比如一本臻至化境的《未刻本叶天士医案》。

6.复习一下项目流程简图

7.项目代码

我直接上代码了,可以直接粘贴走,讲解都在代码块里了

win10、python3环境

# -*- coding: utf-8 -*-import os, sys,xlrd,codecs, mathpp=os.getcwd() #获得当前路径yao_ming_list=[] #药名列表yao_xing_list=[] #药性列表yao_dict = {}# 药名-出现次数(即权重)字典 {'麻黄':4 ,‘桂枝’:22, }relationships = {}# 关系字典 { '麻黄': { '桂枝':2,‘生甘草’:3} , }lineYaos = []# 每段内药物关系 da_ta = xlrd.open_workbook('%s\\yao_ming_xing_wei.xlsx'% (pp))table_ling = da_ta.sheets()[0]hangshu_ling = table_ling.nrowsfor i in range(0,hangshu_ling): print(i) #以下载入药名药性 row_ling_data=table_ling.row_values(i) yao_ming=table_ling.cell_value(i,0) yao_xing=table_ling.cell_value(i,2) yao_ming_list.append(yao_ming) yao_xing_list.append(yao_xing)#print(yao_ming_list,yao_xing_list)with codecs.open('%s\\chu_fang.txt'% (pp), 'r', 'utf8') as f:for line in f.readlines(): #print(line)以下导入处方 wo_rds = line.split( ) lineYaos.append([]) for wo_rd in wo_rds: if wo_rd in yao_ming_list: lineYaos[-1].append(wo_rd) if yao_dict.get(wo_rd) is None: yao_dict[wo_rd] = 0 relationships[wo_rd] = {} yao_dict[wo_rd] +=1 #print(wo_rd)#print(yao_dict,lineYaos)for line in lineYaos: for yao0 in line: for yao1 in line: if yao0 == yao1: continue if relationships[yao0].get(yao1) is None: relationships[yao0][yao1]=1 else: relationships[yao0][yao1] = relationships[yao0][yao1] + 1#print(relationships)#以下生成节点和边with codecs.open('%s\\node.txt'% (pp), 'w', 'gbk') as f: f.write('Id Label Weight Yaoxing\r\n') for yao_er, yao_er_cishu in yao_dict.items(): xuhao_yaoming=yao_ming_list.index(yao_er) yaoxing_node=yao_xing_list[xuhao_yaoming] f.write(yao_er + ' ' + yao_er + ' '+ str(yao_er_cishu) + ' ' + yaoxing_node + '\r\n')with codecs.open('%s\\edge.txt'% (pp), 'w', 'gbk') as f: f.write('Source Target Weight\r\n') for zhu_yao, edges in relationships.items(): for fu_yao, pin_ci in edges.items(): if pin_ci > 0: f.write(zhu_yao + ' ' + fu_yao + ' ' + str(pin_ci) + '\r\n')os.rename('%s\\node.txt'% (pp),'%s\\node.csv'% (pp))os.rename('%s\\edge.txt'% (pp),'%s\\edge.csv'% (pp))

这就是代码,在这个项目文件夹下有3样东西,一是py文件,二是记载药物性味xlsx,三是记载处方txt。这三个文件我都打包好了。如下图

你只需要在Github的nibabaa/Fang-ji-gephi-pyhton,如下图,点击绿的的Clone or Download就行。

解压文件后,进入文件夹,依然是下面这张图。

Win10做法是长按住shift键,右键单击出菜单,然后点进Powershell,然后在窗口中输入pythongua.py 即可生成node.csv与edge.csv文件。如下图

然后打开gephi软件,点新建工程,然后左上角文件-导入电子表格,先选入node.csv,显示了一堆乱码,不要紧,点击字符集,按下g,选GBK即可正常显示。

然后默认点击。

然后继续左上角文件-导入电子表格,选edge.csv,在下图这一步时选择Append to existing选项,然后默认点击。

然后会出现以下这样的黑点与边

在左侧外观选项卡-节点-(颜色)-Partition,选择渲染模式如下图,class by yao xing ,然后长按方形小色卡自由选色,效果如下

然后点击布局-选择一个布局-Force Atlas,选择中意的斥力强度,点击运行,效果如下

然后自己调节标签和字体

文末展示一个视频

再重复放一遍地址,nibabaa/Fang-ji-gephi-pyhton

如果你得到了好的反馈,请评论给我,让我有进步的动力

如果你得到不好的反馈,也请评论给我,让我有进步的空间

以上,谢谢

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值