使用Jupyter实现医疗文本分析
使用Jupyter实现医疗文本分析
随着人工智能技术的不断发展,越来越多的研究者开始将机器学习、自然语言处理等算法应用于医疗文本分析。本文将详细介绍如何使用Jupyter Notebook对医疗文本进行分析,包括数据预处理、模型搭建和优化等多个环节。
一、题目描述
(1)问题背景:随着人工智能技术的不断发展,越来越多的研究者开始将机器学习、自然语言处理等算法应用于医疗文本分析。传统的医疗文本是以患者的病例为主,而如今随着互联网的发展,网上就诊、远程医疗等服务逐渐出现,产生了大量蕴含着丰富资源与信息却处理难度大的互联网医疗文本,医疗文本有缩写、简写以及独特复杂的语法机制使得网上的医疗文本不能有效利用,因此将机器学习和自然语言处理相结合,对实现网上医疗文本进行数据分析,具有非常重要的意义。
(2)数据集描述:
数据集来自GitHub 的公众数据集“Chinese medical dialogue data”(https://github.com/Toyhom/Chinese-medical-diaglogue-data),其中包含了 79 万多条在线问诊平台的医患问答记录, 包括六大科室:男科(9万条)、内科(22 万条)、妇产科(18万条)、肿瘤科(7万条)、儿科(10万条)和外科(11万条), 每个科室的数据有四列 department(具体病症)、 title(问句标题)、 ask(问句)、 answer(回答)组成。
二、算法设计与分析
(1)数据预处理:
1.划分数据
读取每个科室的数据,划分数据列,并合成为一个数据框。
以儿科为例:
观察得知,奇数行是提问和描述,偶数行是对应的回答。
继续将qs划分为提问和描述
将这三列数据合并起来,并增加新的一列科室
其他科室的数据按相同方法读取和合并,最后将所有数据合成为一个数据框并保存下来。
2.数据清洗
查看数据集形状
共有20497条数据,4列特征。
查看数据类型和大小:
查看空缺值:
数据没有空缺值,无需进行处理。
查看重复值
重复值数量:
删除重复值:
(2)数据分析:
1.科室数量分布
绘制条线统计图:
可以看出,男科分布最多,外科分布最少。
2. 统计句子长度
绘制核密度直方图
问题描述语段字数在30-80字左右,70字最多。
问题字段字数在10-20字左右,15字最多。
回答语段字数在120-200字左右,190字最多。
根据这几列数据的字数,可以帮助后期设计模型验证时,自主输入问题描述时控制好字数。
3. 词云图绘制
利用jieba分词
加载停用词并消除停用词
使用stylecloud绘制不同形状的词云图
同理,画出其他科室的词云图
词云图很好地展示了词频的分布情况,在文中出现次数多的词语字体显示大,根据词云图可以看出每个科室的关键词,即问答最容易出现的词语,后期便可以根据这些词频进行科室分类。为了美观展示,我还找了不同形状的模板绘制词云图,更加生动形象展示出每个科室的不同。
(3)模型搭建
1.贝叶斯分类器
对问题描述语段进行分词
划分训练集和测试集
文本特征提取(TF-IDF)
建立模型
模型评估
从模型准确率来看,0.95是个不错的得分,各个科室预测的准确率和召回率也都挺高,在0.92以上,模型训练效果较好。
预测真实数据
最后一个外科预测错误。
2.支持向量机模型
划分数据集
使用向量化处理后预测
使用TF-IDF处理后预测
对比两种方法,选择TF-IDF处理后的数据进行建模较好
模型评估:
支持向量机模型预测效果好,在测试集上有0.98的准确率,各个科室分类的准确率和召回率也都在0.97以上,是比较理想的分类器。
实际数据预测:
科室预测均正确。
3. 决策树模型
类别编码——将不同科室编码为数字0-5
数据清洗(仅去除标点符号,未分词)
文字特征构建 word2vec模型
得到每个词的特征向量
决策树模型构建
模型评估
可以看出模型在训练集上准确率很高,而在测试集上准确率较低,为0.75,表现为欠拟合。
4.LSTM神经网络模型
模型的第一层是嵌入层(Embedding),它使用长度为100的向量来表示每一个词语
SpatialDropout1D层在训练中每次更新时, 将输入单元的按比率随机设置为 0, 这有助于防止过拟合
LSTM层包含100个记忆单元
输出层为包含10个分类的全连接层
由于是多分类,所以激活函数设置为'softmax'
由于是多分类, 所以损失函数为分类交叉熵categorical_crossentropy
训练数据集:
绘制损失函数趋势图:
从上图中我们可以看出,随着训练周期的增加,模型在训练集中损失越来越小,而在测试集中, 损失随着训练周期的增加由一开始的从大逐步变小,再逐步变大
准确率趋势图:
从上图中我们可以看见,随着训练周期的增加,模型在训练集中准确率越来越高,而在测试集中, 准确率随着训练周期的增加由一开始的从小逐步变大,再逐步变小。而我们选取的训练周期=5可以将测试集的准确率稳定在90%,准确率不错。
此外,还需要查看各个类的精确率和召回率:
整体准确率在89%~90%。
预测输入文本:
对输入的病情描述能够准确预测。
(4)模型优化
1.优化决策树模型:
通过网格搜索的方法对决策树模型进行优化,
显示最优模型参数是criterion='entropy', max_depth=100, min_samples_leaf=3
按照此参数进行训练和预测得到的分数为0.755,仍然不高
2.优化支持向量机模型:
线性核耗时最短且分数最高。
通过网格搜索优化模型参数
得到最优参数为
预测模型得到准确率:
(5)模型确定
综合比较各模型,选择支持向量机SVC(C=15, gamma=0.1, kernel='rbf')作为最终模型,其预测准确率最高,为0.98。
三、结果分析
(1)方法分析:
主要使用了分词处理、绘制词云图的方法、TF-IDF文本特征提取的方法;使用了贝叶斯分类器、支持向量机、决策树、神经网络的模型。
前两种模型都是建立在分词和TF-IDF特征提取后,模型训练后进行预测,模型评估阶段都一致,输出在训练集和测试集上的准确率、输出各个科室的精确率和召回率、绘制混淆矩阵和学习曲线,以此来观察模型的分类效果。而决策树模型未经过分词处理,使用word2vec模型进行文本特征构建,再训练模型。LSTM模型可以较好的分词并保留较多的有效词句,对准确率有较好帮助。
(2)效果分析:
对于四个分诊模型,贝叶斯准确率0.956,支持向量机准确率0.98,决策树准确率0.75,神经网络准确率0.95,支持向量机的准确率最高,分类效果最好。使用TF-IDF的文字特征提取方法比向量化的方法好,即将词语按词频进行特征构建,再分类到不同科室。可以自主输入病情描述让模型来分诊,实验中给出了几种情况也都能正确预测出,模型效果不错。
本文原文来自CSDN