☰
doccano:5 步跑通医疗 NER 数据集
2026/11/5 3:20:27 网站建设 项目流程

doccano:5 步跑通医疗 NER 数据集

【免费下载链接】doccanoOpen source annotation tool for machine learning practitioners.项目地址: https://gitcode.com/gh_mirrors/do/doccano

病历上写着「2型糖尿病伴慢性肾病,阿司匹林 100mg 口服」。嵌套疾病、药量、症状挤在同一句里,标注员第一个问题永远是:边界到底划在哪。

构建医疗 NER 数据集绕不开这种粒度,而 doccano 的 Sequence Labeling(序列标注)模式正是为此准备的:标签体系全组共享,标注结果以 span 形式落库,最后直接导出可训练的数据。

认知对齐:医疗 NER 标注的三个坑

医疗文本和普通文本的差别不在长度,而在三处。一是术语专业:「急性心肌梗死」和「心绞痛」在普通读者眼里是一回事,在标注规范里必须分开。二是实体嵌套:「2型糖尿病伴慢性肾病」里,主病和并发症各是一个 DISEASE,划错一层模型就学歪。三是规范刚性:标签划分通常要对齐 ICD-10 这类标准,标错不是返工一条,是返工一批。

差异摆在这里,标签体系必须先于任何操作定下来。

动手配置:部署 doccano 并建项目

Docker 启动与创建项目

git clone https://gitcode.com/gh_mirrors/do/doccano cd doccano docker-compose -f docker/docker-compose.prod.yml up -d

启动后访问http://localhost,用环境注入的初始账号登录(README 示例为admin/password,见 backend/api/management/commands/create_admin.py)。然后进入首页点 Create Project:项目名填「临床实体识别」,关键一步是 projectType 选Sequence Labeling——选成 Text Classification,后面所有 span 功能都不会出现,先别急着点 Create,确认这一项再提交。

医疗标签体系怎么定

三条判定原则,建项目前先在团队内对齐:

  • 复合实体整体标:「2型糖尿病」是一个 DISEASE,不拆成「2型」+「糖尿病」。
  • 嵌套实体走 BIO:doccano 界面里按最外层边界标注,导出层用B-/I-前缀表达实体起始与内部,如B-DISEASE、I-DISEASE。
  • 边界歧义写进标签描述:拿不准的写法直接落在标签说明里,标注员按文档执行,而不是凭感觉。

在此基础上给出这套标签表:

标签名颜色快捷键判定边界示例
DISEASE#FF5733d「2型糖尿病」整体;嵌套结构取最外层边界
SYMPTOM#33FF57s「持续性胸痛」含「持续性」,不截断
DRUG#3357FFu「阿司匹林 100mg」整体入实体,剂量不单独成实体
TREATMENT#FF33F5t「手术」「口服」等处置方式
BODY_PART#F5FF33b「心肌」与「心脏」均入,解剖词与俗称不合并

标签不必逐条手填:Labels 页面支持导入 JSON 文件批量创建,字段为text、suffix_key、background_color,格式在导入弹窗里直接有示例(实现见 frontend/components/label/FormImport.vue)。

核心实操:临床数据导入与标注

数据导入:JSONL 最小格式

每行一条 JSON,最小字段是text(病历正文),建议再带meta(病历号等元数据,导出时会原样带回):

{"text": "患者因持续性胸痛3天入院,诊断为急性心肌梗死,给予阿司匹林100mg口服。", "meta": {"case_id": "C12345"}} {"text": "主诉:咳嗽、发热2周,既往有2型糖尿病史。", "meta": {"case_id": "C12346"}}

Dataset 页面选 JSONL 格式上传即可。单文件别超 100MB,大批量病历按科室或日期切分、分次导入更稳妥。

标注界面三个关键操作

进入 Start Annotation 后,真正高频的只有三个动作:

  1. 鼠标选区:划选「急性心肌梗死」,选区立刻变成一个 span,边界不满意直接拖拽端点。
  2. 快捷键切标签:不松开键盘,按d标为 DISEASE、s标为 SYMPTOM。复合实体不拆、嵌套实体取最外层边界,这两条规范在这里靠手速和肌肉记忆兜底。
  3. Comment 记录分歧:遇到「不典型肺炎」这种争议实体,在 span 上挂一条 Comment,写明你的判断依据,管理员统一裁定后在标注规范里补一条。

质量闭环:协作分工与自动预标注

分工在 Members 页面完成:添加标注员账号,角色设为 Annotator,按「每人 200 份病历」这类粒度分派。进度不用追着问,Statistics 页面看每人完成量即可。

一致性是医疗 NER 的命门。让两组人标同 50 条重叠样本,Kappa 系数低于 0.85 就先停手:拉出分歧最大的标签(通常是 DRUG 和 TREATMENT 的边界),回到标签描述补细则,校准后再继续。这一步省下的时间,远多于后期清洗数据的时间。

省时间的第二块来自自动预标注。把 5 万+ 医学术语整理成词典,配置 auto-labeling 模板(见 docs/advanced/auto_labelling_config.md,配置入口在 backend/auto_labeling/),系统先对命中术语做预标注,人工只做校对和修正。按经验这条路能省掉约 60% 的纯手动标注时间,而且预标注质量直接决定了你团队的起点高度。

落地:导出可训练数据集

标注收尾后,Dataset 页面 Actions → Export Dataset,格式选 JSONL。下游训练真正依赖的是三个字段的对齐:text原文、labels([start, end, 标签]的 span 列表)、meta元数据(见 backend/data_export/):

{"text": "患者因持续性胸痛3天入院,诊断为急性心肌梗死", "labels": [[3, 8, "SYMPTOM"], [13, 19, "DISEASE"]], "meta": {"case_id": "C12345"}}

对接下游一步到位:

from datasets import load_dataset ds = load_dataset("json", data_files="clinical_ner.jsonl")

配合 BioBERT 这类医疗预训练模型做 token 级映射,就可以直接进训练循环。

从建项目、定标签、导数据、标注到导出,这条链路一周内可以跑出一个可复用的临床数据集。进阶方向两个:对接医院 HIS 接口自动化采集病历,以及把现有标注结果训成预标注模型,经 auto-labeling 回灌新项目。

【免费下载链接】doccanoOpen source annotation tool for machine learning practitioners.项目地址: https://gitcode.com/gh_mirrors/do/doccano

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询