清晨的医院档案室里,老张捧着一叠医生手写的病历,眉头紧锁。这些纸上的内容,外人看来就像天书:字迹潦草、缩写成堆——“Pt c/o HA, denies NV, no SOB“。老张的工作,就是把这些杂乱无章的”天书“,整理成电脑里清晰规范的结构化数据,让医生和研究人员能快速检索、统计、分析。这个过程,正是医学文本预处理的核心:先切词,再翻译缩写,最后辨别”有“与”没有”。今天,我们就跟着老张,走进这间档案室,看看他是如何一步步完成这项精细活儿。对于 AI 从业者而言,掌握这套预处理流程,是构建任何临床 NLP 系统不可或缺的基石——它决定了模型能否真正理解病历中的医学语义。

岗位关联

医学文本预处理是临床 NLP 的第一道工序,掌握分词、缩写展开与否定检测三大核心技巧,是让 AI 读懂电子病历、辅助诊疗决策的必备基本功,直接决定下游医疗 AI 应用的效果上限。

目录
  1. 可视化演示
  2. 临床文本挑战
  3. 分词核心技术
  4. 缩写展开策略
  5. 否定检测原理
  6. 预处理流水线
  7. 评测与应用
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

演示临床文本分词策略、缩写词典展开与否定范围检测三种NLP预处理流程,交互切换查看医学文本处理核心环节。

本节配有交互动效(进入视口后自动加载,约 3KB)。

医学文本分词策略 医学实体保留合并剂型剂量为单token 标点与数字分离保留临床语义边界 tokens = split(text, medical_rules) 医学分词需保留药名剂量等临床语义单元完整性

临床文本挑战

老张从档案柜里取出一份泛黄的病历,上面写着:“Pt c/o HA, denies NV, no SOB.“。这行字在普通人眼里是火星文,在老张眼里是家常便饭。临床文本就像一封封”加密电报”:写的人图省事,读的人靠默契,但机器看到就傻眼了。要教会 AI 读懂病历,第一步就是认清这些文本的特殊性。

医学文本与普通文本最大的不同,在于它的“非标准化”特性。普通新闻稿讲究语法规范,病历却讲究速度与简洁——医生在门诊中平均只有几分钟书写时间,于是大量使用缩写、省略主语、甚至省略谓语。这种“电报体”让通用 NLP 工具直接失效:英文分词器把 “c/o“ 拆成 ”c“ 和 ”o“,把 ”HA” 当成感叹词,语义完全错乱。

除了语言习惯,医学文本的领域特性也带来额外挑战。缩写往往有多重含义——“HA“ 可能是 ”headache“(头痛),也可能是 ”health assessment“(健康评估);”PT“ 可以是 ”patient“(患者),也可以是 ”prothrombin time“(凝血酶原时间)。更棘手的是否定表达:”denies NV“ 表示”否认恶心呕吐”,“no SOB“ 表示”无气短”——这些否定词直接翻转了后面症状的存在状态,如果机器没识别出来,整个诊断方向就偏了。

面对这些挑战,老张心里有数:这不是文字游戏,而是关乎患者安全的严谨工作。就像档案员必须先了解病历的“行话”才能整理归档,AI 也必须先经过医学文本预处理的洗礼,才能真正理解临床语义。这份“天书”翻译工作,正是整条临床 NLP 流水线中最基础、也最关键的一环。

分词核心技术

老张整理病历的第一步,是把连成一串的字符切成有意义的词语。英文文本虽然天然有空格分隔,但医学文本中大量复合词、带连字符的词组、以及 “c/o“ 这类缩写,让简单的空格切分彻底失灵。分词,就是给文本画上”词边界”的工序,如同档案员用红笔在长句中圈出每个独立的检索词。

最经典的分词方法是基于词典的最大匹配法。想象老张手里有一本厚厚的医学词典,从头到尾翻阅文本,每当遇到一个前缀能在词典中匹配到词条,就优先匹配最长的那个。例如 “headache“ 优先切为整体,而不是误切成 ”head“ 和 ”ache“。这种方法的优点是简单快速、可解释性强,但缺点也很明显——遇到词典之外的”未登录词”就抓瞎了。

为了应对未登录词,统计序列标注方法登场了。这种方法把分词看作一个序列标注任务:每个字符被标注为词首(B)、词中(I)或词尾(E),用条件随机场或双向 LSTM 等模型学习上下文模式。就像老张凭经验判断“没见过这个词,但从构词法看像是药物名”,统计模型能从大量语料中学到这种“语感”。实际系统中,词典方法与统计方法常常结合使用:先用词典处理高频词,再用统计模型兜底未登录词,从而兼顾速度与泛化能力。

分词之于医学文本处理,如同骨架之于人体——只有骨架搭对了,后面的肌肉和神经才能各就各位。老张对此深有体会:分词切错了,“headache“ 变成 ”head“ 和 ”ache”,后面的缩写展开和否定检测全都跟着跑偏。因此,好的分词器是预处理质效的基石。

P(标签序列∣字符序列)=exp⁡(得分)∑所有标签序列exp⁡(得分)P(\text{标签序列}| \text{字符序列}) = \frac{\exp(\text{得分})}{\sum_{\text{所有标签序列}}\exp(\text{得分})}
条件随机场为每个字符的打分结果做全局归一化,得分最高的标签序列即是最终分词结果。
  1. 得分函数模型为每个可能的字符标签组合计算一个得分,得分越高说明该切分越合理。
    得分=∑i(发射得分i+转移得分i−1,i)\text{得分} = \sum_i \left( \text{发射得分}_i + \text{转移得分}_{i-1,i} \right)
  2. 归一化对所有可能标签序列的得分求指数和,作为分母,将得分转换为概率。
    Z=∑所有标签序列exp⁡(得分)Z = \sum_{\text{所有标签序列}} \exp(\text{得分})
  3. 概率取值用指数得分的比值表示该标签序列的出现概率,概率最大者胜出。
    P=exp⁡(得分)ZP = \frac{\exp(\text{得分})}{Z}

缩写展开策略

分完词后,老张面前摆着的是 "Pt" "c/o" “HA“ 这一串缩写。对医生来说这些是职业黑话,对机器来说却是拦路虎。缩写展开,就是拿着”微信翻译官“逐条把黑话翻成大白话。老张抽屉里有一本厚厚的”缩写对照手册”——这就是医学缩写字典。

构建医学缩写字典是一个需要精心打磨的过程。一方面要从权威医学词典、公开资源(如 UMLS)中收集标准的缩写-全称映射;另一方面要从真实的电子病历语料中挖掘高频缩写。比如 "Pt → Patient"、"c/o → complains of"、“SOB → shortness of breath“。字典覆盖度决定了展开的上限,而真正考验功力的是”一词多义”的消歧问题。

“HA“ 究竟是 ”headache“ 还是 ”health assessment“?老张不会死板地查字典,而是会看看上下文:如果后面跟着 ”denies“ 或 ”c/o“,那八成是症状 ”headache“;如果出现在 ”annual HA visit“ 这样的短语里,则更可能是 ”health assessment“。这种上下文感知的消歧策略,本质上是让模型学习”什么语境配什么义项”。特征可以包括左右邻居词、词性标签、以及语义类别(症状/检验/药物)。

缩写展开就像给病历做“同声传译”,既要翻得准,又要听得懂上下文。老张合上字典,感慨道:没有语境的翻译是危险的,一个缩写的误译,可能让医生的诊断南辕北辙。上下文感知消歧,正是医学缩写展开的灵魂所在。

义项(word)=arg⁡max⁡s∈S  P(s∣word,context)\text{义项}(\text{word}) = \arg\max_{s \in S} \; P(s | \text{word}, \text{context})
对每个候选义项,模型根据上下文特征计算其条件概率,概率最高的义项即作为最终展开结果。
  1. 候选义项集合从缩写字典中取出该缩写的所有可能全称,形成候选集合。
    S={s1,s2,…,sk}S = \{s_1, s_2, \dots, s_k\}
  2. 上下文概率模型基于上下文窗口中的词与词性,评估每个义项的适配程度。
    P(si∣context)=exp⁡(scorei)∑j=1kexp⁡(scorej)P(s_i | \text{context}) = \frac{\exp(\text{score}_i)}{\sum_{j=1}^{k}\exp(\text{score}_j)}
  3. 最大后验选择在所有候选义项中选择条件概率最高者,作为最终展开结果。
    s^=arg⁡max⁡siP(si∣context)\hat{s} = \arg\max_{s_i} P(s_i | \text{context})

否定检测原理

老张终于处理到最关键的一步——辨别“有”与“没有”。病历中写着 “denies NV“,意思是”否认恶心呕吐“,换句话说”没有恶心呕吐“。如果机器把 ”denies“ 忽略了,直接提取出”恶心呕吐“,那患者就被冤枉地记上一个根本不存在的症状。否定检测,就是给文本装上一副”透视镜“,看穿这些否定词的”翻转”魔法。

否定检测的第一要素是触发词识别。医学文本中有一批高频否定触发词:denies(否认)、no(无)、without(没有)、neg for(阴性)、denied(已否认)等。老张像警察识别嫌疑人一样,先圈出这些触发词,再确定它们的影响力范围。

确定了触发词之后,下一步是界定作用范围窗口。通常以触发词为中心,向前或向后延伸若干词的距离,落在这个窗口内的医学概念都被视为被否定。例如 “Patient denies nausea and vomiting“ 中,”denies“ 的作用范围覆盖了后面的 ”nausea“ 和 ”vomiting”。窗口大小的设定要权衡:太小会漏掉被否定的目标,太大则会把远处的肯定描述误伤。

更精妙的是语境消歧规则。否定触发词并不总是否定——“no“ 在 ”no significant findings“ 中虽是否定,但在 ”No. 5“ 这类编号中不是;”without“ 在 ”without any complications“ 里否定,但在 ”with or without“ 中又具有两可性。规则引擎通过判断触发词在句子中的语法角色来消歧。最后的输出是一个结构化结果,每个被否定的概念都被打上”否定 = True”的标签,供下游疾病诊断或药物副作用的语义分析使用。

否定检测是临床文本语义理解的“分水岭”,被否定掉的症状如果被当作真实存在,轻则统计失真,重则危及患者安全。老张深知这一环节的分量,因此他总会在否定标记完成后,回头再看一眼窗口边界是否有遗漏或误伤,确保每一次判“无”都经得起推敲。

Negation(ci)=I(∃ tj∈T,  dist(tj,ci)<θ)\text{Negation}(c_i) = \mathbb{I}\left( \exists\, t_j \in T,\; \text{dist}(t_j, c_i) < \theta \right)
若某个否定触发词与医学概念在同一个窗口内共现,则该概念被判定为否定。
  1. 否定触发词集合预先定义医学否定触发词表,如 denies、no、without 等。
    T={t1,t2,…,tm}T = \{t_1, t_2, \dots, t_m\}
  2. 距离计算计算触发词与目标医学概念在词序列上的间隔距离。
    dist(tj,ci)=∣pos(tj)−pos(ci)∣\text{dist}(t_j, c_i) = |\text{pos}(t_j) - \text{pos}(c_i)|
  3. 阈值判定距离小于窗口阈值的概念被判为否定,否则保留肯定状态。
    I(dist<θ)=1⇒Negation(ci)=True\mathbb{I}(\text{dist} < \theta) = 1 \Rightarrow \text{Negation}(c_i) = True

预处理流水线

老张的工作从不是一蹴而就的,而是沿着一条流水线逐步推进。这条流水线就是医学文本预处理的标准流程,把分词、缩写展开、否定检测有机串联起来,形成端到端的处理管线。

流水线的第一站是文本清洗去噪。原始病历中夹杂着标点符号、日期、数字、甚至是录入错误。老张会先剔除无意义的噪声字符,统一大小写,修正明显的拼写错误。例如把 “Pt.“ 统一成 ”Pt“,把 ”H/A“ 规范成 ”HA“。这步做好了,后续的分词与标注才能”轻装上阵”。

第二站是分词与标准化,也就是前面讲过的分词技术。第三站是缩写展开与否定检测的联合处理。值得注意的是,这两个步骤并非互不相干——先做缩写展开再检测否定往往更准确,因为展开后的全称语义更丰富,否定触发词的判断也更可靠。比如 “Pt denies NV“ 展开为 ”Patient denies nausea/vomiting“ 后,”denies” 的否定范围更容易界定。

流水线末端还有一个常被忽视的环节——质量检查反馈。老张会在处理后随机抽样一部分病历,人工校验分词、展开、否定的正确率,把错误案例回传给字典和规则引擎进行迭代更新。这条“反馈闭环”让预处理系统越用越聪明,如同档案室的整理规范随着新问题不断修订。预处理流水线就像一个精密的工厂流水线,每个工位各司其职,任何一环的失误都会传导到最终产品。

Output=NegCheck(AbbrExpand(Tokenize(Clean(T))))\text{Output} = \text{NegCheck}\left( \text{AbbrExpand}\left( \text{Tokenize}\left( \text{Clean}(T) \right) \right) \right)
预处理流水线按“清洗 → 分词 → 缩写展开 → 否定检测”的顺序逐级加工,前一步的输出是后一步的输入。
  1. 清洗函数对原始文本去噪、统一格式,得到规范的输入文本。
    T′=Clean(T)T' = \text{Clean}(T)
  2. 分词函数将清洗后的文本切分为词语序列。
    W=Tokenize(T′)W = \text{Tokenize}(T')
  3. 缩写展开函数对每个词执行缩写映射,得到展开后的词序列。
    E=AbbrExpand(W)E = \text{AbbrExpand}(W)
  4. 否定检测函数在展开后的词序列上执行否定标记,输出结构化结果。
    O=NegCheck(E)O = \text{NegCheck}(E)

评测与应用

老张的档案室工作进入尾声,但他每天都要回答一个问题:这一天的整理质量到底如何?对于医学文本预处理,同样需要科学的评测指标来度量效果。最常用的指标是准确率(Precision)和召回率(Recall)。分词任务中,准确率衡量切出的词语中正确比例;召回率衡量所有正确词语中被找出的比例。缩写展开和否定检测同理。

评测的关键基础是标注数据构建。老张需要请医学专家对一批病历进行人工标注:哪些词边界是对的、哪个缩写义项是正确的、哪些症状是被否定的。这份“金标准”数据集是评测的“判决书”,也是训练模型的学习素材。

在实际应用中,这三大预处理技术正在真实世界里发挥价值。在电子病历(EHR)结构化项目中,医院将海量自由文本病历转化为结构化字段,为后续的检索、统计和决策提供数据基础。在临床决策支持系统中,预处理模块为 AI 提供“干净”的输入——系统先识别出 “Patient denies chest pain“ 中的否定关系,才能避免把 ”chest pain” 误判为当前症状,从而给出正确的诊疗建议。

老张一天的忙碌终于有了成果:一叠整理得井井有条的结构化病历,清清楚楚地记录着患者信息、症状和阴性发现。评测指标就像档案室的抽检员,时刻监督着整理质量。医学文本预处理虽然只是“整备工作”,但它的质量直接决定了临床 NLP 系统的天花板——数据喂给模型之前就已经错了,再精妙的模型也无力回天。

F1=2×Precision×RecallPrecision+RecallF_1 = \frac{2 \times \text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}
F1 分数是准确率与召回率的调和平均,在两者之间取得平衡,是评测预处理器整体性能的常用综合指标。
  1. 真阳例实际为否定、模型也判定为否定的样本。
    TP=True Negations 被正确识别TP = \text{True Negations 被正确识别}
  2. 假阳例实际为肯定、模型却判定为否定的样本。
    FP=肯定被误判为否定FP = \text{肯定被误判为否定}
  3. 假阴例实际为否定、模型却判定为肯定的样本。
    FN=否定被漏检FN = \text{否定被漏检}

AI 应用场景

场景一:电子病历结构化入库

阶段:数据预处理与清洗

解决的问题:传统医院信息系统中,大部分病历以自由文本形式存储,医生写的 "Pt c/o HA, denies NV" 这类句式无法直接被数据库检索和统计。人工录入结构化数据耗时耗力且容易出错,AI 预处理流水线可以在毫秒级将自由文本转化为规范的结构化字段,包括主诉症状(头痛)、否定症状(无恶心呕吐)等。

具体案例:某三甲医院信息科部署了基于本文章方法的预处理系统。每天上万份门诊病历经过“清洗 → 分词 → 缩写展开 → 否定检测”流水线处理后,自动写入 EHR 数据库。过去需要 5 名录入员工作 8 小时的工作量,现在系统 30 分钟完成,且否定检测准确率达 94%,极大提升了临床数据的可用性。

场景二:药物不良反应监测

阶段:实体关系抽取与语义分析

解决的问题:药品上市后监测需要从病历文本中识别患者是否出现不良反应。但病历中常出现 “Patient denies rash after taking drug X“ 这样的否定表述——若是简单匹配 ”rash“ 关键词,就会把”无皮疹“误判为”出现了皮疹”。否定检测模块先行标记否定范围,确保只有真正出现的症状才进入信号检测流程,避免大量假阳性警报。

具体案例:某药企的警戒系统接入预处理流水线后,药物不良反应的信号误报率降低了 37%。系统能够准确区分“denies rash“(否定)和 ”developed rash”(肯定),显著提升了真实不良反应信号的发现效率,该方案已应用于多个上市后药物的安全性监测项目中。

Python 演示

python69 行
import re # 医学缩写字典ABBR_DICT = {    "pt": "patient",    "c/o": "complains of",    "ha": "headache",    "nv": "nausea/vomiting",    "sob": "shortness of breath",    "htn": "hypertension",    "dm": "diabetes mellitus",} # 否定触发词表NEG_TRIGGERS = {"denies", "no", "without", "neg for", "denied", "absent"} def clean_text(text):    text = text.lower().strip()    text = re.sub(r"[^a-z0-9\s/.-]", "", text)    text = re.sub(r"\s+", " ", text)    return text def tokenize(text):    return text.split() def expand_abbr(tokens):    expanded = []    i = 0    while i < len(tokens):        token = tokens[i]        if token in ABBR_DICT:            expanded.append(ABBR_DICT[token])        else:            expanded.append(token)        i += 1    return expanded def detect_negation(expanded_tokens, window=3):    negated = []    neg_trigger_pos = None    for i, token in enumerate(expanded_tokens):        if token in NEG_TRIGGERS:            neg_trigger_pos = i            start = max(0, i + 1)            end = min(len(expanded_tokens), i + 1 + window)            for j in range(start, end):                negated.append(expanded_tokens[j])    return negated def preprocess_pipeline(text):    text = clean_text(text)    tokens = tokenize(text)    expanded = expand_abbr(tokens)    negated = detect_negation(expanded)    return {        "original": text,        "tokens": tokens,        "expanded": expanded,        "negated_terms": negated,    } if __name__ == "__main__":    sample = "Pt c/o HA, denies NV and no SOB"    result = preprocess_pipeline(sample)    print("分词结果:", result["tokens"])    print("缩写展开:", result["expanded"])    print("否定检测:", result["negated_terms"])    assert result["tokens"][0] == "pt"    assert "nausea/vomiting" in result["negated_terms"]
目的:演示一个简化的医学文本预处理流水线,包含分词、缩写字典展开与基于触发词的否定检测。
  1. ABBR_DICT = {...}医学缩写与全称的映射字典,是展开的“翻译手册”
  2. NEG_TRIGGERS = {...}否定触发词集合,用来识别否定句式的关键词
  3. def clean_text(text)将输入统一为小写、去除非字母数字噪声,净化原文
  4. def tokenize(text)按空格切分词语,完成基础分词
  5. def expand_abbr(tokens)遍历词序列查字典,替换缩写为全称
  6. def detect_negation(expanded_tokens, window=3)在展开后的词上寻找否定触发词,标记窗口内的否定概念
  7. def preprocess_pipeline(text)串联清洗、分词、展开、否定检测四个步骤的入口函数

常见误区

误区英文病历本来就是空格分隔的,直接用 `text.split(" ")` 不就完了?为什么还要专门设计分词算法?

正解医学文本中存在大量带连字符的复合词、缩写和特殊符号。例如 “c/o“ 如果按空格切分会被拆成 ”c“ 和 ”o”,“H/A“ 会被拆成 ”H“ 和 ”A“。分词的本质是确定”语义完整的最小单位”,这需要词典与模型协同判断,而非简单的字符切分。

为何常见:因为英文普通文本含空格天然分隔,初学者容易把“分词”误以为是英文文本不需要的操作。

误区缩写字典把 “HA“ 映射为 ”headache” 就完事了,反正字典是权威的。

正解医学缩写一词多义非常普遍,“HA“ 既可以是 ”headache“,也可以是 ”health assessment“,甚至可能是 ”hemolytic anemia”(溶血性贫血)。忽略上下文消歧会导致大量语义错误。正确的做法是结合上下文特征选择最可能的义项,必要时引入条件概率模型。

为何常见:因为人工读病历时会自动结合上下文理解,这种“自动消歧”能力让人误以为字典一对一即可。

误区只要文本中出现了 “no“ 或 ”denies”,就把后面所有词都标记为否定。

正解“no“ 并不总是否定符,例如 ”No.5“ 是编号,”no significant findings“ 虽有否定含义但否定的是”显著发现”而非所有内容。否定检测需要精确界定作用范围窗口,并判断否定触发词与目标概念是否在窗口内共现,否则会把无关概念误标为否定。

为何常见:因为日常语言中否定词与否定语义高度相关,让人低估了上下文和窗口边界的重要性。

误区分词、缩写展开、否定检测是三个独立的步骤,顺序无所谓,先做哪个都行。

正解顺序很重要。如果先做否定检测再做缩写展开,“denies NV“ 中的 ”NV“ 未被展开时语义模糊,否定范围难以界定;而先把 ”NV“ 展开为 ”nausea/vomiting” 后,否定触发词与目标概念的关系更清晰。推荐的流水线顺序是:清洗 → 分词 → 缩写展开 → 否定检测。

为何常见:因为初学者从模块角度理解三者,忽略了上游步骤的输出质量会直接影响下游步骤的输入效果。

误区预处理任务直接用深度学习模型肯定比规则和字典方法强,干脆全部用 BERT 解决。

正解医学文本预处理中,字典和规则方法具有不可替代的优势:可解释性强、无需大量标注数据、推理速度快。缩写字典的覆盖度和否定规则的精准度往往决定了效果下限。实际工程中常见的是“字典/规则 + 统计模型”的混合方案,在保持可解释性的同时利用模型扩展泛化能力。

为何常见:因为深度学习在众多 NLP 任务中表现惊艳,容易让人忽略预处理任务的特殊性和对可解释性的需求。

面试题

Q1. 医学文本预处理中,“Pt c/o HA“ 的 ”c/o“ 展开为 ”complains of”,这个过程属于哪一步?

单选题 · easy

  • A.分词
  • B.缩写展开← 正确答案
  • C.否定检测
  • D.文本清洗

答案:B。把缩写 “c/o“ 映射为全称 ”complains of” 是典型的缩写展开步骤,利用缩写字典将简写形式还原为完整医学表述,对应老张查字典翻译病历黑话的过程。

Q2. 以下哪项是医学文本中常见的否定触发词?

单选题 · easy

  • A.headache
  • B.patient
  • C.denies← 正确答案
  • D.complains of

答案:C。"denies"(否认)是高频医学否定触发词,表示后面的症状被否定。其他选项均为症状或患者相关名词,不构成否定语义。

Q3. 在否定检测中,“作用范围窗口”指的是什么?

单选题 · mid

  • A.整篇病历的全部内容
  • B.触发词前后若干词内的语义范围← 正确答案
  • C.仅否定触发词本身
  • D.标点符号之间的全部文字

答案:B。作用范围窗口是以否定触发词为中心、向前或向后延伸有限词距离的语义区域,窗口内的医学概念才被判为被否定。窗口过大过小都会影响检测准确性。

Q4. 以下哪些策略可用于处理医学缩写的一词多义消歧?

多选题 · mid

  • A.构建候选义项集合← 正确答案
  • B.结合上下文特征计算条件概率← 正确答案
  • C.直接用第一个字典义项
  • D.引入词性标注信息辅助判断← 正确答案

答案:ABD。正确处理一词多义的思路是构造候选集合、在上下文中计算每个义项的概率,并结合词性等特征。直接默认第一个义项忽视了上下文,必须结合上下文线索才能避免歧义带来的误翻译。

Q5. 为什么预处理流水线中通常先做缩写展开再做否定检测?

单选题 · mid

  • A.缩写展开速度更快
  • B.展开后的全称语义更清晰,便于确定否定范围← 正确答案
  • C.否定检测会修改缩写字典
  • D.分词依赖否定检测结果

答案:B。“NV“ 展开为 ”nausea/vomiting“ 后,”denies” 与其语义关系更明确,否定范围更易界定。若先做否定检测,未展开的缩写语义模糊,影响判定准确性。

Q6. 分词任务中,F1 分数的计算方式是?

单选题 · mid

  • A.准确率与召回率的算术平均
  • B.准确率与召回率的调和平均← 正确答案
  • C.准确率乘以召回率
  • D.准确率减去召回率

答案:B。F1 是准确率与召回率的调和平均,即 2×TP/(2×TP+FP+FN),在二者之间取平衡,避免单一指标评估偏科。算术平均会掩盖其中一个指标过低的问题。

Q7. “no significant findings“ 中 ”no” 的否定范围判定,以下处理最合理的是?

单选题 · hard

  • A.直接否定整句话所有医学概念
  • B.仅否定其后窗口内的 "significant findings"← 正确答案
  • C.忽略 "no",视为肯定
  • D.将 "no" 视为数字编号

答案:B。否定检测需界定“否定的是哪个概念”。在这个短语中,“no“ 的作用范围覆盖了紧跟其后的 ”significant findings”,而不是整句话。窗口机制与语境消歧正是为了精准定位否定目标而设计。

Q8. 以下哪些属于医学文本预处理流水线的环节?

多选题 · hard

  • A.文本清洗去噪← 正确答案
  • B.分词与标准化← 正确答案
  • C.缩写展开与否定检测← 正确答案
  • D.临床诊断决策

答案:ABC。预处理流水线包括清洗、分词、缩写展开、否定检测等环节,它们是数据准备阶段的工作。临床诊断决策属于下游应用,由诊断模型完成,不属于文本预处理范畴。

Q9. 未登录缩写最有效的兜底处理方案是?

单选题 · easy

  • A.直接删除该缩写
  • B.保留原词并标记“未知”,结合上下文推断← 正确答案
  • C.将所有未登录缩写替换为"UNK"
  • D.忽略上下文猜测全称

答案:B。面对词典外缩写,合理做法是保留原词并标记为未知,同时结合上下文推断其语义,而非粗暴删除或替换。这如同老张遇到生僻缩写时先对照上下文猜测,再在反馈环节补充字典。

Q10. 否定检测输出(结构化结果)的典型形式是什么?

单选题 · mid

  • A.整篇病历的否定概率值
  • B.各医学概念附带“否定/肯定”标签← 正确答案
  • C.否定触发词的词频统计
  • D.否定句子的机器翻译结果

答案:B。否定检测的核心产出是给每个医学概念打上“否定”或“肯定”的语义标签,供下游结构化提取和诊断推理使用。触发词识别只是中间步骤,最终目的是实现概念的语义状态判定。