人工智能自动组方实习笔记5—中医数据预处理流程

文章目录

  • 症状数据预处理
    • 基于编辑距离的症状同义词字典
    • 基于部位+描述词的症状同义词字典
  • 药物数据预处理
    • 操作流程

本文将记录在人工智能智能组方实习中有关数据预处理的总结,有如果有哪位小伙伴在做相关内容,可以发邮件联系([email protected])与我互相学习
以下为该项目的系列文章
工作记录
萤火虫算法
FCM模糊C聚类
爬虫及python代码
数据预处理
中医分类及python代码
数据预处理python代码
基于字典的最大正向匹配
基于欧式距离的方剂推荐
基于方剂相似性的方剂推荐
GitHub地址

在本次实习中我们使用的数据是网上爬取的相关中医方剂数据集和中医药物数据集,通过人工实体标注得到了方剂数据中的“主治”字段的“症状”“证型”“治法”“病名”四个属性值,其中“症状”属性作为我们的主要属性值进行操作,因为中医文本的特殊性,所以前期需要对该属性值进行预处理。
在网上爬取的中医药物数据共12470个药物,因为中医药物数据的特殊性,需要前期对其进行预处理。

症状数据预处理

将人工实体标注出来的主治字段中病症实体建立同义词字典。因为在中医在长时间的积累中因为表达和描述不同中存在很多同意不同词的现象,或者是同一个病症但因为临床表现不同也将其记录为两个病症,这种现在使得病症数据集维度变大并且变得十分稀疏,所以需要我们在前期数据处理中需要建立中医病症同义词字典,将意思相同的病症均记录下来并形成字典键值对,将字典的键值作为该病症的标准描述方法。例如在{“月经不调”:’月水不调’,’月水不利’,’月经不行’,’月经不通’}这组字典键值对当中月经不调、月水不调、月水不利、月经不行、月经不通等词汇描述的是同一个病症但表达方法不同,所以我们将这五个词形成一个字典,其中“月经不调”作为标准描述方法。如果在其他的药方或者病案中出现如月水不调、月水不利等词汇时统一转换为“月经不调”这一标准描述方法。

基于编辑距离的症状同义词字典

因为很多中医病症的描述方法都很接近,例如月经不调和月水不调只是有一个字不同而已,因此在这里我们使用字符串编辑距离(Levenshtein距离)来计算两个词字符串之间的相似度。设置莱文斯坦比的阈值为0.6,及如果两个词的莱文斯坦比大于等于0.6我们认为这两个词之间有相关性,并暂时将其放在一个字典里,将全部病症计算过编辑距离之后在根据中医相关知识人工处理一遍该字典以保证正确率。
Levenshtein距离就是从一个字符串修改到另一个字符串时,其中编辑单个字符(比如修改、插入、删除)所需要的最少次数。计算字符串编译距离的方法如下所示:
我们将病症A和病症B表示为字符序列A[1…i]、B[i…j],其中i,j分别为序列A和序列B的长度值,则我们将问题转化为如何将字符串A[1…i]修改到字符串B[1…j]:
A : A [ 1 ] A [ 2 ] ⋯ A [ i − 1 ] A [ i ] B : B [ 1 ] B [ 2 ] … B [ j − 1 ] B [ j ] A :A[1] A[2]⋯A[i-1] A[i] \\ B: B[1]B[2]…B[j-1]B[j] A:A[1]A[2]A[i1]A[i]B:B[1]B[2]B[j1]B[j]

对于插入操作而言,当前所需操作次数operation1,是,把一个字符A[X]=B[Y]插入到A[α]和"A" [“α+1” ]之间用来匹配B[Y],则所需操作数为operation1+1:
A [ α − 1 ]    A [ X ] A [ α ] B [ Y − 1 ] B [ Y ] A [ Y + 1 ] A[\alpha-1]\;A[X]A[\alpha]\\ B[Y-1]B[Y]A[Y+1] A[α1]A[X]A[α]B[Y1]B[Y]A[Y+1]
对于删除操作而言,当前所需操作次数operation2,是,删除一个字符A[X]来使得两个字符串匹配,则所需操作数为operation2+1:
A [ α − 1 ] A [ ϕ ] A [ α ] B [ Y − 1 ] B [ Y ] A [ Y + 1 ] A[\alpha-1]A[\phi]A[\alpha]\\ B[Y-1]B[Y]A[Y+1] A[α1]A[ϕ]A[α]B[Y1]B[Y]A[Y+1]
对于替换操作而言,当前所需操作次数operation3,是,把一个字符A[α]替换为A[X]用来匹配B[Y],则所需操作数为operation3+2:
A [ α − 1 ] A [ X ] A [ α ] B [ Y − 1 ] B [ Y ] A [ Y + 1 ] A[\alpha-1]A[X]A[\alpha]\\ B[Y-1]B[Y]A[Y+1] A[α1]A[X]A[α]B[Y1]B[Y]A[Y+1]
综上所述,将字符串A修改为字符串B时采用的是动态规划的思想,具体方法如下:
人工智能自动组方实习笔记5—中医数据预处理流程_第1张图片
其中a,b为两个字符串的长度。
莱文斯坦比的计算公式如下所示:
r = s u m − l d i s t s u m r= {sum-ldist\over sum} r=sumsumldist
其中sum是指词字符串str1和str2的长度总和,ldist是指莱文斯坦距离。
此时将病症集中出现次数为0、1、2的病症删除,病症集被处理为165维的字典。对于每一个药方主治字段的病症而言,将其转化为一个1165维的onehot向量,及如果药方中出现了某个病症就在该病症的向量位置赋值为1,没有则赋值为0。至此我们将数据集处理为165271维的onehot矩阵,每一列为一个药方的病症onehot向量。

基于编辑距离建立症状同义词字典的相关问题

  1. 因为历史原因,很多的病症存在一词多义和多词一意的情况,如果单纯的按照编辑距离操作的话,会出现一个词在编辑距离上和很多个词都有相似性,这个时候就需要交给人工判断是否输入同一个意思
  2. 通过人工判断之后的病症归在了同一意思(及同一行上),但是这个时候还需要人工处理来得到一个准确的分类(单纯的通过字面意思无法得到是否是一个意思,还需要大量的人工)
  3. 在缺少专业知识的背景下,有些词容易出现张冠李戴,或者是有些词的重要性没有被标注出来(例如:咳嗽、烦嗽,其内涵并不是同一个意义,其中烦嗽意义更广)

基于部位+描述词的症状同义词字典

在症状描述中,很多词都可以拆分为部位+描述词,例如 腹痛 可以被拆分为 腹(部位)+ 痛(描述词),则可以经过两次定位计算两个症状是否是同义词,进而得到同义词字典。
对于两个症状,第一次定位到部位词:腹痛和小腹痛 的部位词腹、小腹是同义词,则进行第二次定位到修饰词 痛、痛 是同义词,则这两个病症可以认为是同义词。
采用这种方法建立同义词需要部位同义词字典和描述同义词字典。在第一次定位时通过部位同义词字典,第二次定位通过描述词同义词字典。如果这两个同义词比较健全的话,那么对于这种类型的症状分类效果较好。
如果这两个同义词字典不是很健全的话,可以设置两次定位的权值大小来进行判断;例如设置第一次定位权值是0.8,第二次定位权值是0.7,则认为第一次定位的准确性是80%,第二次是70%。权值大小需要通过两个字典的情况具体确定。
基于部位+描述词的症状同义词字典的相关问题

  1. 需要建部位+描述词的同义词字典,增加了工作量,这两个字典的准确性会影响到后期症状同义词字典的准确性。
  2. 对于其他的不是部位+描述词类型的病症处理效果很差,例如 感冒,无法建立同义词对
  3. 不同的权值对于准确性有影响,但是还需要多次试验才能得到较好的版本。
  4. 对于描述词比较复杂的症状、或者是在描述词字典中没有记录的症状,效果很差,在后期仍然需要人工处理
    ##基于国标的症状同义词
    网上有国家标准版的症状词及对应的症状描述词(2000个),对于国标症状可以认为这2000个症状可以完全描述人体的所有症状,则个人数据集中的症状描述词都应该是2000个症状的子集,都应该将个人数据统一在国标版本上。对于模糊的症状描述都因该按照国标(例如 恶露不绝与产后恶露不绝这两个症状,在国标版中是一个描述词,则我们认为这两个词就是一个意思;感冒与经行感冒着两个症状,在国标版中是两个词,则我们认为这两个词是两个意思)。
    操作方法可以通过编辑距离计算症状名称与国标的差异性进行归类,或者通过网络爬虫得到其症状描述与国标版本比较差异性找到最相似的的国标症状进行归类,或者通过部位+描述词的方法找到症状应该归类的国标版本,或者通过人工处理对于症状将每个症状归类到国标中。
    基于国标的症状同义词字典的相关问题
  5. 国标版本症状数量较小而且是对所有的症状的描述,粒度较大,可是在数据集中的症状粒度较小,如果强行进行归类的话,会将丢失掉部分信息
  6. 在初次归类的时候方法不确定,如果全部人工的话工作量太大但是绝对准确;如果采用其他方法的话,对操作之后的同义词还需要人工处理提高准确性。
  7. 人工处理是免不了的,就需要处理该数据的人需要对国标数据集有整体认知,需要快速找到症状的所属大概位置并找到其准确的症状描述。

药物数据预处理

对于中医数据来说,所有的方剂数据中的药物都需要在自己的药物数据中得到一一对应,这样才可以准确的得到每个方剂的与药相关的信息(性味、归经、功效、主治)。我们认为方剂的信息与该方剂内的药物信息是相同的,暂时不考虑药物组合之后相关信息发生了化学变化这种,只单纯的认为信息是相加关系。
因为历史及地域原因,中医药物有很多的别名,而且会出现别名相同但药物名称不同的情况,并且药物名称很不规范,导致了在药物对应时有很多的坑。所以我们只能认为我们的药物数据集是完整并且是名称唯一的,将方剂中的药物对应到药物数据集中,而不是对药物数据集本身进行操作。
对于药物数据集,本次实习感觉比较好的数据是**中国医药信息查询平台**所提供的数据信息,该数据集为中国中医信息学会整理的,相对而言比较准确。

操作流程

  1. 对于通过代码分开的药物数据应该先进行一步人工处理,将剂量和那些无法统一处理得药物词统一删去,这样既减少了工作量,又减少了后期处理得难度。
  2. 对于方剂数据集中的药物在药物数据集中的名称进行匹配(完全匹配),如果完全匹配则得到对应,如果无法对应则进行到第2步
  3. 对于无法在名称进行匹配的药物,通过网络爬虫在百度百科进行搜索,如果能够搜索到,记录下该药物的中文名称和别名,对于这个药物的中文名称和别名再在药物数据集中进行查找,如果能完全匹配到则得到了该对应,如果无法查找到则进行第三步
  4. 对于药物在药物数据集中的别名进行匹配(字符串匹配),如果只匹配到一个别名,则对应到该别名药物的标准描述上;如果匹配到好几个别名则先记录下来待以后再处理
  5. 对于无法通过名称匹配、别名匹配、百度百科搜索得到名称别名、百度百科搜索别名在药物集中匹配都无法得到的药物,将其记录下来以此进行人工处理,人工进行查找

药物数据处理的相关问题

  1. 在方剂数据集中通过split()函数得到分隔开的药物,很多都要有描述词,对于这些描述词现在很困惑,只能粗暴的将其删去
  2. 对于药物剂量问题,很多药物的剂量并不标准,比如一茶盏一片一片一枚这样的描述目前不知道怎么操作
  3. 对于炮制过的药物(比如姜制),其实药物的性味已经发生了变化,但是在《中华本草》上并没有区分开,只能粗暴的将其统一为一个药物,这一点以后需要改进
  4. 中医药物并没有一个完全正确完全标准的数据集,只能是按照自己的数据集去对应一个比较好的药物数据即可,至于如何对于中医方剂中的药物进行一一对应,这一点以后需要改进
    #病机数据预处理
    对于每一个方剂所治疗的症状集可以总结到一个病机上去,该病机总结概括了这个症状集合的中医方面的信息,但是因为历史问题,病机的描述和病症集和病机名称都不相同,这是个大坑!!!原来同一本书的不同版本描述都不同!!!,则在此需要有一个统一的标准,根据这个标准进行操作。
    本次实习我们使用的是《中医妇科学(第10版)》和国标版本的病机信息。但是这个书的病机描述粒度比较粗,国标版本的病机信息非常的细,将每个类型都分的很细,在此使用的时候应该用一个统一的标准并且定义准确的粒度。对于从细粒度到粗粒度的病机,可以将细粒度病机的症状求交集的方式得到粗粒度病机的症状,但是该做法会丢失掉相关信息而且单纯的求交集也不是很准确,这个部分有待以后进一步研究。

你可能感兴趣的:(人工智能自动组方)