廖赛恩 杨静
摘 要 中医学的辨证论治思想和因人、因时、因地制宜的治疗原则,赋予了中医临床组方用药的极大灵活性。方剂是按照“君臣佐使”的原则,在辨证论治的基础上,由两味或两味以上的药物组成的有机体,是按照组方原则,通过选择合适药物食物,酌定适当剂量,规定适宜剂型及用法等一系列过程,最后完成的药物治疗处方,是中医理、法、方、药中的重要组成部分。
关键词 中医;药物;处方
引言
方与药之间的关系非常复杂,清代医家徐灵胎曾指出:“方之与药,似合而实离也……圣人为之制方,以调剂之,或用以专攻,或用以兼治,或以相辅者,或以相反者,或以相用者,或以相制者。方之既成,能使药各全其性,亦能使药各失其性,操纵之法有大权焉,此方之妙也。”徐氏“方药离合论”提示方与药的关系可以从“方以药成”和“方药异同”两个层面来理解。前者指方剂由药味组成,后者指方剂与单味药在性能方面存在一定的差异[1,2]。
然而,中药与方剂的功效都是中医基础理论指导下临床经验的总结,两者内涵并无本质区别。许多情况下,方剂与方中诸药的功效基本一致。此时,通过方中药物大致可以判断出该方剂的整体功效。方剂的功效好比一个团队的实力,一个合适的出色的人才来到这个团队会对其实力产生很大的影响,成员之间的相互关系也构成团队实力的重要部分。取长补短,通过合理的组织,使整个团队发挥最大的实力。如同优秀团队理念的核心是人一样,方剂配伍规律的核心就是药物,所以方剂组成的数据预处理是非常重要的工作。
1问题提出
现在让我们看一看方剂中的药物(食物)组成[3]:
方名 方剂组成
牛髓膏子 黄精膏5两,地黄膏3两,天门冬膏1两,牛骨头内油2两。
十正汤 白豆蔻仁、附子(炮,去皮脐)、陈橘皮(去瓤)、丁香(不见火)、白茯苓(去皮)、干姜(炮,洗)、人参(去芦)、白术(炒)、肉豆蔻(面裹煨)、藿香叶(去土)各等分
逡巡酒 桃花3两3钱(3月3日收),马蔺花5两5钱(5月5日收),脂麻花6两6钱(6月6日收),黄甘菊花9两9钱(9月9日收)
资生大造丸 人参2两,山药2两,山茱萸2两,补骨脂2两,五味子1两(去蒂),川牛膝2两,覆盆子1两,楮实子1两,龟板1两(酥炙),鹿角胶2两,生地1两,枸杞子1两,肉苁蓉2两,菟丝子1两,紫河车1具,白茯苓4两,川杜仲2两
从随机抽取的这几个方剂来考虑,我们面对的最大的问题是药物的名称、剂量以及单位混在一起,如“官白芷3钱”,这是需要编写程序把药物的名称、剂量和单位分开,放在不同的字段当中。
除此之外,每味药都有它自身特定的性味、归经、功效等属性,所以必须将切分出来的药物与中药食物表映射起来,为配伍规律的分析研究扫清障碍。
简言之,与中药食物表建立映射就是让程序能“认识”方剂的组成药物。我们建立的中药表共有规范的药物766味,而令人头痛的是没有绝对统一的标准是中医药的特点之一,几乎所有的中药都有一个以上的别名,如大黄(ID:017400),其别名如下[4-6]:
ID 中药名
017402 生军
017403 生大黄
017404 熟大黄
017405 川大黄
017406 川军
017407 酒军
017408 箱黄
017409 箱军
017410 箱大黄
017411 西吉
017412 西庄
017413 西庄黄
017414 庄黄
017415 中吉
017416 蛋吉
017417 片吉
017418 酒大黄
017419 将军
017420 大王
017421 锦纹
017422 川锦纹
017423 锦纹大黄
017424 马蹄黄
017425 火参
017426 黄良
017427 肤如
017428 膚如
因此,把中医古籍中整理出来的方剂剂中的药物,与规范中药食物表映射起来,是一项烦琐艰涩而又必需完成的任务。
2初步预处理
我们对方剂组成字段预处理的目的是把剂量、剂量单位与中药名称或食物名称分离,同时删除与方剂药物组成无关的文字,将中药和食物重新编码索引,使方剂组成数字化,从而得到方剂组成数据集,确保各种数据挖掘算法能顺利实施[4]。
2.1 算法概述
首先将方剂组成字段按标点符号分割,这些标点符号主要有“,。:、”等。这部工作只是程序问题,实现起来比较简单。我们选用 Public String[] split(String regex) 方法。该方法根据给定正则表达式的匹配拆分此字符串。 其作用就像是使用给定的表达式和限制参数 0 来调用两参数 split 方法。因此,所得数组中不包括结尾空字符串。
分割过程中,我们的分割符号默认是“,”号,如果是其他标点符号分割的方剂组成,可以由用户自己选择分割符号。
然后删除或者替换部分与剂量有关的字符,接着进行剂量单位标准统一,确定剂量换算关系。
(1)特定字符的替换
經过对中药或食物名称组成字段的抽样观察分析,在描述中药或食物剂量上存在以下模糊词汇,这些词汇对于中药或食物剂量的整理,只会造成麻烦,而不会有贡献,所以需要删除或用合适恰当的词语要代替。字段末尾的标点符号对结构化无用且构成障碍,因此也施以删除。
算法步骤如下:
1)标点符号全角转半角;
2)删除首尾空格:
选用public String trim()方法。该方法返回字符串的副本,忽略前导空白和尾部空白。返回的字符串移除了前导和尾部空白的副本;如果没有前导和尾部空白,则返回此字符串。
3)模糊词汇删除或替换:
选用public String replace(CharSequencetarget,CharSequence replacement)使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。参数:target - 要被替换的 char 值序列,replacement - char 值的替换序列。
4)字段末尾标点删除:
选用public String replaceAll(String regex,String replacement)使用给定的replacement 替换此字符串所有匹配给定的正则表达式的子字符串。匹配末尾是否为[,\.;\:"'!] 其中之一,若匹配则删除[7-8]。
(2)确立单位换算关系以及中文数字转换
经过对单位的拆分,我们注意到在方剂组成中出现的单位有:“钱 两 分 厘 斤”等等。通过查找相关文献,确定单位换算关系公式:
古代医家对古代方剂用量,虽曾做了很多考证,但至今仍未做出定论。因此,我们只做中文数字的转换,至于换算关系的确定,由使用者自己选择。
2.2 结果分析——中药或食物名称拆分结果分析
经过初步的预处理,方剂组成字段的拆分初步完成。然而在抽样检查中,中药名称(包括食物)的规范准确率(即程序能正确“认出”的中药或食物名称)只有60%左右:
上表所示的是程序识别的中药或食物名称,大部分名称是符合要求的,特别是诸如“没药,木香”等中药名称是完全规范正确的,“龙眼”等食物名称是完全规范正确的,这说明拆分程序是有效果的,可以使用的;但也有许多中药的名称的识别是错误的,如“去皮脐”等。所以方剂组成字段在经过上边初步的整理后,还需要应用新的规则进一步规范、处理。
尽管有许多不尽如人意的地方,但在预处理实现的方剂字段拆分,特别是剂量与中药或食物名称的分离是相当成功的,而且仅就中药或食物名称而言,那些错误的中药或食物名称70%左右出现的次数仅仅只有1到2次,这对于根据关联规则来研究方剂配伍没有多大的影响,因此得到的数据集是可用的。
3中药食物名称的规范
3.1 与中药食物表的映射建立初步
经过初步预处理,主要实现了中药名称(包括食物,下同)与剂量的分离,并且去除了一些对数据挖掘用处不大的数据;但是中药名称只有60%左右能正确识别,其余中药名称尚有许多的不规范和错误,因此进一步规范处理是必要的。“方以药成”,方剂剂配伍规律的研究离不开药物,离不开方中中药的性味,功效,归经,药性的分析,这就提出了一个迫切需要解决的问题,如何将拆分出来的中药食物名称与中药食物表的中药名称映射起来。
而一旦将方剂组成的中药与中药食物表中的数据一一映射起来,则为后续配伍规律的深入研究提供了可能。
3.2 映射建立步骤
我们程序中方剂剂组成字段中药或食物名称的处理并非完美,还有许多细节的工作要做,以期达到更加准确的结果。下面将详细描述中药或食物名称预处理的过程,以期抛砖引玉:
经过细致的分析,认为目前方剂剂组成字段数据整理存在以下问题:
(1) 用来分割中药或食物名称的符号并不一致,大部分是“,”但也有“、;空格”等等。对于这个现状,使用默认+高频标点+自定义解决;
(2) 有些剂量使用中文数字如“一两”,导致中药名称识别成“甘草一两”,进而影响到映射正确率;
(3) 一些炮制方法、中药性状,如研,伴,去皮尖,鲜等,这些词汇的处理较复杂,一般采用人工干预;
(4) 与用药剂量有关系的词汇,如等分、随证、不限、无问、些等,对于这些词汇的处理方法是直接去除,剩下的一般较正确。
处理解决上述问题后,我们将得到的中药或食物名称与中药食物表建立映射。
步骤一:对中药别名进行拆分与编码
为方便处理,我们把常见的中药或食物名称都放入别名表的中药食物名字段,而不严格区分是别名还是加了炮制方法的名称。如007606酒当归 007607炒当归,这样在识别中药名称时就降低了技术难度。
中药或食物名称ID编码的规则是前4位為原有中药或食物的ID,如“015600天花粉”表示天花粉的ID为0156,其中最后两位为‘00表示是规范的中药或食物名称,从‘01-99为中药或食物别名,对于别名的中药名称,通过前4位的代码可以找到规范的中药或食物名称,给中药或食物的匹配带来极大的便利。
步骤二:进行匹配,将前面拆分出来的中药或食物名称一一与中药食物表中的名称进行匹配。对于匹配命中的中药或食物,有两种情况,一种是ID的后两位是‘00,即匹配中的中药或食物名称是规范的名称;第二种是匹配的中药或食物ID后两位是‘01-99中的一个数字,则所匹配的中药或食物名称是别名,取出其ID的前4位,找到该中药或食物别名对应的规范中药食物名称。
步骤三:匹配完毕,方剂剂组成字段的数据表示用新的ID数字表示。
3.3 结果分析
为方便程序处理,本中药食物表尽可能列入详细的中药食物别名,而不是严格意义的中药或食物别名。如黄耆、麦门冬、白茯苓等均视作别名。所以这里的别名还包括约定成俗或不规范的叫法等,主要是让程序能准确“识别”并数字化方剂组成。
匹配中(hit)的中药食物名称是规范的名称的药物(即ID后两位为‘00),频度前11位的中药是: