常炳国 刘清星
(湖南大学信息科学与工程学院 湖南 长沙 410082)
非结构化数据已经逐渐成为数据挖掘领域的研究热点之一[1],而医学文本作为非结构化文本数据的一个重要组成部分,对其进行挖掘,将推动医学技术的发展。医学文本相似度分析主要是计算实时医学文本与各个历史医学文本之间的相似程度,从中挖掘出一些相似度高的成功病例,以供医生在诊断结果或治疗方法上进行参考。
CT报告是医学文本数据的一类,是病人进行CT检查后得到的文本式诊断报告,其主要内容包括医生对影像所见描述和根据所见及医生的经验得出的诊断建议结果。肝CT检查是诊断慢性肝病过程中对肝部、腹部等部位进行扫描的检查项,对于慢性肝病的诊断灵敏度极高[2]。医生根据肝CT影像图片,对肝脏以及肝脏相关器官大小、形状等各方面进行综合描述,进而给出适当的诊断意见。而随着医疗数据的不断增加,CT报告中,高相似度的CT检查所见文本之间具有高相似度诊断意见,所以经验丰富的医生的诊断意见对于经验不足的医生来说具有极大的参考价值,这可以在一定程度上减少他们的误诊率。
医学自然语言处理发展以来,不管是实体识别、信息抽取还是相似度计算[3-4],其基础都是分词。尽管中文自然语言处理已经有了比较大的发展,但由于医学语言自身的特征,中科院的NLPIR[5]、复旦大学的FNLP[6]等通用的分词工具在处理专业领域分词方面不能达到令人满意的效果。此外,国内中文医学术语标准化进程不足,国外UMLS[7]等也缺乏对中文的支持。
论文在研究慢性肝病医学词库基础上,运用网络爬虫技术获取相关网站医学词汇以及自定义否定词汇表,构建了包含约6 000个医学词汇的慢性肝病CT报告分词词库。运用基于词库与最大匹配规则相结合的分词算法,对肝CT报告文本进行分词处理。利用Doc2Vec深度学习算法获取CT报告文本分词表的句向量,并计算句向量之间的余弦相似度作为CT报告文本相似度。
本文所处理的CT报告数据来自某三甲医院去敏感信息后的真实CT报告。CT报告采用自然语言进行的文本描述,报告句式结构是描述对象和对描述对象的描述词,包括方位词、副词、固定结构以及大量的专业词汇和否定词汇,如“未见明显异常、不规则缩小”等。论文就CT报告的检查所见描述信息进行文本相似度计算与应用实验。表1列出CT报告的句式结构。
表1 CT报告句式结构
相似度分析过程包括构建词库以及对文本进行相似度计算两个部分,而相似度计算基于词典分词并进行调参等处理,最后得出相似度top前n的文本,整体流程如图1所示。
图1 CT报告相似度分析整体流程
2.2.1 构建词库
针对CT报告文本专业性强的特点,直接利用分词算法进行分词,会出现很多医学上关键词以及文本中的否定词汇无法被识别,分词效果极差。因此,为了提高分词准确率以及保证分词结果能以最大粒度切分,本文通过自定义医学词库来构建分词词库,其主要由三大部分组成:医学专业词库、医学否定词词库以及停用词词库。
医学专业词库分为三个部分:通过“网络爬虫”爬取医学网站得到的解剖学等专业词汇,从现存医学标准词库(SNOMED CT[8]与“搜狗医学词库”)中提取的关键词汇以及影像科医生总结出来的常见的对肝CT进行描述的专业词汇。其中每一个词汇都进行了词性以及词频的标注,如“肝内外胆管 nz 300”,“肝内外胆管”是一个医学专业词汇,nz代表其他专有名词,300代表词频。
医学否定词词库包括两大部分,一个部分是具有否定性质的专业词库和具有否定性质的修饰词词汇。例如:“异常强化灶”、“欠光整”、“未见”、“无”等。
停用词词库包括在报告文本中具有高频率,但是其实际意义又不大的词。它主要包括了介词、副词、语气助词、连词等,通常这种词的自身并没有明确意思,只有当把它们放到一个完整的句子中才会起到一定的作用,例如“大约”、“及”、“一个”等。
在构建的词库过程中,医学专业词库和医学否定词词库会合并去重形成一个用作分词的自定义词库,而停用词词库作为分词中需要过滤的过滤词词库使用。
2.2.2 数据预处理
正文在进行分词之前,要对原始数据进行三个方面的预处理。第一,要去掉每条文本记录中含有的回车符,然后以一条记录为一句,把所有的文本数据导入到同一个文本文件中,每条文本记录之间以回车符分隔。第二,根据自定义的停用词词库,将第一步所形成的文本文件中的“大约”、“一”等停顿词去掉,将“×”等特殊符号替换成电脑可识别的“*”等符号。第三,为了提高文本相似度,在对文本进行分词之后,根据自定义含否定性质的修饰词词库,将含有否定性质词的短句去掉。例如:“左侧肾盏见一小结节状致密影”和“左侧肾盏未见一小结节状致密影”,去停用词后分别为“左侧肾盏见小结节状致密影”和“左侧肾盏未见小结节状致密影”,这两句话除了“见”和“未见”两个字的区别,其他完全一样,但它们的意思完全相反,相似度为零,所以在预处理时会将含有“未见”等否定修饰词的短句去掉。
2.2.3 分词算法
在分词之前必须要对数据进行预处理,将各条文本数据去换行符等停用词后,以一条数据为一行的方式将全部数据记录导入一个文本文件里,因此一位病患的CT报告文本在文本文件里对应的是一句。分词的方法有很多,主要分为三大类:基于理解的分词方法、基于规则的分词方法和基于统计的分词方法[9]。因为已经构建好了比较完善的自定义词库,所以本文采用改进的规则与统计相结合的方法来对文本进行分词,该方法主要是在基于最大逆向匹配算法的结巴分词算法[10]基础上进行改进,改进后效果明显优于结巴分词。
在文献[11]的研究中,对句子进行正向最大匹配和逆向最大匹配切分,然后对切分后的两种结果进行比较,提出了歧义检测成功和歧义检测失败两个概念。即这两种方式切分的结果有90%的概率重合且正确,有约9.0%的概率其中必有一个的结果是正确的,称为歧义检测成功,而两种切分结果都是错的或者重合后是错的,只有约1.0%的可能性,称为歧义检测失败。本文基于自定义词典,结合两种不同的切分方法切分得到两种分词结果,对其进行以下处理:若它们的分词个数不一样,则将数量较少的分词结果作为最终分词结果;若它们分词个数不一样,但分词结果一样,则返回任意一个切分结果,分词结果不一样,则比较两个结果中单字的个数,返回单字少的结果。以切分“左侧肾盏未见小结节状致密影”为例,此时设置的最大词长为“4”,如表2所示。
表2 分词算法示例
针对慢性肝病CT报告文本数据短、专业性强的特点,在对CT报告文本进行分词之后,选用深度学习doc2vec算法对其进行句向量表示,再计算句向量之间的余弦值来确定其相似度。
2.3.1 词向量
自然语言处理(NLP)的问题要转化为计算机能够处理的相关机器学习问题,首先要处理的事情是将自然语言这些文字符号语言进行数字化处理。One-hot Representation是最常用的词表示方法,它采用稀疏矩阵的方式,给每个词分配一个数字 ID,用一个很长的向量来表示每个词。矩阵的总维度就是词表大小,当前词维度标为1,其他表示为0。例如:“乙肝”表示为 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 …],“肝硬化”表示为 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 …]。但是这种方法最大的弊端在于:只能表示词本身而不会考虑语义距离,即任意两个词之间都没有联系的。例如:“乙肝”和“肝硬化”同属于慢性肝病,但是这两个向量中来看这两个词毫无关联。此外,由于稀疏矩阵高维的表示,可能会带来维度灾害。
由此,本文采用分布式表示的方法来表示词向量[12]。它是一种低维空间的密集表示方法,这种方法的优点在于便于在词本身的基础上,从语义上计算相关或相似的词之间的距离,例如:肝脏[0.792, -0.177, -0.107, 0.109, -0.542, …],每个维度上的数值代表着它与其他词之间的关联度。这种低维空间的表示法不但解决了高维数稀疏矩阵带来的灾难问题,并且还能通过词之间距离的计算来挖掘词与词之间的关联度,例如:“乙肝”和“感冒”的距离会远远小于“乙肝”和“肝硬化”。
2.3.2 Word2Vec算法进行词向量分析
基于分布式表示方式,本文利用深度学习的思想,采用Word2Vec算法[13],通过训练将文本内容中的每个词映射成K维实数向量(K为超参数),再通过词之间的距离(比如cosine相似度、欧氏距离等)来得出在向量空间上的相似度,从而得出词之间在语义上的相似度。它采用的是一个三层(输入层、投影层、输出层)的神经网络,在对语言模型进行建模的同时来获得词在向量空间上的词向量表示。而基于Log-Bilinear语言模型中的Hierarchical Softmax,Word2Vec有两种不同的模型进行语言建模:连续词袋模型CBOW(Continuous Bag of Words)和Skip-gram模型。其中,CBOW模型的目标是根据相邻词向量来预测中间词的概率,而Skip-gram模型刚好相反,它是根据中间词来预测相邻词的概率,主要是通过在语料库上的不断迭代,计算出词向量。
以CBOW预测词Ct出现的概率为例,其优化目标函数的条件概率函数如下:
P(Ct|context)=p(Ct-n,Ct-n-1,…,Ct+n)
(1)
式中:Ct-n到Ct+n是2n个词Ct的上下文context,以One-hot方式进行表示并组合成|W|2n维词向量稀疏矩阵D,|W|是文本中所有词集合的大小。如图2所示,神经网络模型的输入层节点就是矩阵D中的行向量D(t-n)到D(t+n),而在投影层会将这2n维向量进行求和累加,形成2n×2n维的向量x,并通过激活函数tanh的计算得到一个向量y,y是一个|W|×1维的向量,它的每一个元素yi代表都代表着下一个词Ci的未归一化概率。
图2 CBOW三层神经网络结构模型
然后,在输出层上使用softmost函数进行归一化处理,得到t,公式如下:
t=a+Ktanh(b+Hx)
(2)
式中:a表示投影层到输出层的偏置向量,矩阵K是投影层到输出层的权重,矩阵H是输入层到投影层的权重,b是输入层到投影层的偏置向量。
最后,在输出层会对应形成一棵以语料库中出现过的词为叶子结点、以各词在语料库中出现次数为权值的huffman树,并输出Ct的词向量。
Skip-gram模型与CBOW很相似,只是Skip-gram模型不是选取2n个上下文作为输入层的输入,而是直接以当前词为样本中心,恒等投影到投影层,最终在输出层得到一棵huffman树。
由此可知,通过三层神经网络模型进行语言建模,根据上下文信息进而获得词向量表示,使得语义信息在词本身的基础上变得更加丰富。
2.3.3 Doc2Vec算法进行词向量分析
基于Word2Vec词向量表示模型对词的维度进行语义分析,文献[14]提出了Doc2Vec模型,该模型主要是对可变长度文本的上下文进行语义分析,并对文本进行句向量表示。而以此模型为基础,最后通过文本句向量计算文本各段落之间的距离就可以得到其相似度。
相对Word2Vec的两种CBOW模型与Skip-grim模型,Doc2Vec模型也存在两种语言建模方法:Distributed Memory(PV-DM) 模型和 Distributed Bag of Words(PV-DBOW)模型。PV-DM模型在CBOW模型的基础上进行改进,即在给定上下文和段落向量的情况下预测单词的概率。而PV-DBOW 模型则是基于Skip-grim模型,在仅给定段落向量的情况下预测段落中一组随机单词的概率。
Doc2Vec的两种语言模型在Word2Vec的两种语言模型的基础上做以下两个改进:一个是会在训练过程中给训练语料库中的每一个句子都新增一个唯一的编号(PI),这个编号和句子中的词一样,会先被映射成一个向量(PV)。在之后投影层的计算里,会将PV和句子的词向量进行累加或者连接,作为输出层归一化函数softmax的输入。在整个训练过程中,每个句子的PI是保持不变的,而且它们共享着同一个PV,这就相当于每次在预测单词或者上下文的概率时,都利用了整个句子的语义进行分析。另一个是会在进行预测阶段重新给待预测的句子分配一个编号(PI),而此时的词向量以及输出层中归一化函数softmax的参数保持训练时得到的参数不变,然后利用梯度下降法训练所有参数,使其待收敛后,即得到待预测句子的PV。如图3所示,以PV-DM模型的训练过程为例。
图3 PV-DM模型训练过程
PV-DBOW模型的训练过程和Skip-gram模型的很相似,不同的是根据文档向量来预测上下文单词出现的概率。在实验中会将由Doc2Vec算法的两种模型训练而来的词向量进行拼接使用。
2.3.4 相似度计算
由Doc2Vec得到经过处理的医疗文本每个句子的句向量之后,接下来就是计算句向量之间的距离,从而匹配出与预测句子最相似的句子。本文采用计算两句向量之间余弦值的方法来确定句向量之间的距离,从而确定每个句子之间的相似度,同样地在对句向量进行余弦值计算的时候,每个句子都会被分配一个唯一的ID。那么,对于两个n维的向量S和T,S=(s1,s2,…,sn)和T=(t1,t2,…,tn),其余弦值的计算公式是:
(3)
计算得到的余弦值是一个大于等于0、小于等于1的数,用这个数就可以表示每个文本之间的相似程度。本文进行多次实验后,给相似度设置了一个阈值,输出top前n个具有医学参考价值文本。
实验研究选择某三甲医院6 900份真实的肝病影像报告,包括5 100份CT报告,1 800份超声检查报告。
对实验参数进行设置,通过反复调节,选择词向量的维度为18、训练窗口为9即上下文的选词个数为9时,相对其他组合的参数来说,在算法执行过程中具有较好的分类性能,且算法时间复杂度最小。当迭代次数为30时,对一个文本进行多次相似度计算所得的相似文本结果较稳定。在计算余弦相似度时,其阈值设置为0.7时,获得的相似文本对医生给出诊断意见具有较高的参考价值。
基于自定义的医疗词库,在结巴分词的基础上对分词算法进行改进,改进后算法的准确率以及召回率明显高于结巴分词。将自定义词库两种算法之中进行分词比较,如表3所示。
表3 分词算法比较
其中,召回率指的是正确的分词个数与分词标答的比值,而准确率指的是正确的分词个数与分词结果的比值,但是由于它们属于此消彼长的关系,所以采用F值来综合判定并比较它们的效果,计算公式如下:
(4)
可见,改进后分词的效果要比结巴分词的效果要好,且它的准确率达到了87 %,这为下一步医疗文本相似度的计算打下了良好的基础。
实验研究应用于医院影像科室,医生将患者CT检查所得输入到相应的文本框,当点击相应的按钮,便可获取与输入文本相似度为70 %(默认阈值)的所有文本以及这些文本相对应的病人信息和给出诊断意见医生的名字,或者医生也可以手动设置相似度阈值和诊断医生的名字,来获取相应条件的所有慢性肝病CT报告。当不进行条件筛选时,初诊医生和审核医生的默认值是无。主界面如图4所示。
图4 应用主界面
为了能够更好获取统计信息,把实验数据分成标准文本集和测试文本集两个部分。标准集包括350条慢性肝病CT报告,测试集包括1 050条慢性肝病CT报告构成的匹配集和5 500条CT报告与超声波报告混合构成的噪音数据集。其中,1 050条匹配数据是由人工整理而成,它与350条标准集都分别对应有3条具有95 %以上的相似度文本数据。
具体的实验方法是:依次从标准文本集中取出第j条数据(0≤j≤349),计算它与测试文本集的相似度,获取出最大相似度top-3的文本,将这3条文本数据与匹配集对应的3条文本进行比较,记下相同的条数nj作为正确的条数,最后通过如下公式计算准确率R值:
(5)
本文分别用三种不同的相似度算法对实验数据进行分析并比较,在对各个算法调定参数之后,对其分别进行了五次实验,而且为了保证算法的区分能力,每次实验后都会随机打乱匹配集与噪音集各条文本数据之间的顺序再进行下一次实验。表4对实验结果及准确率进行展示,其中用于对比的三种算法分别是基于IF-IDF的词频统计算法[15-16]、基于潜在狄利克雷分配LDA(Latent Dirichlet Allocation)的主题模型分析算法[17]以及本文的算法。
表4 实验结果对比
如表5所示,对表4中五次实验的时间进行记录,平均每条数据花费时长是指每次实验所取500条数据进行匹配的平均每条花费时长,平均时长是指五次实验平均每条数据花费的时长。
表5 实验结果花费时长对比 s
对实验结果进行分析,传统的基于TF-IDF统计算法在计算文本相似度时只是基于词频进行统计,并不会对上下文的语义进行分析,而慢性肝病的CT报告文本长度短、专业词汇多,且用于描述各条影像所见的词汇也大多相同,所以其得到的准确率很低,也很不稳定,最后的平均准确率只有45.9 %,但所花费的时间却是最少的。基于LDA模型的相似度算法主要是通过识别语料库中的所潜在隐藏的主题信息来计算文本相似度,虽然在词频统计的基础上新增了对文档之间的语义分析,但是本文中所分析的慢性肝病CT报告之间隐藏的主题信息差别不是很大,因此所得结果的稳定性虽相对有所提高,但准确度不高,最后准确率为63.6 %。由于此算法也要计算TF、IDF值,所以在时间的花费也大大提高了。而本文所用算法,在词向量的分布式处理、语义分析等方面都有很好的处理,每次实验所得的结果相对来说都很稳定,平均准确率达到了90.8 %,因此相对来说时间代价也提高了。从时间维度来讲,三种算法都用准确率换取了花费的时长,但是从准确率上来看,花费的时间代价是值得的。
本文利用慢性肝病CT报告的数据特征,研究慢性肝病医学词库基础上,构建了包含约6 000个医学词汇的慢性肝病CT报告分词词库。运用基于词库与最大匹配规则相结合的分词算法进行分词,然后利用Doc2Vec深度学习算法以及余弦相似度算法,匹配历史CT报告文本中相似度大于设置阈值的报告用于参考。本文整理分析了6 900份某三甲医院真实的影像科检查报告,通过实验得出,基于自定义词库及改进的分词算法,分词准确率达到了87 %,而通过对比分析,基于Doc2Vec的相似度算法性能明显优于传统的基于TF-IDF的统计算法和基于隐含狄利克雷主题模型 (LDA)算法。最后,此实验在医院真实场景进行了应用,辅助医生给出诊断意见。