MedTextCN 是一款专为中文医疗文本场景设计的自然语言处理工具包。在医疗信息化和智慧医疗快速发展的背景下,非结构化的中文病历文本蕴含着丰富的临床信息,但同时也面临着隐私保护和数据利用的双重挑战。
MedTextCN 旨在解决以下核心问题:
- 医疗实体识别:从非结构化病历文本中精准提取疾病、症状、药物、检查、解剖部位、治疗方式等医学实体,为下游临床决策支持、医学知识图谱构建提供基础能力。
- 患者隐私保护:自动检测病历中的个人身份信息(PII),支持多种脱敏策略,帮助医疗机构在数据共享和科研利用中满足《个人信息保护法》(PIPL)等法规的合规要求。
- 病历文本结构化:将自由文本形式的病历自动解析为标准化的 SOAP 格式(Subjective、Objective、Assessment、Plan),提升病历数据的可用性和互操作性。
无论是医疗 AI 研发团队、医院信息化部门,还是医疗数据科学从业者,MedTextCN 都能为您提供开箱即用的中文医疗文本处理能力。
内置 831+ 医学实体知识库,覆盖 6 大类别:疾病(158)、症状(116)、药物(175)、检查(135)、解剖部位(163)、治疗方式(84)。基于规则与词典混合匹配策略,无需 GPU 即可实现高效的实体识别。
支持 8 种 PII 类型检测:身份证号、手机号码、患者姓名、医保卡号、电子邮箱、家庭地址、出生日期、就诊日期。提供 4 种脱敏模式:遮罩(mask)、替换(replace)、哈希(hash)、移除(remove),符合《个人信息保护法》(PIPL)合规要求。
智能解析 9 种病历段落类型:主诉、现病史、既往史、个人史、家族史、体格检查、辅助检查、诊断、治疗方案。自动输出标准 SOAP 格式结构化结果,便于电子病历系统集成。
基于 jieba 分词引擎进行医学领域增强,内置医学专业词库和实体优先匹配策略,有效解决医学长词、专业术语的分词难题。
内置并发处理框架,支持大批量病历文本的并行处理,提供进度回调机制,可轻松集成到数据处理流水线中。
开箱即用的 REST API 服务,提供 7 个 API 端点,覆盖综合分析、实体提取、PII 检测、文本脱敏、文本结构化、健康检查和 API 文档等完整功能。
提供 analyze、serve、demo、version 四个命令,支持从终端直接进行文本分析、启动 API 服务、运行演示和查看版本信息。
提供完整的 Dockerfile,支持一键构建和部署,简化在服务器和云环境中的部署流程。
- Python >= 3.9
- pip(Python 包管理器)
pip install medtextcnfrom medtextcn import analyze_text
# 一行代码完成综合分析(NER + PII检测 + 结构化)
result = analyze_text("患者张三,男,65岁,因糖尿病入院")
print(result)输出示例:
{
"entities": [
{"text": "糖尿病", "type": "disease", "start": 12, "end": 15}
],
"pii": [
{"text": "张三", "type": "name", "start": 2, "end": 4}
],
"structured": {
"subjective": "患者张三,男,65岁,因糖尿病入院"
}
}从医疗文本中提取疾病、症状、药物、检查、解剖部位和治疗方式等实体。
from medtextcn import extract_entities
entities = extract_entities("高血压合并冠心病,需做心电图检查")
for entity in entities:
print(f"实体: {entity['text']}, 类型: {entity['type']}, 位置: {entity['start']}-{entity['end']}")输出:
实体: 高血压, 类型: disease, 位置: 0-3
实体: 冠心病, 类型: disease, 位置: 4-7
实体: 心电图, 类型: examination, 位置: 10-13
支持的实体类型:
| 类型 | 标签 | 内置数量 | 示例 |
|---|---|---|---|
| 疾病 | disease |
158 | 糖尿病、高血压、冠心病 |
| 症状 | symptom |
116 | 头痛、发热、咳嗽 |
| 药物 | drug |
175 | 阿莫西林、二甲双胍 |
| 检查 | examination |
135 | 血常规、心电图、CT |
| 解剖部位 | anatomy |
163 | 心脏、肝脏、左肺 |
| 治疗方式 | treatment |
84 | 手术、输液、透析 |
from medtextcn import detect_pii
pii_results = detect_pii("患者李四,身份证号110101199003076039,手机号13800138000")
for item in pii_results:
print(f"类型: {item['type']}, 内容: {item['text']}")输出:
类型: name, 内容: 李四
类型: id_card, 内容: 110101199003076039
类型: phone, 内容: 13800138000
from medtextcn import deidentify_text
# 遮罩模式(默认)
safe = deidentify_text("患者王五,手机号15098765432", mode="mask")
print(safe)
# 输出: 患者王*,手机号150****5432
# 替换模式
safe = deidentify_text("患者王五,手机号15098765432", mode="replace")
print(safe)
# 输出: 患者[患者姓名],手机号[手机号码]
# 哈希模式
safe = deidentify_text("患者王五,手机号15098765432", mode="hash")
print(safe)
# 输出: 患者a3f2e1...,手机号7b8c9d...
# 移除模式
safe = deidentify_text("患者王五,手机号15098765432", mode="remove")
print(safe)
# 输出: 患者,手机号支持的 PII 类型:
| 类型 | 标签 | 说明 |
|---|---|---|
| 患者姓名 | name |
中文姓名识别 |
| 身份证号 | id_card |
18位身份证号码 |
| 手机号码 | phone |
11位手机号码 |
| 医保卡号 | medical_card |
医保卡编号 |
| 电子邮箱 | email |
邮箱地址 |
| 家庭地址 | address |
中文地址信息 |
| 出生日期 | birth_date |
出生日期 |
| 就诊日期 | visit_date |
就诊/入院日期 |
将自由文本病历解析为标准 SOAP 格式。
from medtextcn import structure_text
text = """主诉:反复咳嗽3天。
现病史:3天前受凉后出现咳嗽,伴白色稀痰,无发热。
既往史:高血压病史5年,口服降压药控制。
体格检查:体温36.5℃,双肺呼吸音粗。
诊断:急性支气管炎。
治疗方案:抗感染治疗,对症处理。"""
structured = structure_text(text)
print(structured)输出:
{
"subjective": {
"chief_complaint": "反复咳嗽3天。",
"present_illness": "3天前受凉后出现咳嗽,伴白色稀痰,无发热。",
"past_history": "高血压病史5年,口服降压药控制。"
},
"objective": {
"physical_exam": "体温36.5℃,双肺呼吸音粗。"
},
"assessment": {
"diagnosis": "急性支气管炎。"
},
"plan": {
"treatment_plan": "抗感染治疗,对症处理。"
}
}from medtextcn import tokenize
tokens = tokenize("患者因急性心肌梗死入院,需行冠脉造影检查")
print(tokens)
# 输出: ['患者', '因', '急性心肌梗死', '入院', ',', '需', '行', '冠脉造影', '检查']from medtextcn import batch_analyze
texts = [
"患者张三,男,65岁,因糖尿病入院",
"患者李四,女,45岁,高血压合并冠心病",
"患者王五,男,72岁,慢性阻塞性肺疾病急性加重",
]
results = batch_analyze(texts, max_workers=4, progress_callback=lambda i, n: print(f"进度: {i}/{n}"))medtextcn serve --host 0.0.0.0 --port 8080| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/v1/analyze |
综合文本分析 |
| POST | /api/v1/entities |
实体提取 |
| POST | /api/v1/pii/detect |
PII 检测 |
| POST | /api/v1/pii/deidentify |
文本脱敏 |
| POST | /api/v1/structure |
文本结构化 |
| GET | /api/v1/health |
健康检查 |
| GET | /docs |
API 文档(Swagger UI) |
# 综合分析
curl -X POST http://localhost:8080/api/v1/analyze \
-H "Content-Type: application/json" \
-d '{"text": "患者张三,男,65岁,因糖尿病入院"}'
# 实体提取
curl -X POST http://localhost:8080/api/v1/entities \
-H "Content-Type: application/json" \
-d '{"text": "高血压合并冠心病,需做心电图检查"}'
# PII 检测
curl -X POST http://localhost:8080/api/v1/pii/detect \
-H "Content-Type: application/json" \
-d '{"text": "患者李四,身份证号110101199003076039"}'
# 文本脱敏
curl -X POST http://localhost:8080/api/v1/pii/deidentify \
-H "Content-Type: application/json" \
-d '{"text": "患者王五,手机号15098765432", "mode": "mask"}'# 文本分析
medtextcn analyze "患者张三,男,65岁,因糖尿病入院"
# 启动 API 服务
medtextcn serve --host 0.0.0.0 --port 8080
# 运行演示
medtextcn demo
# 查看版本
medtextcn version# 构建镜像
docker build -t medtextcn .
# 运行容器
docker run -p 8080:8080 medtextcn
# 后台运行
docker run -d --name medtextcn-server -p 8080:8080 medtextcnMedTextCN 采用分层模块化架构设计,各模块职责清晰、松耦合,便于独立使用和扩展。
┌─────────────────────────────────────────────────────────┐
│ 接入层 (Access Layer) │
│ ┌──────────┐ ┌──────────────┐ ┌───────────────────┐ │
│ │ CLI 命令 │ │ FastAPI REST │ │ Python SDK (API) │ │
│ └────┬─────┘ └──────┬───────┘ └─────────┬─────────┘ │
├───────┴───────────────┴───────────────────┴─────────────┤
│ 服务层 (Service Layer) │
│ ┌────────────┐ ┌──────────┐ ┌──────────┐ ┌───────────┐ │
│ │ 综合分析器 │ │ 批量引擎 │ │ 脱敏引擎 │ │ 结构化引擎│ │
│ └─────┬──────┘ └────┬─────┘ └────┬─────┘ └─────┬─────┘ │
├────────┴──────────────┴───────────┴─────────────┴───────┤
│ 核心层 (Core Layer) │
│ ┌────────────┐ ┌──────────┐ ┌──────────┐ ┌───────────┐ │
│ │ NER 引擎 │ │ PII 检测 │ │ 分词引擎 │ │ 段落解析器│ │
│ └─────┬──────┘ └────┬─────┘ └────┬─────┘ └─────┬─────┘ │
├────────┴──────────────┴───────────┴─────────────┴───────┤
│ 数据层 (Data Layer) │
│ ┌────────────┐ ┌──────────┐ ┌──────────┐ ┌───────────┐ │
│ │ 医学实体库 │ │ PII 规则 │ │ 医学词库 │ │ 段落模板库│ │
│ │ (831+) │ │ (8类) │ │ (jieba+) │ │ (9类) │ │
│ └────────────┘ └──────────┘ └──────────┘ └───────────┘ │
└─────────────────────────────────────────────────────────┘
模块说明:
| 模块 | 职责 | 关键技术 |
|---|---|---|
| NER 引擎 | 医学实体识别 | 词典匹配 + 规则引擎 |
| PII 检测 | 个人信息检测 | 正则表达式 + 上下文分析 |
| 分词引擎 | 医学文本分词 | jieba + 医学词库增强 |
| 段落解析器 | 病历段落分类 | 模式匹配 + 关键词提取 |
| 脱敏引擎 | 文本脱敏处理 | 多策略脱敏管线 |
| 结构化引擎 | SOAP 格式输出 | 段落分类 + 字段映射 |
| 批量引擎 | 并发批处理 | ThreadPoolExecutor |
| REST 服务 | HTTP API | FastAPI + Pydantic |
medtextcn/
├── docs/
│ ├── logo.jpg # 项目 Logo
│ ├── README.en.md # 英文版 README
│ └── README.zh-TW.md # 繁体中文版 README
├── medtextcn/
│ ├── __init__.py # 包入口,导出公共 API
│ ├── cli.py # CLI 命令行工具
│ ├── api/
│ │ ├── __init__.py
│ │ ├── app.py # FastAPI 应用
│ │ ├── routes.py # API 路由定义
│ │ └── schemas.py # Pydantic 数据模型
│ ├── core/
│ │ ├── __init__.py
│ │ ├── ner.py # NER 实体识别引擎
│ │ ├── pii.py # PII 检测引擎
│ │ ├── tokenizer.py # 医学增强分词器
│ │ └── parser.py # 病历段落解析器
│ ├── services/
│ │ ├── __init__.py
│ │ ├── analyzer.py # 综合分析服务
│ │ ├── deidentifier.py # 脱敏服务
│ │ ├── structurer.py # 结构化服务
│ │ └── batch.py # 批量处理引擎
│ └── data/
│ ├── entities/ # 医学实体词典
│ │ ├── diseases.json # 疾病实体 (158)
│ │ ├── symptoms.json # 症状实体 (116)
│ │ ├── drugs.json # 药物实体 (175)
│ │ ├── examinations.json # 检查实体 (135)
│ │ ├── anatomy.json # 解剖部位 (163)
│ │ └── treatments.json # 治疗方式 (84)
│ ├── pii_patterns.json # PII 检测规则
│ ├── section_patterns.json # 段落分类规则
│ └── medical_words.txt # 医学分词词库
├── tests/
│ ├── test_ner.py # NER 引擎测试
│ ├── test_pii.py # PII 检测测试
│ ├── test_deidentify.py # 脱敏功能测试
│ ├── test_structure.py # 结构化测试
│ ├── test_tokenizer.py # 分词器测试
│ └── test_api.py # API 接口测试
├── Dockerfile # Docker 构建文件
├── setup.py # 包安装配置
├── pyproject.toml # 项目元数据
├── README.md # 项目说明(本文件)
├── CONTRIBUTING.md # 贡献指南
├── LICENSE # MIT 开源协议
└── .github/
└── workflows/
└── ci.yml # CI/CD 配置
# 克隆仓库
git clone https://github.com/gitstq/MedTextCN.git
cd MedTextCN
# 创建虚拟环境
python -m venv venv
source venv/bin/activate # Linux/macOS
# venv\Scripts\activate # Windows
# 安装开发依赖
pip install -e ".[dev]"
# 安装项目
pip install -e .# 运行全部测试
pytest tests/ -v
# 运行特定模块测试
pytest tests/test_ner.py -v
pytest tests/test_pii.py -v
# 查看测试覆盖率
pytest tests/ --cov=medtextcn --cov-report=html# 代码格式化
black medtextcn/ tests/
# 代码检查
flake8 medtextcn/ tests/
# 导入排序
isort medtextcn/ tests/- 扩展医学实体库至 2000+ 实体
- 新增手术记录、护理记录等段落类型解析
- 支持自定义实体词典加载
- 性能优化:大文本处理速度提升 50%
- 集成预训练中文医疗语言模型(如 cBLUE、CMeKG)
- 提供 BERT/BiLSTM-CRF 模型推理接口
- 支持模型微调与自定义训练流水线
- 实体识别 F1 值提升至 90%+
- 医学知识图谱构建工具
- 多模态支持(影像报告、检验报告)
- 临床决策支持(CDS)基础接口
- 分布式部署与高可用架构
- Web 可视化管理界面
我们欢迎并感谢任何形式的贡献!无论是提交 Bug 报告、改进文档,还是提交代码 Pull Request。
请阅读 贡献指南 了解详细的贡献流程和规范。
快速贡献流程:
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/amazing-feature) - 提交更改 (
git commit -m 'Add some amazing feature') - 推送到分支 (
git push origin feature/amazing-feature) - 创建 Pull Request
本项目基于 MIT License 开源。
MIT License
Copyright (c) 2024 gitstq (琦琦)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
MedTextCN 的开发得益于以下优秀开源项目和技术社区的支持:
- jieba — 结巴中文分词,MedTextCN 医学分词器的底层引擎
- FastAPI — 高性能 Python Web 框架,为 REST API 提供基础支撑
- Pydantic — 数据验证与序列化,确保 API 数据一致性
- cBLUE — 中文医学语言理解基准,为模型评估提供参考
- CMeKG — 中文医学知识图谱,实体库构建的重要参考
- PyPI — Python 包索引,MedTextCN 的分发平台
感谢所有为中文医疗 NLP 领域做出贡献的研究者和开发者。
MedTextCN — 让中文医疗文本分析更简单
Made with ❤️ by gitstq (琦琦)
