想象你住的城市里有一套“市政语言系统”:警察、医院、消防、统计局各说各的方言。老王在社区医院被记为“糖尿”,转诊到三甲医院变成“2型糖尿病”,药房拿到的处方上写着“格华止”。这三条记录其实说的是同一个人、同一件事,但机器看到的是三串完全不同的字,没法把它们自动关联起来。真实世界的医院,正是这样一座“术语巴别塔”。 要让数据在科室间、医院间、国家间自由流动,城市就必须有“普通话”。SNOMED CT、ICD-10、LOINC、RxNorm,就是医疗数据世界里的四套标准普通话:一套写“发生了什么”,一套做“统计归类”,一套管“检验观测”,一套管“用药品种”。它们各管一摊,又互相咬合,构成了电子病历和临床AI的地基。本篇用“一座医院城市”的比喻,把这四套体系讲清楚。
对AI从业者来说,掌握这四套体系等于拿到了医疗数据的“官方地图”:你知道一段临床文本该挂到哪套体系上、编码怎么来、体系之间怎么翻译。临床NLP、电子病历处理、医疗AI落地,都绕不开这个地基。
目录
可视化演示
展示SNOMED CT/ICD-10/LOINC/RxNorm四大临床术语体系对比与跨体系映射关系,含术语编码层次与NLP应用。
本节配有交互动效(进入视口后自动加载,约 3KB)。
四大临床术语体系对比 SNOMED CT:综合临床参考术语 ICD-10/LOINC/RxNorm各有专域 SNOMED | ICD | LOINC | RxNorm 四大体系覆盖诊断/检验/药品编码全领域。
一、标准化必要性:为什么一座城市需要“普通话”
假设老王看完病,社区医院的医生在系统里敲了一个“DM”,二线医院的医生敲“糖尿病”,医保上报时又写成“2型糖尿病”。三条记录在纸面上都是同一件事,可机器只会做字符串精确匹配,看到“DM”和“糖尿病”就以为是两个病。城市里每个部门各说各话,警察报警、消防出警、救护车调度都会互相听不懂。医疗系统也是一座城市,病历文本被不同的方言切割成一个个孤岛:医院与医院之间、科室与科室之间、甚至同一个系统不同版本之间,数据都无法互认。
要让数据流通,就必须给每个概念一个“标准词条”。标准术语体系就是医疗数据的普通话:它规定了概念怎么命名、怎么编号、概念之间是什么关系。从数据视角看,一个术语体系就是一个结构化的概念集合,可以用公式写出来:
有了“概念+关系”,机器不再只看字符串,而是看“编号背后的含义”。当全市医院都说这套普通话,老王的数据就能从社区医院一路跑到三甲医院,中间不需要人工翻译。AI从业者把这段故事往深处想一步:所有临床NLP任务,本质上都是在文本和这套“概念图谱”之间搭桥。
- 术语体系 T$T$ 代表一套完整的标准术语体系,它包含概念和关系两部分。
- 概念集合 C$C=\{c_1,c_2,\dots,c_n\}$ 是体系内所有被收录的概念,每个概念都有全局唯一编号。
- 关系集合 R$R$ 描述概念之间的语义连接,比如上下级、部位、病因等。
二、SNOMED CT:给临床叙事写“城市档案”
如果说医院是一座城市,那么SNOMED CT就是城市里最细心的档案员。它不满足于只记“老王得了糖尿病”,它还想记下“老王什么时候开始多饮多尿”“病变发生在胰腺”“是否有酮症酸中毒倾向”。它像一本会讲故事的病历百科全书,把人从“正常”到“异常”的每一个临床细节都纳入体系。
这种细致来自SNOMED CT的基本结构:概念(Concept)、描述(Description)和关系(Relationship)。每个临床意义都有一个唯一的概念ID,例如“2型糖尿病”的概念ID是44054006。概念之间通过“is-a”构成一棵巨大的语义树:44054006是“内分泌疾病”的子类,而“内分泌疾病”又是“疾病”的子类。AI解析一份病历,只要锁定44054006,就能顺着关系找到它的所有父类和兄弟概念。
正是因为这样一张网,AI才能做推理:如果患者同时有“视网膜病变”和“糖尿病”,顺着is-a链路可以发现两者可能相关。但档案越细,代价也越大——SNOMED CT有几十万概念,日常统计时反而“细到没法汇总”。于是城市还需要第二套语言:ICD-10。
- 概念ID 44054006它代表“2型糖尿病”这个临床概念,是SNOMED CT 里的唯一身份编号。
- 属于概念集合这说明44054006是SNOMED CT概念集合的合法成员,所有成员都能参与语义推理。
- is-a关系
is-a表示“是一种”,这里指2型糖尿病是一种内分泌疾病。
三、ICD-10:市政统计局的“大账本”
SNOMED CT像私人日记,写满了老王的每个细节;ICD-10则像市政统计局的手册,只关心“这个病该归到哪个筐里”。它把成千上万种疾病浓缩成几百个类目,用字母加数字的短码表示,方便国家之间比较发病率和死亡率,也方便医保按病种付费。
ICD-10的编码结构就像城市街道的编号:先找区,再找路,再找门牌。一个完整的ICD-10编码由章节、类目和亚目组成。拿“2型糖尿病不伴并发症”来说,编码是E11.9:E代表“内分泌、营养和代谢疾病”这一章,11代表“糖尿病”这个类目,.9表示“无并发症”这个亚目。三部分叠加,信息量不大,但足够定位。
ICD-10用最少的字符交换最大的统计效率,代价是舍弃细节。ICD-10里E11.9下面住着很多临床情况各不相同的病人,统计口径够用,但做AI推理就太粗。SNOMED CT负责“细说”,ICD-10负责“汇总”,两者互为补充,谁也替代不了谁。
- 章节E$E$ 表示ICD-10第IV章,即内分泌、营养和代谢类疾病。
- 类目11$11$ 表示该章节下的“糖尿病”大类,后续扩展码都在这个类目下。
- 亚目.9$.\;9$ 表示该类的具体分支,这里指“不伴并发症”。
四、LOINC:检验项目的“商品条码”
超市里的每件商品都有一个条形码,收银员不用读“这是750毫升的某牌酱油”,扫一下码就知道厂家、规格、价格。LOINC就是检验和观测项目的“商品条码系统”。老王抽血查血糖,检验科在报告单上写“GLU 5.6mmol/L”,另一个医院可能写“Glucose 100mg/dL”,格式不同、单位不同、名称不同,机器很难对得上。LOINC给每个检验观测项发一个唯一编码,例如“血清/血浆中葡萄糖的质量浓度”对应LOINC 2345-7。
LOINC编码的聪明之处,在于它不是拍脑袋给编号,而是用六个语义要素“组装”出一个观测指标。这六个要素是:成分、受检属性、时间、系统、标尺、方法。你可以把它想成城市门牌号的六个维度:谁被测量、测它的什么性质、在哪个时间点测、在什么标本上测、结果是什么尺度、用什么方法测。
有了LOINC,老王在A医院查的血糖和B医院查的血糖就能被机器识别为“同一个观测项”。这对检验互认、多中心研究和AI模型训练至关重要。但LOINC只管“测什么”,不管“用什么药”。接下来要看药房的语言。
- 成分 C_i测定的是什么物质,比如葡萄糖。
- 受检属性 A_i测它的哪个性质,比如质量浓度还是摩尔浓度。
- 时间 T_i是某一时刻的“时间点”,还是24小时尿液的“时间段”。
- 系统 S_i在什么样本中测量,如血清、血浆或尿液。
- 标尺 SC_i结果是定量、定性还是序数等级。
- 方法 M_i用什么检测方法,若方法不影响临床解释可留空。
五、RxNorm:药品的“标准身份证”
城市的药房里,同一种成分的药可能叫“格华止”“盐酸二甲双胍片”“Metformin HCl Tablets”。这些名字听起来风马牛不相及,但实际是同一种东西。如果每个系统各记各的名字,老王在社区拿的“格华止”和三甲医院开的“二甲双胍”就无法对应,药物过敏、重复用药、剂量叠加都变成隐患。RxNorm就是给药品发“标准身份证”的体系。
RxNorm把药品组织成分层模型:最底层是成分(IN),比如“二甲双胍”;加上剂型和剂量规格,变成不带品牌的药品产品(SCD);再挂上品牌名,就得到品牌化的药品产品(SBD)。从成分到品牌,每一步都是一条明确的关系边。AI系统用药典做查询时,从任何一层都能顺藤摸瓜找到另外两层。
RxNorm让药房、处方系统、医保结算和临床决策支持系统能共享同一套药物语言。加上前面三套体系,城市的四大语言系统终于凑齐了。
- 成分概念 IN最底层的化学成分,比如二甲双胍,不包含剂型和品牌信息。
- has dose form 关系这一步给成分加上片剂、胶囊、注射剂等剂型信息。
- SCD 药品产品形成“二甲双胍片”这种不指定品牌的标准化产品。
- trade name 关系再把品牌名挂上去,比如“格华止”。
- SBD 品牌药最终形成“格华止片”这种带品牌的药品概念。
六、四体系协作:一份病历的“四语翻译”
SNOMED CT、ICD-10、LOINC、RxNorm各管一段,合在一起才覆盖一份完整病历。如果把老王一次门诊的电子病历拆开看:医生写的“2型糖尿病”属于诊断,交给SNOMED CT做语义记录、交给ICD-10做统计分类;检验单上的“血糖”属于观测,交给LOINC;处方上的“格华止”属于药品,交给RxNorm。四位记录员各写各的档案,拼起来就是老王这次就诊的完整数字画像。
这就是四体系协作的真相:它们不是竞品,而是拼图。SNOMED CT负责最细腻的临床叙事,ICD-10负责最简洁的统计口径,LOINC负责一切可观测的检验指标,RxNorm负责药品的标准化身份。AI在做电子病历结构化时,通常会把一条病历文本同时映射到多个体系,每个体系只取走自己该管的那部分。
理解了这个四件套,再回头看很多医疗AI项目的“数据清洗”工作,其实就是在做同一件事:把一段自由文本,映射到这四个体系的编码上。但城市之间的语言有差异,翻译从来不是百分百直译,这就引出了第七节的难题。
- 诊断维度症状和诊断由SNOMED CT记录,这里“2型糖尿病”挂上概念ID。
- 统计维度ICD-10给同一个诊断补一个统计分类码,用于医保和上报。
- 检验维度血糖这个检验项目用LOINC码表达,保证跨院互认。
- 药品维度处方中的“格华止”用RxNorm码6809表达,明确其成分和规格。
七、跨体系映射:不同语言之间的“同义词词典”
SNOMED CT和ICD-10都描述疾病,但它们一个说得细、一个分得粗。要把SNOMED CT的44054006(2型糖尿病)翻译成ICD-10的E11.9(糖尿病不伴并发症),看起来像是一对一,可实际中往往不是。SNOMED CT里有好几个关于“2型糖尿病”的细分概念,它们可能都落到同一个ICD-10编码里;反过来,一个SNOMED概念在ICD-10中也可能对应多个统计码,这取决于并发症状态。
跨体系映射,就是建一张“同义词词典”,把一个体系的概念翻译到另一个体系。在数学上,映射是一个函数,但它的目标不是单个编码,而是一个编码的集合,因为粒度差异让一对多成为常态。
实际构建映射表时,常用方法有:人工编制、基于模型名相似匹配、基于已有映射表传播。评价指标通常看覆盖率(能映射多少源概念)和准确率(映射结果是否正确)。AI从业者要注意:映射表的建设是“高成本、高价值”的基础工程,做临床NLP项目时,很多坑都来自映射粒度对不上。
- 源概念集合$C_{\mathrm{SCT}}$ 代表SNOMED CT的概念集合,是映射的出发地。
- 目标幂集$2^{C_{\mathrm{ICD}}}$ 表示ICD-10编码所有子集的集合,允许映射到多个编码。
- 具体查表$f(44054006)$ 表示在映射词典中查“2型糖尿病”这个SNOMED概念。
- 映射结果查表得到的是一组ICD-10编码,而不只是一个编码。
八、医疗AI落地:让机器当“自动接线员”
把前面所有知识串起来,就是医疗AI中一个非常核心的流水线:实体识别与术语归一。所谓实体识别,就是让模型在一段病历文本里找出“老王确诊2型糖尿病,查血糖,处方:格华止”中的医学实体;所谓术语归一,就是把找出来的实体映射到标准编码上。前者像城市接线员听到一句话,后者像接线员在话务簿里查到准确的分机号。
处理完一份病历,AI得到的不是一堆字符串,而是一组带标准编码的实体。它可以用SNOMED CT做知识推理,用ICD-10做医保分组,用LOINC关联检验值,用RxNorm触发药物相互作用告警。更进一步,这些实体可以组成医学知识图谱:老王这个节点、2型糖尿病这个疾病节点、二甲双胍这个药品节点,通过“患有”“接受治疗”等关系连成一张网。城市里每个人的健康画像,就是这样一层层织出来的。
回到城市比喻:SNOMED CT、ICD-10、LOINC、RxNorm就是四本官方话务簿,AI接线员读一句病历,翻四本册子,给每个词找到该去的分机。做医疗AI的同学若能亲手走一遍“文本→实体→四体系编码”的流程,就真正理解了临床数据的基础设施是怎么运转的。
- 解析器$\phi(W)$ 表示整个实体识别与归一模型,输入是病历文本。
- 文本序列$W$ 是由一个个词或字符组成的原始病历文本。
- 实体标注$\langle s_i,e_i,c_i\rangle$ 表示第 $i$ 个实体的文本片段、实体类型和标准编码。
- 置信度$\mathrm{conf}_i$ 是模型对这个映射结果的置信程度,用于人工复核排序。
AI 应用场景
场景一:电子病历数据标准化流水线
阶段:数据清洗与特征工程
解决的问题:医院每天产生几十万条门诊记录,各科室写法五花八门。传统做法靠人工逐条归类,耗时且出错。AI用规则加模型做实体识别,再按四套体系映射到标准编码,把自由文本变成结构化字段。
具体案例:某三甲医院建设临床数据中心,调用NLP模型读取门诊病历,将“2型糖尿病”自动标注为SNOMED CT概念44054006和ICD-10编码E11.9,将“血糖”标注为LOINC 2345-7,将“格华止”标注为RxNorm 6809。下游科研统计直接按编码查询,不再依赖字符串匹配。
场景二:医学知识图谱构建
阶段:模型训练与知识表示
解决的问题:知识图谱需要标准化节点,否则“二甲双胍”和“格华止”会被建成两个孤立节点,无法推理。借助RxNorm层级模型,AI能把品牌名归一到底层成分,再通过SNOMED CT的关系网络连接疾病、症状、药物。
具体案例:用药安全系统中,知识图谱发现患者同时服用两种不同品牌但成分相同的降糖药,触发“重复用药”告警。这个能力的基础,正是RxNorm把两个商品名指向同一个成分概念。
场景三:区域检验结果互认平台
阶段:数据集成与互操作
解决的问题:患者在不同医院查血糖,报告的单位和名称不同,人工比对容易出错。LOINC为检验项目提供统一编码,AI在平台层将各医院检验字典映射到LOINC,实现结果自动对齐。
具体案例:市级医疗平台接入五家医院的检验系统,将百余种常见检验项目映射到LOINC标准码。医生调阅外院报告时,系统自动把“GLU”“Glucose”“血糖”统一显示为同一个LOINC 2345-7条目,并附上参考区间。
Python 演示
# 四大临床术语体系规则映射演示# 演示如何把一条中文临床文本解析为标准编码class ClinicalEntityMapper: def __init__(self): self.snomed = {"2型糖尿病": "44054006", "高血压": "38341003"} self.icd10 = {"2型糖尿病": "E11.9", "高血压": "I10"} self.loinc = {"血糖": "2345-7", "糖化血红蛋白": "4548-4"} self.rxnorm = {"二甲双胍": "6809", "格华止": "6809"} def map_entity(self, entity): result = {"text": entity} if entity in self.snomed: result["SNOMED CT"] = self.snomed[entity] if entity in self.icd10: result["ICD-10"] = self.icd10[entity] if entity in self.loinc: result["LOINC"] = self.loinc[entity] if entity in self.rxnorm: result["RxNorm"] = self.rxnorm[entity] return result def process(self, text): entities = ["2型糖尿病", "高血压", "血糖", "糖化血红蛋白", "二甲双胍", "格华止"] finds = [e for e in entities if e in text] return [self.map_entity(e) for e in finds] if __name__ == "__main__": mapper = ClinicalEntityMapper() record = "患者确诊2型糖尿病,查血糖,处方:格华止。" for item in mapper.process(record): print(item)
class ClinicalEntityMapper定义一个映射器,模拟四套术语体系的查找表。self.snomed = {...}SNOMED CT概念词典,键是中文实体,值是标准概念ID。self.rxnorm = {"二甲双胍": "6809", "格华止": "6809"}关键设计:品牌名和通用名映射到同一个RxNorm编码,这就是药品归一化的核心。def process(self, text)对文本做最简单的子串匹配,找出命中的医学实体。finds = [e for e in entities if e in text]列表推导式,等价于“在文本里逐词查词典”。record = "患者确诊2型糖尿病,查血糖,处方:格华止。"一条高度浓缩的模拟病历,含诊断、检验、用药三类信息。for item in mapper.process(record): print(item)输出每个实体在哪些体系里有编码,观察“一个实体映射到多个体系”。
常见误区
误区这两个体系都是给疾病编码的,选一个用就行,反正都是“疾病码”。
正解SNOMED CT像城市档案员的个人传记,记录“患者有什么症状、病变在什么部位、病情如何演变”;ICD-10像市政统计局的汇总账本,只把病归到标准统计类别。一个求细、一个求统,它们服务于不同场景,不能互相替代。
为何常见:两者都常见于“诊断”相关字段,名字里都有编码含义,初学者容易把它们当成同类工具。
误区LOINC就是“血常规、尿常规、生化全项”这些实验室项目的编号。
正解LOINC覆盖所有临床观测指标,包括生命体征、问卷调查、影像学观察、医嘱项目等。凡是“对患者做一次可观察的测量或评估”,都可以用LOINC编码。
为何常见:LOINC以检验科和实验室项目普及,教材和文章举例大多围绕“血糖、血脂、肌酐”,让人形成刻板印象。
误区RxNorm就是一本小册子,告诉我“格华止=二甲双胍”。
正解RxNorm内部有结构化层级:成分(IN)、药品产品(SCD)、品牌药品(SBD)等概念类型,还包含剂量规格和给药途径。它不仅是翻译器,而是一张药品语义网。
为何常见:日常看到的例子几乎都是“品牌名→通用名”的一对一映射,掩盖了RxNorm更深的分层模型。
误区只要拿到一个SNOMED CT概念ID,就能自动查到唯一正确的ICD-10码,像查字典一样简单。
正解两个体系的设计目标不同,粒度不同。多个SNOMED CT临床概念可能归并到一个ICD-10统计类目,一个SNOMED概念也可能因为并发症不同映射到多个ICD-10码,所以映射结果应该视为“候选集”。
为何常见:“映射”这个词让人想到词典里词条的一一对应,而实际上医学编码存在天然的粗细差异。
误区标准化的目标是把病历全部结构化,之后原始文本可以删掉,只留编码。
正解编码是结构化索引,不是原文替代品。原始文本保留着上下文、时间线、医生推理等信息,AI模型训练、算法审计、临床纠纷取证都依赖原文。四套体系的价值是帮助机器“找到”和“关联”,而不是抹掉原始记录。
为何常见:将“标准化”误解为“转换成编码”,忽略了原始文本在数据生命周期中的长期价值。
面试题
Q1. 在四大临床术语体系中,SNOMED CT 主要负责什么?
- A.描述症状和体征的临床概念← 正确答案
- B.基于字母数字的疾病统计分类
- C.检验项目唯一标识体系
- D.药品名称与规格标准
答案:A。SNOMED CT 是城市档案员,负责细致描述临床概念及其关系;ICD-10 做统计分类,LOINC 管检验项目,RxNorm 管药品标准,所以选 A。
Q2. ICD-10 的主要用途是什么?
- A.记录患者的手术过程细节
- B.统计疾病与死亡原因并支持医保← 正确答案
- C.标记化验单上的每个项目
- D.统一药品商品名与剂量规格
答案:B。ICD-10 是市政统计账本,用于疾病与死亡统计、医保支付和 DRG 分组;手术细节归 SNOMED CT,化验项目归 LOINC,药品规格归 RxNorm。
Q3. 下列哪个体系为检验和观测指标设计统一编码?
- A.SNOMED CT 概念编码
- B.ICD-10 疾病编码
- C.LOINC 观测指标编码← 正确答案
- D.RxNorm 药物编码
答案:C。LOINC 用六要素定义检验和临床观测项目,相当于超市的商品条码;SNOMED CT 描述临床概念,ICD-10 做疾病分类,RxNorm 管药品。
Q4. RxNorm 核心解决的问题是什么?
- A.药品命名不一致问题← 正确答案
- B.疾病编码精度问题
- C.检验指标单位换算
- D.病历文本自动生成
答案:A。RxNorm 把“格华止”“二甲双胍片”等不同叫法统一到标准药品概念层级,解决药品命名歧义;它不负责疾病、检验和文本生成。
Q5. ICD-10 编码 E11.9 中的“9”表示什么?
- A.章节编码
- B.类目编码
- C.亚目编码← 正确答案
- D.版本序号
答案:C。在 E11.9 中,E 是章节、11 是类目、.9 是亚目,表示“2型糖尿病不伴并发症”,所以选 C。
Q6. 以下哪些属于 LOINC 六要素?
- A.成分与受检属性← 正确答案
- B.时间与测量系统← 正确答案
- C.标尺与检验方法← 正确答案
- D.价格与库存数量
答案:ABC。LOINC 六要素是成分、受检属性、时间、系统、标尺、方法。价格和库存是商品管理属性,与观测指标语义无关,所以不选 D。
Q7. 从 SNOMED CT 向 ICD-10 做语义映射时,最常见的粒度现象是?
- A.一对一完全等价
- B.多对一的分类归并← 正确答案
- C.一对多的随机拆分
- D.完全无规律可循
答案:B。SNOMED CT 概念细,ICD-10 类目粗,多个临床细分概念往往归并到一个统计类目,因此“多对一的分类归并”最常见,AB 选项过于理想化。
Q8. 跨体系映射的主要难点有哪些?
- A.概念粒度不一定对齐← 正确答案
- B.映射结果常是一对多← 正确答案
- C.不同体系视角差异大← 正确答案
- D.所有映射自动且完美
答案:ABC。映射难点来自源体系与目标体系的设计视角不同、概念粒度不同,导致结果常常是多对多关系,需要人工校验;D 忽略实际工程中的不确定性,不选。
Q9. 医疗AI把病历文本“血糖”映射到 LOINC 2345-7,属于哪类任务?
- A.实体识别与术语归一← 正确答案
- B.医学影像目标检测
- C.药物相互作用计算
- D.电子病历自动脱敏
答案:A。先识别“血糖”是医学实体,再把它归一为标准 LOINC 编码,这正是实体识别与术语归一的典型流程,而不是影像、药物计算或脱敏任务。
Q10. “2型糖尿病”这个诊断可以被哪些体系编码描述?
- A.SNOMED 码 44054006← 正确答案
- B.ICD-10 码 E11.9← 正确答案
- C.LOINC 码 2345-7
- D.RxNorm 码 6809
答案:AB。2型糖尿病是疾病诊断,SNOMED CT 和 ICD-10 都描述疾病,所以 A、B 正确;LOINC 编码的是检验指标,RxNorm 编码的是药品,因此 C、D 不适用于诊断本身。