医数智联·第 19 期:Python + 病历关键词提取 —— 让医学 NLP 不再神秘,jieba + TF-IDF
医数智联·第 19 期:Python + 病历关键词提取 —— 让医学 NLP 不再神秘,jieba + TF-IDF
[!ABSTRACT] 核心摘要
- 本期主题:Python + 中文 NLP——用 jieba 分词 + TF-IDF 提取病历关键词
- 核心结论:病历 = 非结构化文本的「金矿」,用 NLP 工具,5 分钟挖出 1000 份病历的关键词
- 3 大核心库:jieba(中文分词)+ sklearn(TF-IDF 算法)+ wordcloud(词云可视化)
- 3 大医院场景:病历关键词提取、词频统计、相似病案检索
- 典型效果:从「人工阅读 1 万份病历」变成「机器 5 分钟提取关键词」
- 阅读时长:约 10 分钟
一、场景引入:为什么医院需要「病历 NLP」?
[!example] 一个真实的科研项目
某三甲医院启动「急性心梗患者出院后 30 天再入院」研究,需要:
- 找出 5 年内 1.2 万份「急性心梗」出院病历;
- 提取每份病历的「出院时状态」——是「治愈」「好转」「未愈」「死亡」?
- 分析 30 天再入院的病历,出院时状态分布如何?
信息科负责人看了 1 份病历:
「出院时状态藏在入院记录、出院小结、病程记录3 个字段里,每个医生写法不一样——有的写『好转』,有的写『病情稳定』,有的写『建议出院』……」
「人工读 1.2 万份病历要 200 人天。」
这是医院病历数据利用的典型困境——病历是最丰富的医学数据,但也是最难处理的。
| 病历特征 | 难点 |
|---|---|
| 非结构化:整段文字 | 机器难读 |
| 写法多样:「心梗」「急性心肌梗死」「AMI」「STEMI」同一回事 | 难归一化 |
| 专业术语多:医学名词、缩写、症状描述 | 通用分词器不行 |
| 隐私敏感:姓名、身份证、电话 | 需脱敏 |
[!quote] 狼叔的判断
“病历是医院最大的’数据沉睡资产’,NLP 是’唤醒’它的钥匙。” 这一期,带你用 Python 入门医学 NLP,5 分钟搞定人工 200 天的活。
二、工具原理:jieba + TF-IDF 是什么?
2.1 中文分词:jieba
[!info] jieba 是什么?
jieba(结巴分词)是 Python 最流行的中文分词库。核心原理:基于词典 + HMM(隐马尔可夫模型),把整段中文切成「词」。
示例:
1
2 输入:患者因急性胸痛3小时入院
输出:['患者', '因', '急性', '胸痛', '3', '小时', '入院']
2.2 关键词提取:TF-IDF
[!info] TF-IDF 是什么?
TF-IDF(Term Frequency-Inverse Document Frequency) 是衡量「一个词对一份文档的重要程度」的算法。原理:
- TF(词频):一个词在文档里出现次数越多,越重要
- IDF(逆文档频率):一个词在所有文档里出现越少,越有区分度
- TF-IDF = TF × IDF
示例:
- 「的」「了」「是」TF 很高,但几乎所有文档都有 → IDF 低 → TF-IDF 低
- 「黄斑水肿」TF 不高,但只在眼科病历出现 → IDF 高 → TF-IDF 高
2.3 医院专属词典
[!TIP] 必须加医学词典
jieba 默认词典不识别医学术语,「急性心肌梗死」会被切成「急性」「心肌」「梗死」3 个词,失去原意。解决:自定义医学词典,加载到医院专属词库。
三、医院实战:3 大 NLP 场景
3.1 安装与准备
1 | pip install jieba scikit-learn wordcloud matplotlib |
1 | import jieba |
3.2 准备医学词典
1 | # 自定义医学词典(常见疾病、症状、体征、手术、操作) |
3.3 场景一:病历分词
[!example] 实战 ①:病历分词
1 | # 示例病历主诉 |
[!TIP] 验证医学词典生效
1
2
3
4
5 # 检查特定词是否在词典里
for word in ['急性胸痛', '急性心肌梗死', 'STEMI']:
seg_list = jieba.lcut(word)
print(f"{word} → {seg_list}")
# 如果词典生效,每个词都是单独一个元素
3.4 场景二:关键词提取(TF-IDF)
[!example] 实战 ②:关键词提取
工具:jieba 内置的analyse.extract_tags
1 | # 读 100 份病历的主诉 |
输出:
1 | 病历 1: 患者因急性胸痛3小时入院,伴大汗淋漓 |
[!success] 医学词典的价值
没有医学词典时,「急性心肌梗死」被切成 4 个词,TF-IDF 把它们当成普通词。加载医学词典后,「急性心肌梗死」作为整体关键词出现,准确度大幅提升。
3.5 场景三:词频统计 + 词云可视化
[!example] 实战 ③:词频 + 词云
1 | # 加载所有病历主诉 |
典型输出:
1 | Top 30 关键词: |
3.6 场景四:相似病案检索(进阶)
[!example] 实战 ④:相似病案检索
场景:输入一份病历,自动找出最相似的 10 份病历。
1 | from sklearn.metrics.pairwise import cosine_similarity |
四、避坑指南:5 个让医学 NLP「失灵」的常见错误
[!warning] 雷区 ①:不用医学词典
症状:「急性心肌梗死」被切成 4 个词,关键词提取一塌糊涂。
解决:必须加医学词典(见 3.2)。
[!warning] 雷区 ②:不脱敏
症状:病历里有姓名、身份证、电话,NLP 处理时直接暴露。
解决:预处理时正则替换:
1
2
3 import re
文本 = re.sub(r'\d{17}[\dXx]', '[身份证]', 文本) # 身份证
文本 = re.sub(r'1[3-9]\d{9}', '[手机号]', 文本) # 手机号
[!warning] 雷区 ③:停用词没过滤
症状:Top 关键词是「患者」「因」「入院」等无用词。
解决:维护医学停用词表(见 3.5)。
[!warning] 雷区 ④:词云显示方块
症状:词云里中文是「□□□」。
解决:指定中文字体:
1 WordCloud(font_path='simhei.ttf')
[!warning] 雷区 ⑤:TF-IDF 不适合短文本
症状:病历主诉只有 30 字,TF-IDF 算出来没区分度。
解决:短文本用 KeyBERT(基于 BERT 的关键词提取),或合并主诉+现病史+出院小结形成长文本。
五、把 NLP 嵌入自动化流程
[!TIP] 实战:每月自动病历分析
- 每月 1 日:脚本自动从 HIS 导出病历
- 分词 + 关键词提取:5 分钟处理 1 万份
- 生成 3 份报告:
- 词云图(给院长看)
- Top 关键词 Excel(给科研用)
- 相似病案检索(给医生参考)
- 自动发邮件给科主任
六、下期预告
[!quote] 第 20 期
Python + 质控报告 PDF 自动生成 —— 一键生成院长周报这一期,带你用
reportlab+matplotlib自动生成 PDF 质控报告,告别 Word 排版。
[!TIP] 互动
如果你觉得这篇「医数智联·第 19 期」对你有用,请点赞、在看、转发给科里的同事。我是白衣狼,一个用数字化工具把医院管理做「轻」的实战派。咱们下期见。





