从电子病历提取数据
Jun 15, 2021
1 minute read

电子病历的普及度已经很高。但如何从电子病历中提取信息还是比较令人头疼。 首先病历内容众多,从主诉到体格检查,从家族史到用药史,一份完整的病历涵盖的信息众多。 其次,病历内容是由医生按照段落填写的,很难在数以万计的病历中找到通用的标准进行提取。

当然,如果医院的病历系统是按照表格进行组织并且保存,比如我之前实习过的社区医院,将每个人的电子病历 保存为 HTML 格式,就可以使用 python 的 BeautifulSoup 进行提取。当然,如果只能得到大段 文字的话,大概需要借助人工智能里面的自然语言处理来做更多的工作的。

当然,如果任务比较简单的话,我们还是有取巧的方法的。比如要从病历记录里面提取出来身高、体重、收缩压和舒张压 等等,如:“血压114/56mmHg,体重53.3kg,胎心146次/分,宫高25cm,宫缩无。” 这样的描述中提取出舒张压:56,收缩压:114,体重:53.3 等等数据,我们可以借助正则表达式解决:

library(readxl)
library(tidyr)
library(stringr)

data <- read_excel("data.xlsx", sheet = 1)

extract_blood_pressure <- function(diag_str) {
  res <- str_match(diag_str, "血压[:: ]*[0-9]*/[0-9]*[ ]*[(mmHg)|(mmhg)]+")
  blood_pressure <- unlist(str_extract_all(res[, 1], "[0-9]+"))
  return(as.numeric(blood_pressure))
}

extract_height <- function(diag_str) {
  res <- str_match(diag_str, "身高[::]*[0-9]*/[0-9]*[ ]*[cC][mM]")
  height <- unlist(str_extract_all(res[, 1], "[0-9]+"))
  return(as.numeric(blood_pressure))
}

extract_weight <- function(diag_str) {
  res <- str_match(diag_str, "体重[ ]*([0-9]{1,}[.]*[0-9]*)[ ]*[kK][gG]")
  weight <- unlist(str_extract_all(res[, 1], "[0-9]{1,}[.]*[0-9]*"))
  return(as.numeric(weight))
}

其实就是医生在写这些数据的时候,绝大部分情况下都有这样的固定模式,可以让我们通过正则表达式 提取。当然,我们甚至可以针对更多数据,包括心率、体温等等,给出对应的正则表达式。我写的是针对我得到 的数据给出的解决方案,可能不具有普适性,甚至在语法上也不一定是完美方案,但思路和代码仅供大家参考。

另外,关于这个主题有几个比较实用的网站推荐: