google-research 之 Assessment Plan Modeling:MIMIC 临床笔记分区标记(Note Section Markers)数据集与解析实战
发布时间:2026/9/20 1:43:12 作者:尧图编辑部 阅读量:1,286
数据集与解析实战)
人工智能深度学习NLP计算机视觉强化学习【免费下载链接】google-researchGoogle Research项目地址https://gitcode.com/gh_mirrors/go/google-research点击查看免费下载临床笔记Clinical Notes是电子病历中最具信息密度的文本形态之一而分区Sectioning——即把一份自由文本笔记按语义划分为既往史、过敏史、评估与计划Assessment and Plan等结构块——是后续一切结构化抽取工作的前提。在 google-research 仓库的assessment_plan_modeling项目中note_sectioning/data/README.md与其同目录下的mimic_note_section_markers.json共同构成了一套面向 MIMIC-III 临床笔记的分区标记Section Markers数据资产。本文将以该数据文件为主线结合note_section_lib.py的源码实现完整讲解标记集是如何从 MIMIC 笔记中被提取、人工筛选与分类的以及如何通过正则引擎将标记词典变成可复用的分区抽取工具并深入其在 AP Parsing 数据生成管线中的实际落地方式。一、数据集概述从 MIMIC 笔记中长出来的分区标记mimic_note_section_markers.json是一份由真实 MIMIC 笔记语料驱动的标记词典marker dict。README 原文明确了它的诞生过程MIMIC note section markers. Extracted from mimic notes via manually inspecting matches to the regular expression:(?mi)^[\t\ ]*(.*)(?::\s|:?\n).这句话交代了两个关键事实数据来源标记本身提取自 MIMICMIMIC-III 的 note_event临床笔记因此天然覆盖了真实住院记录中出现的高频小节标题而不是论文里虚构的规范格式。提取方法先用正则(?mi)^[\t\ ]*(.*)(?::\s|:?\n)在全部笔记中批量抓取疑似小节标题——该正则匹配每行行首^(?m)开启多行模式允许行首空白[\t\ ]*随后捕获一段文本并以冒号加空白或冒号加换行作为小节分隔符然后由医生physician人工筛掉噪声、剔除重复并将筛选后的高频标题归类到语义类型。README 中 Top matches were filtered by a physician and classified into types 一句正是这套正则粗筛 临床人工精审数据生产流程的浓缩描述。从数据治理的角度看这种以真实语料为底、以临床专家为闸门的构建方式保证了标记集既有召回覆盖大量口语化、缩写化标题又有精度每个条目都经过医学语义校验这是它能够直接支撑下游模型数据生成的关键。二、标记词典结构97 个标记与 26 种小节类型标记词典本身是标准的 JSON 对象位于 assessment_plan_modeling/note_sectioning/data/mimic_note_section_markers.json。其结构为Key小节标题原文不区分大小写代码侧会按 uncased 语义处理见下文正则实现Value该标题对应的一个或多个小节类型section types类型为字符串数组。该文件共收录97 个标记映射到26 种小节类型。整体可归为以下几类类别示例条目说明标准全称assessment and plan、chief complaint、discharge instructions笔记中最规范的标题写法常见缩写hpi、pmh、pmhx、psh、ros、sh、fh、cc临床速记缩写与全称映射到同一类型同义/变体assessment plan、history of presenting illness、physical exam、vitals同一类型的拼写与措辞变体复合小节多类型changes to medical and family history→[past medical history, family history]一个标题同时归属多个小节类型长句标题review of systems is unchanged from admission except as noted below、the following changes were made to your medications真实笔记中出现的完整句子式标题特殊条目------ protected section ------→[protected section]用于识别隐私保护占位块一个值得注意的细节是词典中甚至保留了真实语料中的拼写错误例如review of sytemssytems 拼写错误也被收录并映射到review of systems。这说明标记词典追求的是对真实语料的忠实覆盖而非教科书式的干净词汇表——这也是它相比人工枚举规则更能抗住真实笔记噪声的原因之一。在note_section_lib.py的文档字符串中完整列出的 26 种小节类型为addendum、allergies、assessment and plan、billing diagnosis、chief complaint、discharge condition、discharge diagnoses、discharge instructions、disposition、events、family history、social history、followup instructions、health maintenance、history of present illness、hospital course、icu care、medications、past medical history、past surgical history、physical examination、procedures、protected section、review of systems、service、test results、vital signs。其中assessment and plan是下游 AP Parsing 任务唯一真正关注的目标类型详见第五节。三、标记的加载与匹配SectionFinder 源码解读数据文件本身只是静态词典真正让它产生价值的是 note_section_lib.py 中的消费代码。整个模块围绕三个核心构件展开。3.1 Section 数据类dataclasses.dataclass class Section: char_start: int char_end: int section_types: List[str]Section用一个左闭右开的字符区间[char_start, char_end)定位笔记文本中的一段并携带其小节类型列表。__len__返回区间长度若char_end char_start则抛出ValueError用于兜底校验非法区间。3.2 标记加载get_markersdef get_markers(path): return json.load(open(path, r))get_markers直接读取上文介绍的 JSON 词典返回标题uncased→ 类型列表的字典。在 AP Parsing 的数据生成入口 data_gen_main.py 中正是通过note_section_lib.get_markers(_SECTION_MARKERS_PATH.value)加载--section_markers参数指向的 JSON 文件。3.3 匹配正则与 SectionFinder小节标题的匹配核心是模块级正则模板_REGEX_SECTION_HEADER r(?mi)^[\t\ ]*{}(?::\s|:?$)def _get_regexpr_from_marker(marker): return re.compile(_REGEX_SECTION_HEADER.format(re.escape(marker)))该模板的语义与 README 中提取标记时所用的正则(?mi)^[\t\ ]*(.*)(?::\s|:?\n)一脉相承(?m)多行模式使^匹配每行行首而非整个字符串开头(?i)忽略大小写——这解释了为什么 JSON 中标题的大小写形态如Assessment Plan与assessment and plan不会造成漏配^[\t\ ]*允许标题前有行首缩进Tab 或空格{}经re.escape转义后的标记文本避免标题中的特殊字符如、/、-干扰正则语义(?::\s|:?$)小节分隔符要求——要么是冒号 空白要么是冒号可选 行尾。这保证了HPI: 50 yo m...与独占一行的PMH:两种真实写法都能命中。SectionFinder在__init__中为每个标记预编译好正则self._marker_regexprfind_sections(text)则完成实际的分区查找。核心算法流程为遍历匹配对词典中的每个标记用预编译正则finditer扫描全文每命中一处就生成一个Section(char_startmatch.start(), char_endmatch.end(), ...)空结果短路若无任何命中直接返回空列表排序按char_start升序排序去重叠若相邻两个 Section 的区间发生重叠理论上正则按行首到分隔符匹配不应重叠此处作为 fail-safe删除较短的区间区间收口将每个 Section 的char_end调整为下一个 Section 的char_start最后一个 Section 的char_end置为全文长度len(text)。第 5 步至关重要它把仅命中标题头部的匹配结果扩展为标题行到下一标题之前的完整小节内容从而让每个 Section 都覆盖一整段真实正文。源码注释中特别强调Unlike MR sectioning logic, treats section header as part of the section——即小节标题本身也被视为小节的一部分这与某些将标题排除在正文之外的实现形成对比。四、算法行为验证从测试用例看边界情况note_section_test.py 用 4 个测试用例固化了上述算法的预期行为是理解标记系统边界的绝佳材料。用例一基本用法test_usage。给定一段包含HPI:、PMH:、AP:三个标题的笔记find_sections返回三个 Sectionchar_start依次为 0、54、90且各自只归属一个类型。注意测试用的自定义词典中ap是 JSON 里assessment plan的等价形态验证了re.escape对的处理。用例二多类型复合小节test_multiple_section_types。当标题为past medical and surgical history词典中映射[past medical history, past surgical history]时返回的 Section 携带两个section_types——与 JSON 中复合小节的语义完全一致。用例三标记内部含分隔符test_multiple_matches。当标记本身含有冒号如assessment: plan而正则又要求冒号空白结尾时两个标记assessment与assessment: plan可能对同一区域产生竞争匹配。测试验证了去重叠逻辑最终只保留区间更长覆盖更完整的assessment and plan段。用例四无命中test_no_sections。对一篇完全没有标记标题的纯文本find_sections返回空列表验证了空结果短路分支。这些测试可以在仓库根目录直接运行复现python3 -m assessment_plan_modeling.note_sectioning.note_section_test该命令同样出现在 run.sh 的全流程脚本中。五、实际落地标记在 AP Parsing 数据生成管线中的角色分区标记并非孤立的工具库它是 Assessment and PlanAP结构化理解任务数据生成链路的第一环。在 data_lib.py 中extract_ap_sections把SectionFinder的输出进一步收窄def extract_ap_sections(note_text, section_markers): section_finder note_section_lib.SectionFinder(section_markers) sections section_finder.find_sections(note_text) for section in sections: if assessment and plan in section.section_types: yield section也就是说先对整份 MIMIC 笔记做全量分区再从中筛出类型为assessment and plan的小节作为后续 AP 解析模型的输入文本。这解释了为什么标记词典要覆盖 26 种类型——虽然最终只消费一种但只有把全文结构都划分清楚才能准确定位 AP 段的边界。extract_ap_sections的调用点位于 Beam 数据生成管道的ProcessAPDataDoFn 中data_lib.py对每条笔记切出 AP 小节后按note.text[section.char_start:section.char_end]截取文本、记录char_offset再送入 tokenizer 与标注处理。而data_gen_main.py的--section_markers参数data_gen_main.py则通过命令行把标记文件注入整个 Beam 管道。完整的端到端使用方式可见 assessment_plan_modeling/README.md 中的数据生成示例DATA_DIRpath/to/data python assessment_plan_modeling/ap_parsing/data_gen_main.py \ --input_note_events${DATA_DIR}/notes.csv \ --input_ratings${DATA_DIR}/all_model_ratings.csv \ --output_path${DATA_DIR}/ap_parsing_tf_examples/$(date %Y%m%d) \ --vocab_file${DATA_DIR}/sample_vocab.txt \ --section_markersassessment_plan_modeling/note_sectioning/data/mimic_note_section_markers.json \ --n_downsample100 \ --max_seq_length2048注意--section_markers的值正是本文主角所在的完整路径run.sh 中亦使用同一路径。运行时需在仓库根目录下执行并前置创建虚拟环境与安装依赖python3 -m venv env source env/bin/activate pip install -r assessment_plan_modeling/requirements.txt六、扩展与定制构建自己的标记词典SectionFinder的设计决定了标记系统具备极强的可扩展性。从源码结构看SectionFinder.__init__接受任意符合标题 → 类型列表结构的字典因此自定义分区的路径非常直接新增类型直接在section_types列表中引入新字符串即可Section类不限制类型枚举docstring 中的 26 种类型只是当前数据文件的约定并非硬编码约束新增标记向 JSON 中追加条目get_markers与SectionFinder无需任何改动即可自动加载并预编译对应正则复用既有类型将新标题映射到已有类型即可在不改下游代码的情况下扩展召回例如把更多缩写、方言变体并入medications复合语义利用数组值表达一个标题、多类归属下游消费方如extract_ap_sections通过in section.section_types自行决定取用哪些类型。由于匹配基于re.escape(marker)与统一的正则模板扩展标记时只需注意标题中含有的正则元字符、/、-、:等会被自动转义无需手工处理而标题内部若包含冒号会与分隔符语法产生竞争此时由find_sections的去重叠逻辑兜底见第四节用例三。七、小结note_sectioning/data目录下的这份 README 与 JSON 标记词典虽然体量不大却是正则粗筛 临床专家精审这一数据生产思路的完整落地97 个标记覆盖了 MIMIC 笔记中从全称、缩写到句子式标题乃至拼写错误的真实写法26 种小节类型为全文结构划分提供了统一的语义坐标系而 note_section_lib.py 则以预编译正则、排序、去重叠、区间收口四个步骤把静态词典变成了可复用的分区抽取引擎并最终服务于 AP Parsing 数据生成管线中 AP 小节的精确定位。对于任何需要处理自由文本临床笔记、并希望以数据驱动 可解释规则方式做文档结构化的研究或工程任务这套标记数据与配套实现都是一个可直接参考与复用的范本。赞分享人工智能深度学习NLP计算机视觉强化学习【免费下载链接】google-researchGoogle Research项目地址https://gitcode.com/gh_mirrors/go/google-research点击查看免费下载相关推荐OpenAssistant MT Note Generation 数据集解析基于 MTSamples 合成临床笔记生成对话数据OpenAssistant MT Note Generation 数据集解析基于 MTSamples 合成临床笔记生成对话数据 导读 本文围绕 OpenAss人工智能大模型强化学习微调数据标注后端前端基于 TF-NLP 的临床评估与计划Assessment and Plan结构化解析实战指南基于 TF NLP 的临床评估与计划Assessment and Plan结构化解析实战指南 本篇技术指南围绕 Google Research 仓库中的 a人工智能深度学习NLP计算机视觉强化学习OpenMed 临床笔记 SDOH 提取与 ICD-10-CM Z 码映射实战指南OpenMed 临床笔记 SDOH 提取与 ICD 10 CM Z 码映射实战指南 社会健康决定因素Social Determinants of Health人工智能NLP医疗健康数据脱敏本地部署大模型AI 应用MCP 服务联邦学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考