这是 CBLUE@Tianchi 中医疗对话数据集 IMCS21 的仓库,本仓库包含:
- 背景介绍
- CBLUE 评测任务介绍
- 基线模型代码
- 数据集介绍
- 多级数据注释
- 数据格式
- IMCS21 数据集已更正部分标签,包括命名实体、症状标签等,并新增了
local_implicit_info
字段(句子级)。 - IMCS21 数据集已更新,添加了 4 种疾病,覆盖了 10 种️疾病,共 4,116 条样本。新版本评测仓库更新了每个任务的评价脚本,同时也更新了基线代码。欢迎大家来 CBLUE 打榜!
注意:对 IMCS21 新版数据集的详细介绍请参考我们发表在生物信息领域期刊 Bioinformatics 2022 上的论文 A Benchmark for Automatic Medical Consultation System: Frameworks, Tasks and Datasets,以及对应的代码仓库 https://github.com/lemuria-wchen/imcs21。
随着"互联网+医疗"的迅速发展,在线问诊平台逐渐兴起,在线问诊是指医生通过对话和患者进行病情的交流、 疾病的诊断并且提供相关的医疗建议。在政策和疫情的影响之下,在线问诊需求增长迅速。然而医生资源是稀缺的,由此促使了自动化医疗问诊的发展,以人机对话来辅助问诊过程。为了促进智能医疗咨询系统(Intelligent Medical Consultation System, IMCS),我们构建了 IMCS21 数据集,该数据集收集了真实的在线医患对话,并进行了多层次(Multi-Level)的人工标注,包含命名实体、对话意图、症状标签、医疗报告等,我们将该数据集接入 CBLUE 评测平台,希望可以共同促进智能医疗、医学语言理解等领域的发展。
IMCS21 目前在 CBLUE 评测平台上接入了四个任务,分别为:命名实体识别、症状识别、医疗报告生成和对话意图识别。
任务编号 | 任务名称 | 简称 | 任务描述 | 链接 |
---|---|---|---|---|
任务一 | 命名实体识别 | IMCS-NER | 从医患对话文本中识别出五类重要的医疗相关实体。 | https://github.com/lemuria-wchen/imcs21-cblue/tree/main/task1 |
任务二 | 症状识别 | IMCS-SR | 根据医患对话文本,识别出病人具有的症状信息(包含归一化标签和类别标签)。 | https://github.com/lemuria-wchen/imcs21-cblue/tree/main/task2 |
任务三 | 医疗报告生成 | IMCS-MRG | 依据病人自述和医患对话,输出具有规定格式的医疗报告。 | https://github.com/lemuria-wchen/imcs21-cblue/tree/main/task3 |
任务四 | 对话意图识别 | IMCS-DAC | 从话语中识别医生或者患者的意图(共 16 种)。 | https://github.com/lemuria-wchen/imcs21-cblue/tree/main/task4 |
IMCS21 包含 4,116 组细粒度标注的医患对话案例样本,覆盖 10 种儿科疾病,详细统计数据如下表所示。
统计指标 | Statistical Metrics | Value |
---|---|---|
总疾病数 | # of Diseases | 10 |
总对话数 | # of Total Dialogs | 4,116 |
总句子数 | # of Total Sentences | 164,731 |
平均每个对话包含的句子数 | # of Avg. Sentences / Per Dialog | 40 |
平均每个对话包含的字符数 | # of Avg. Words / Per Dialog | 523 |
平均每个对话包含的字符数(包含患者自我报告) | # of Avg. Words / Per Dialog (Contains Self-Report) | 580 |
疾病名称 | 样本数 |
---|---|
小儿支气管炎 | 543 |
小儿发热 | 542 |
小儿腹泻 | 534 |
上呼吸道感染 | 486 |
小儿消化不良 | 475 |
小儿感冒 | 472 |
小儿咳嗽 | 344 |
新生儿黄疸 | 294 |
小儿便秘 | 221 |
小儿支气管肺炎 | 205 |
医疗命名实体广泛存在于医患对话中,它们是理解对话意图的关键因素,也是构建智能医疗对话系统的基础任务。
IMCS21 中标注了对话中医疗相关的命名实体,共包含 5 类命名实体,标注方式采用 BIO 三位 字符级标注 ,其中 B-X 代表实体 X 的开头,I-X 代表实体的结尾,O 代表不属于任何类型,命名实体的预定义类别定义如下。
实体类别 | Entity Category | 类别详情 |
---|---|---|
症状 | Symptom | 病人因患病而表现出来的异常状况,如 发热、呼吸困难、鼻塞 等。 |
药品名 | Drug | 具体的药物名称,如 妈咪爱、蒙脱石散、蒲地蓝 等。 |
药物类别 | Drug_Category | 根据药物功能进行划分的药物种类,如 消炎药、感冒药、益生菌 等。 |
检查 | Medical_Examination | 医学检验,如 血常规、x光片、CRP分析 等。 |
操作 | Operation | 相关的医疗操作,如 输液、雾化、接种疫苗 等。 |
IMCS21 中标注了医患对话行为,共包含 16 类对话意图,标注方式采用 句子级 标注,对话意图的预定义类别定义如下。
对话意图类别 | Dialogue Intent Category | Dominant |
---|---|---|
提问-症状 | Request-Symptom | 医生 |
告知-症状 | Inform-Symptom | 病人 |
提问-病因 | Request-Etiology | 医生 |
告知-病因 | Inform-Etiology | 病人 |
提问-基本信息 | Request-Basic_Information | 医生 |
告知-基本信息 | Inform-Basic_Information | 病人 |
提问-已有检查和治疗 | Request-Existing_Examination_and_Treatment | 医生 |
告知-已有检查和治疗 | Inform-Existing_Examination_and_Treatment | 病人 |
提问-用药建议 | Request-Drug_Recommendation | 病人 |
告知-用药建议 | Inform-Drug_Recommendation | 医生 |
提问-就医建议 | Request-Medical_Advice | 病人 |
告知-就医建议 | Inform-Medical_Advice | 医生 |
提问-注意事项 | Request-Precautions | 病人 |
告知-注意事项 | Inform-Precautions | 医生 |
诊断 | Diagnose | 医生 |
其他 | Other | 医生 / 病人 |
症状是医患对话中主要讨论的话题之一,病人的症状信息也是对话策略和疾病诊断的关键特征。使用 BIO 标签可以找出症状实体所在的位置,然而在实际应用中,还存在两个问题:1) 症状实体未归一化,相同的症状可能有多种表达方式,如 发烧、热、发热 都表示 发热 这一症状;2) 症状与患者的关系未知,显然病人并非一定患有所有出现在对话中的症状。
IMCS21 对症状实体进行了进一步的 实体级 标注,我们标注了每个症状实体的 归一化标签 和 类别标签,这两种标签的详情如下。
症状标签 | Symptom Labels | Details |
---|---|---|
归一化标签 | symptom_norm | 从 BIO 标签中提取的 1,900 多个症状中标准化得到 444 个标准化症状名称。 |
类别标签 | symptom_type | "0" 代表确定病人没有患有该症状,"1" 代表确定病人患有该症状,"2" 代表无法根据上下文确定病人是否患有该症状。 |
医疗报告是医生对病人健康状况的总结,是医疗诊断过程的重要环节。
IMCS21 标注了医疗报告。标注方式采用 对话级标注,标注者阅读完整医患对话,并按照规定格式为患者填写对应的医疗报告,每个对话均包含 2 份医疗报告作为参考。医疗报告的预定义格式如下。
字段 | Fields | Details |
---|---|---|
主诉 | Chief Complaint | 病人自诉(Self-report)的总结。 |
现病史 | Present Disease | 对话中病人涉及到的现病史的总结。 |
辅助检查 | Auxiliary | 对话中病人涉及过的医疗检查的总结。 |
即往史 | Past History | 对话中医生对病人的过去病史的总结。 |
诊断 | Diagnosis | 对话中医生对病人的诊断结果的总结。 |
建议 | Suggestions | 对话中医生对病人的建议的总结。 |
文件名为为 train.json
,共 2,472 条样本,其格式如下。
{
"example_id1":{ # 样本id
"diagnosis": # 患者疾病类别
"self-report": # 自诉,病人对自己病情的陈述及对医生的提问
"dialogue":[ # 对话内容
{
"sentence_id": # 对话轮次的序号
"speaker": # 医生或者患者
"sentence": # 当前对话文本内容
"dialogue_act": # 话语行为
"BIO_label": # BIO实体标签(以“空格”连接)(第二版已修正部分错误标签)
"symptom_norm": # 归一化的症状(与BIO中的症状出现的顺序对应)(第二版已修正部分错误标签)
"symptom_type": # 症状类别(与BIO中的症状出现的顺序对应)(第二版已修正部分错误标签)
"local_implicit_info": # 每句话中包含的"症状-标签"字典(由 symptom_norm 和 symptom_type 构建,规则如下,如果一个句子中出现相同的两个 symptom_norm,则 symptom_type 的优先级为:'1' > '0' > '2',即,如果在同一个句子中,相同的 symptom_norm 有多个不同的 symptom_type,我们仅按照优先级保留其中的一个 symptom_type,这也是用户需要预测的结果)
},
{
"sentence_id":
"speaker":
"sentence":
"dialogue_act":
"BIO_label":
"symptom_norm":
"symptom_type":
"local_implicit_info":
},
...
]
"report":[ # 两份医疗报告
{
"主诉":
"现病史":
"辅助检查":
"既往史":
"诊断":
"建议":
},
{
"主诉":
"现病史":
"辅助检查":
"既往史":
"诊断":
"建议":
},
]
"explicit_info":{
"Symptom": # 患者自我报告中的症状,列表格式,值为症状的归一化标签
}
"implicit_info":{
"Symptom": # 基于整组对话推断得到的症状标签,字典格式,键为症状的归一化标签,值为症状的类别标签(第二版已修正部分错误标签)
}
}
"example_id2":{
...
}
...
}
文件名为为 dev.json
,共 833 条样本,其格式同训练集。
文件名为为 test_input.json
,共 811 条样本,其格式如下。
{
"example_id1":{ # 样本id
"self-report": # 自诉,病人对自己病情的陈述及对医生的提问
"dialogue":[ # 对话内容
{
"sentence_id": # 对话轮次的序号
"speaker": # 医生或者患者
"sentence": # 当前对话文本内容
},
{
"sentence_id":
"speaker":
"sentence":
},
...
]
}
"example_id2":{
...
}
...
}
文件名为为 test.json
,共 811 条样本,其格式同训练集与验证集。
文件名为为 symptom_norm.csv
,归一化后的症状词典,本仓库部分基线代码依赖该文件,其格式如下。
norm
咳嗽
发热
感冒
...
文件名为为 mappings.json
,本仓库部分基线代码依赖该文件,其读取代码如下。
import json
with open('mappings.json', 'r', encoding='utf-8') as f:
sym2id, id2sym, bio2id, id2bio, sl2id, id2sl = json.load(mappings_path)
# 其中 sym2id 和 id2sym 分别是 症状 到 症状id 和 症状id 到 症状的映射;
# bio2id 和 id2bio 分别是 BIO-tag 到 BIO-tag id 和 BIO-tag id 到 BIO-tag 的映射;
# sl2id 和 id2sl 分别是 症状标签 到 症状标签-id 和 症状标签-id 到 症状标签 的映射。
如果您扩展或使用这项工作,请引用介绍它的论文。
@article{10.1093/bioinformatics/btac817,
author = {Chen, Wei and Li, Zhiwei and Fang, Hongyi and Yao, Qianyuan and Zhong, Cheng and Hao, Jianye and Zhang, Qi and Huang, Xuanjing and Peng, Jiajie and Wei, Zhongyu},
title = "{A Benchmark for Automatic Medical Consultation System: Frameworks, Tasks and Datasets}",
journal = {Bioinformatics},
year = {2022},
month = {12},
doi = {10.1093/bioinformatics/btac817},
url = {https://doi.org/10.1093/bioinformatics/btac817},
note = {btac817},
eprint = {https://academic.oup.com/bioinformatics/advance-article-pdf/doi/10.1093/bioinformatics/btac817/48290490/btac817.pdf},
}