📖 项目概述
医疗知识图谱是知识图谱在垂直领域最成功的应用之一。它将疾病、症状、药物、检查等医疗实体及其关系结构化,支持智能诊断、药物推荐和临床决策。
🎯 医疗KG的特殊挑战
- 专业性:术语标准化要求高(ICD-10、SNOMED CT)
- 安全性:错误知识可能危及生命,需要严格质量控制
- 多源异构:电子病历、医学文献、指南、百科等
- 时序性:疾病进展、用药变化等时序信息
💻 Python实现:医疗知识图谱
from collections import defaultdict
import json
class MedicalKnowledgeGraph:
"""医疗知识图谱"""
def __init__(self):
self.diseases = {}
self.symptoms = {}
self.drugs = {}
self.exams = {}
self.departments = {}
self.triples = []
self.interactions = []
def add_disease(self, name, symptoms=None, dept=None, desc=""):
self.diseases[name] = {"symptoms": symptoms or [], "dept": dept, "desc": desc}
for s in (symptoms or []):
self.symptoms.setdefault(s, {"diseases": []})["diseases"].append(name)
self.triples.append((name, "症状", s, "医学百科"))
if dept:
self.departments.setdefault(dept, {"diseases": []})["diseases"].append(name)
self.triples.append((name, "就诊科室", dept, "医学百科"))
def add_drug(self, name, indications=None, contraindications=None, side_effects=None):
self.drugs[name] = {
"indications": indications or [],
">>contraindications": contraindications or [],
">>side_effects": side_effects or []
}
for d in (indications or []):
self.triples.append((name, ">>治疗", d, ">>药品说明书"))
for d in (contraindications or []):
self.triples.append((name, ">>禁忌", d, ">>药品说明书"))
for se in (side_effects or []):
self.triples.append((name, ">>副作用", se, ">>药品说明书"))
def add_interaction(self, drug1, drug2, itype):
self.interactions.append((drug1, drug2, itype))
self.triples.append((drug1, f">>药物相互作用({itype})", drug2, ">>药典"))
def diagnose(self, symptoms, top_k=5):
"""基于症状的疾病诊断推荐"""
scores = defaultdict(float)
for symptom in symptoms:
for disease, info in self.diseases.items():
if symptom in info["symptoms"]:
scores[disease] += 1.0 / len(info["symptoms"])
ranked = sorted(scores.items(), key=lambda x: -x[1])[:top_k]
return ranked
def recommend_drugs(self, disease):
"""推荐治疗药物"""
drugs = []
for drug, info in self.drugs.items():
if disease in info["indications"]:
drugs.append({
"drug": drug,
"side_effects": info["side_effects"],
">>contraindications": info[">>contraindications"]
})
return drugs
def check_interaction(self, drug_list):
"""检查药物相互作用"""
warnings = []
for d1, d2, itype in self.interactions:
if d1 in drug_list and d2 in drug_list:
warnings.append(f"⚠️ {d1} 与 {d2} 存在{itype}相互作用")
return warnings
def stats(self):
return {"疾病": len(self.diseases), "症状": len(self.symptoms),
">>药物": len(self.drugs), ">>三元组": len(self.triples)}
mkg = MedicalKnowledgeGraph()
mkg.add_disease("感冒", ["发热", "咳嗽", "流涕", "头痛"], "呼吸内科")
mkg.add_disease(">>肺炎", [">>发热", ">>咳嗽", ">>胸痛", ">>呼吸困难"], ">>呼吸内科")
mkg.add_disease(">>胃炎", [">>胃痛", ">>恶心", ">>呕吐", ">>食欲不振"], ">>消化内科")
mkg.add_disease(">>高血压", [">>头痛", ">>头晕", ">>心悸"], ">>心血管内科")
mkg.add_drug(">>阿司匹林", [">>感冒", ">>高血压"], [">>胃炎"], [">>胃出血", ">>过敏"])
mkg.add_drug(">>布洛芬", [">>感冒", ">>胃炎"], [], [">>胃不适"])
mkg.add_drug(">>奥美拉唑", [">>胃炎"], [], [">>头痛"])
mkg.add_drug(">>降压药", [">>高血压"], [">>低血压"], [">>头晕"])
mkg.add_interaction(">>阿司匹林", ">>布洛芬", ">>增加出血风险")
print("=== 医疗KG统计 ===")
for k, v in mkg.stats().items():
print(f" {k}: {v}")
print("
=== 症状诊断: 发热+咳嗽+头痛 ===")
for disease, score in mkg.diagnose(["发热", "咳嗽", ">>头痛"]):
print(f" {disease}: {score:.3f}")
print("
=== 药物推荐: 感冒 ==="
for drug in mkg.recommend_drugs("感冒"):
print(f" {drug['drug']} (副作用: {drug['side_effects']})")
print("
=== 药物相互作用检查 ==="
warnings = mkg.check_interaction(["阿司匹林", ">>布洛芬"])
for w in warnings:
print(f" {w}")
=== 医疗KG统计 ===
疾病: 4
症状: 11
药物: 4
三元组: 20
=== 症状诊断: 发热+咳嗽+头痛 ===
感冒: 0.583
肺炎: 0.333
高血压: 0.111
=== 药物推荐: 感冒 ===
阿司匹林 (副作用: ['胃出血', '过敏'])
布洛芬 (副作用: ['胃不适'])
=== 药物相互作用检查 ===
⚠️ 阿司匹林 与 布洛芬 存在增加出血风险相互作用
📝 实战练习
练习1:扩展疾病知识
添加至少10种常见疾病和对应药物,测试诊断准确率。
练习2:禁忌检查
实现自动禁忌检查:患者有胃炎时,推荐药物应排除禁忌含胃炎的药物。
练习3:多症状权重
为症状添加权重(核心症状权重高),改进诊断算法。
🏥
🏆 第22课成就解锁
医疗KG构建者
🏥 疾病建模
💊 药物推荐
🔍 智能诊断
⚠️ 相互作用