google-research 之 Assessment Plan Modeling:MIMIC 临床笔记分区标记(Note Section Markers)数据集与解析实战
2026/9/20 1:43:10 网站建设 项目流程
  • 人工智能
  • 深度学习
  • NLP
  • 计算机视觉
  • 强化学习

【免费下载链接】google-research

Google 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).

这句话交代了两个关键事实:

  1. 数据来源:标记本身提取自 MIMIC(MIMIC-III 的 note_event)临床笔记,因此天然覆盖了真实住院记录中出现的高频小节标题,而不是论文里虚构的规范格式。
  2. 提取方法:先用正则(?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 sytems"(sytems 拼写错误)也被收录并映射到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_markers

def 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 & Planassessment and plan)不会造成漏配;
  • ^[\t\ ]*:允许标题前有行首缩进(Tab 或空格);
  • {}:经re.escape转义后的标记文本,避免标题中的特殊字符(如&/-)干扰正则语义;
  • (?::\s+|:?$):小节分隔符要求——要么是"冒号 + 空白",要么是"冒号(可选)+ 行尾"。这保证了HPI: 50 yo m...与独占一行的PMH:两种真实写法都能命中。

SectionFinder__init__中为每个标记预编译好正则(self._marker_regexpr),find_sections(text)则完成实际的分区查找。核心算法流程为:

  1. 遍历匹配:对词典中的每个标记,用预编译正则finditer扫描全文,每命中一处就生成一个Section(char_start=match.start(), char_end=match.end(), ...)
  2. 空结果短路:若无任何命中,直接返回空列表;
  3. 排序:按char_start升序排序;
  4. 去重叠:若相邻两个 Section 的区间发生重叠(理论上正则按"行首到分隔符"匹配不应重叠,此处作为 fail-safe),删除较短的区间;
  5. 区间收口:将每个 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:A&P:三个标题的笔记,find_sections返回三个 Section,char_start依次为 0、54、90,且各自只归属一个类型。注意测试用的自定义词典中"a&p"是 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),而正则又要求"冒号+空白"结尾时,两个标记(assessmentassessment: 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 Plan(A&P)结构化理解任务数据生成链路的第一环。在 data_lib.py 中,extract_ap_sectionsSectionFinder的输出进一步收窄:

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 种类型——虽然最终只消费一种,但只有把全文结构都划分清楚,才能准确定位 A&P 段的边界。

extract_ap_sections的调用点位于 Beam 数据生成管道的ProcessAPDataDoFn 中(data_lib.py):对每条笔记切出 A&P 小节后,按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_DIR="path/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_markers="assessment_plan_modeling/note_sectioning/data/mimic_note_section_markers.json" \ --n_downsample=100 \ --max_seq_length=2048

注意--section_markers的值正是本文主角所在的完整路径(run.sh 中亦使用同一路径)。运行时需在仓库根目录下执行,并前置创建虚拟环境与安装依赖:

python3 -m venv env source env/bin/activate pip install -r assessment_plan_modeling/requirements.txt

六、扩展与定制:构建自己的标记词典

SectionFinder的设计决定了标记系统具备极强的可扩展性。从源码结构看,SectionFinder.__init__接受任意符合"标题 → 类型列表"结构的字典,因此自定义分区的路径非常直接:

  1. 新增类型:直接在section_types列表中引入新字符串即可,Section类不限制类型枚举(docstring 中的 26 种类型只是当前数据文件的约定,并非硬编码约束);
  2. 新增标记:向 JSON 中追加条目,get_markersSectionFinder无需任何改动即可自动加载并预编译对应正则;
  3. 复用既有类型:将新标题映射到已有类型,即可在不改下游代码的情况下扩展召回(例如把更多缩写、方言变体并入medications);
  4. 复合语义:利用数组值表达"一个标题、多类归属",下游消费方(如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 数据生成管线中 A&P 小节的精确定位。对于任何需要处理自由文本临床笔记、并希望以"数据驱动 + 可解释规则"方式做文档结构化的研究或工程任务,这套标记数据与配套实现都是一个可直接参考与复用的范本。

  • 人工智能
  • 深度学习
  • NLP
  • 计算机视觉
  • 强化学习

【免费下载链接】google-research

Google Research

项目地址:https://gitcode.com/gh_mirrors/go/google-research
点击查看免费下载

相关推荐

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

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

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

立即咨询