数据抽取:
获取主诉信息(主诉是医生对病人的症状及发展情况描述)、病人性别、年龄、科室信息
fasttext官网:https://fasttext.cc/docs/en/supervised-tutorial.html
fasttext介绍
FastText是Facebook研究团队创建的一个库,用于高效计算word representation和执行文本分类,可以在几秒内完成其他算法几天才可以完成的任务。
实践注意事项
数据预处理:
- 由于有些主诉相同时,挂的科室也不一样,需要进一步处理,如删除某个类别的数据。比如发现中医科的病人主诉很杂乱,决定删除该科室数据
- 实践中发现,fasttext对输入数据的格式要求为这种:__label__类别,文本。“,”需要与文本间隔至少1个空格,如下第一行。文本第一个数字是性别,第二个数字是年龄,之后的是主诉信息
__label__神经内科 , 1 25 睡 眠 障 碍 1 月
__label__神经内科,0 80 吐 字 欠 清 、 吞 咽 困 难 5 月
如果为第二行格式,则模型会将0也作为预测输出。
- 做文本分类时可以先用简单模型试下,再用复杂的模型慢慢调试。模型结果很大区别于数据质量
参数选择:按照官方推荐的参数选择即可,可以多试几下,注意n-gram不要太大,不然容易过拟合
fasttext使用
参照官网
常用方法:
import fasttext
#训练模型
classifier = fasttext.train_supervised(input='train_data.txt', lr=1.0, epoch=25, wordNgrams=3, bucket=200000, dim=50, loss='hs')
#验证,返回类似(数量,accuracy,f1)
classifier.test('train_data.txt')
#保存和加载模型
classifier.save_model('fasttext_classifier.ftz')
model = fasttext.load_model('fasttext_classifier.ftz')
#预测结果,在输出3个最有可能的类别下,输出预测概率大于0.1的类别
model.predict("",k=3,threshold=0.1)
代码
主要三个模块:数据处理成fasttext格式,训练模型(多换几个参数)
代码如下:
由于内网,代码是用手机照的,不够清晰之处,敬请见谅
get_target_department是将医院科室与标准科室做对应,返回类似{‘消化内科门诊’:消化内科},键是该医院科室,值是标准科室
导包
数据处理(把数据很少的科室数据删除,不做该科室预测,将科室转换为标准科室),生成模型
验证效果,效果还不错,训练集f1达到98%,验证集也有90%,fasttext很强大