[开源] 护理语音医嘱转换系统:面向移动护理终端的结构化记录工具,自动解析床号、操作、参数与通知状态
本项目是一个专为临床一线护士设计的轻量级命令行工具,解决移动护理终端中语音描述转结构化医嘱记录的断点问题。我们不对接医院HIS或EMR系统,也不要求部署服务端,而是以本地可执行方式嵌入护士日常操作流:护士口述「14床测血压,偏高,通知医生」,系统实时输出含床号、操作类型、参数语义值、通知标记及待确认状态的标准化记录。核心能力全部围绕护理文书规范展开,床号支持「14床」「14-床」「14床xxx」等非标写法;护理操作覆盖20+项高频动作(如测血压、吸痰、翻身、静脉输液),并内置同义词映射;参数描述(如「偏高」「稍快」「正常范围」)被统一归一为预定义语义标签;是否需通知医生由上下文关键词触发识别;最终结果可导出为JSON(供系统集成)、CSV(GBK编码,适配院内Windows环境)和HTML(带时间戳与原始文本的可读报告)。它用TypeScript + Node.js构建,模块化拆分为解析、映射、导出与CLI四层,所有逻辑在本地运行,无网络依赖,测试覆盖全部关键路径。
定位与能力边界
我们不做语音识别(ASR),只处理已转写的中文文本;不做NLP大模型微调,不依赖GPU或云API;不生成护理计划或评估结论,只做从自然语言到结构化字段的确定性映射。它的存在前提很具体:护士已在移动端完成语音输入并获得文字稿,但人工逐字录入结构化表单仍耗时、易错、难回溯。因此,系统能力严格限定在四个可验证环节:
- 床号提取:识别数字+床/床号/bed等变体,兼容空格、短横、中英文混排;
- 操作识别:基于预置术语库匹配动作意图,例如「量血压」「测BP」「血压监测」均映射至measure_bp;
- 参数解析:将模糊描述映射为标准枚举值,如「偏高」→abnormal_high,「稍快」→slightly_fast,「正常」→normal;
- 通知判定:检测「通知医生」「叫医生」「得找大夫」等显式表达,也识别隐含场景(如「室颤」「心跳骤停」自动触发notifyDoctor: true)。
超出这四类的语义(如时间推演、风险评分、跨操作关联)不在当前设计范围内。这不是一个通用医疗NLU平台,而是一把为护理文书场景打磨的结构化小刀。
核心功能详解
以下功能全部通过本地解析引擎实现,无需联网,不上传任何数据:
功能模块 | 支持内容 | 示例输入与输出要点 |
|---|---|---|
| 床号提取 | 「14床」「14-床」「14床患者」「床14号」「十四床」 | 统一归一为字符串 |
| 护理操作识别 | 20+种操作,含同义词扩展(如「吸痰」匹配「负压吸痰」「气道吸痰」) | 输出字段 |
| 参数值解析 | 支持程度副词+名词组合(「明显升高」「轻度水肿」「基本正常」) | parameters数组中每个对象含 |
| 通知状态检测 | 显式关键词+高危事件词典双路触发 | notifyDoctor: true仅当语义明确指向医生介入,非所有「异常」都触发 |
| 多格式导出 | JSON(标准结构)、CSV(GBK编码,列名中文,兼容Excel打开)、HTML(含样式模板) | CSV默认用逗号分隔,空值留空,不加引号;HTML使用 |
所有解析规则均来自data/目录下的结构化术语表,而非正则硬编码。例如「测血压」对应的操作ID、参数名、单位、可能取值范围,全部在data/operations.json中明确定义,便于科室按本院习惯增删改。
使用与交互方式
系统提供四种使用路径,全部通过npm start入口统一调度:
npm start -- --text "14床测血压,偏高,通知医生"npm start -- --file data/examples.jsonnpm start -- --text "14床测血压" --format csv --output result.csvnpm start交互式模式下,每行输入一条语音文本,空行结束,实时返回JSON结果。这种设计适配两种典型场景:一是护士在查房间隙用手机终端快速录入单条指令;二是信息科批量清洗历史语音转写日志。所有命令行参数含义如下表:
参数 | 含义 | 是否必需 | 补充说明 |
|---|---|---|---|
--text | 单行待解析文本 | 否(与 | 支持中文标点,无需额外清理 |
--file | JSON格式批量输入文件路径 | 否(与 | 文件内容为字符串数组,如 |
--format | 输出格式: | 否 | csv强制GBK编码,避免Excel乱码 |
--output | 输出文件路径 | 否(不指定则打印到控制台) | html模式必须指定此参数才能生成报告 |
注意:--file读取的是纯文本JSON数组,不是带结构的医嘱对象集合;系统不校验输入合法性,只对符合护理语言习惯的文本做最优解析。
工程结构与可维护性
整个项目按职责清晰切分为五个源码模块,全部位于src/下:
parser/:纯函数式文本切分与词元识别,不依赖外部状态,输入字符串,输出中间词元树;
mapper/:将词元映射为标准操作ID与参数枚举值,核心逻辑集中在
operationMap.ts与parameterRules.ts;export/:格式无关的导出接口抽象,
jsonExporter.ts、csvExporter.ts、htmlExporter.ts各自实现ExportStrategy;cli/:封装命令行参数解析(
yargs)、输入流控制与结果输出,与业务逻辑零耦合;utils/:提供
normalizeText()(去噪、统一空格)、parseBedNo()(正则+规则双校验)等复用函数。
测试驱动开发贯穿全程:__tests__/中每个模块均有对应单元测试,且包含集成测试验证端到端流程。例如bedNo.test.ts覆盖「14床」「床14」「14-床」等7种写法;parameter.test.ts验证「偏低」「轻度降低」「略低于正常」全部映射至abnormal_low;e2e.test.ts用真实样例文本检验最终JSON字段完整性。所有测试用例均来自临床真实语料整理,非虚构构造。
数据与扩展机制
术语体系完全开放可配置,所有业务规则不写死在代码里:
护理操作定义存于
data/operations.json,每项含id、keywords(同义词数组)、parameters(参数名与可选值列表);床号识别规则在
data/patterns/bedNoPatterns.json中声明正则与后处理逻辑;参数语义映射表位于
data/parameterValues.json,定义「偏高」「升高」「明显增高」→abnormal_high等映射;HTML报告模板在
templates/report.html中,支持自定义CSS与字段展示顺序。
新增一项操作(如「中心静脉压监测」)只需在operations.json中添加条目,无需修改任何TypeScript源码。术语库更新后,重新运行npm start即可生效,无编译步骤。
限制与适用说明
本系统有明确的能力边界,须提前知悉:
- 不处理语音音频,仅接受已转写的中文文本;
- 不校验床号真实性(如「999床」仍会提取为"999"),需由上层系统或人工核对;
- 参数解析基于预设词典,未登录词(如新造口语「有点儿悬」)无法识别,返回空参数数组;
- CSV导出不包含嵌套结构(如多个操作共存时,一行CSV仅对应一个operations[0]),完整结构请用JSON;
- HTML报告为静态页面,不支持交互式筛选或导出子集。
它适合三类使用者:一线护士(单条快速录入)、信息科人员(批量清洗语音日志)、护理质控员(导出CSV做操作频次统计)。不适合替代专业语音识别引擎,也不用于生成法律效力文书,所有输出均标注"status": "pending_confirm",必须经护士二次确认后方可归档。
项目地址:
https://github.com/nexorin9/nursing-voice-order-converter
