4. 药物文本预处理工程
药物文本来源极其分散:药品说明书、临床试验方案、PubMed 摘要、电子病历、不良反应报告、监管公告、专利与化学数据库记录。它们既有规范化的结构化字段,也有大量自由文本、缩写、商品名、化学命名和错别字。若不做预处理,后续的分子联合建模会把“阿司匹林”“乙酰水杨酸”“Aspirin”“ASA”当成四个无关对象,导致实体对齐失败、关系抽取噪声放大。本节围绕一条可落地的文本清洗流水线展开,重点讲清每一步的输入、处理逻辑与可观察结果。
一、分词:从字符流到可建模的语义单元
中文药物文本没有天然空格,分词是第一道关口。通用分词器(如 jieba、HanLP)在通用语料上表现良好,但药物领域存在大量未登录词:化学名“伊马替尼甲磺酸盐”、靶点“HER2”、剂型“肠溶缓释胶囊”、基因位点“EGFR T790M”。直接分词会把“伊马替尼”切成“伊马/替尼”,把“T790M”切碎。工程上通常采用“领域词典 + 通用分词器”的组合策略:先构建药物词典(通用名、商品名、INN、CAS 号、靶点、基因、剂型、给药途径),再以自定义词典方式注入分词器。
import jieba
jieba.load_userdict("drug_dict.txt") # 每行: 词 词频 词性
text = "患者服用伊马替尼甲磺酸盐后出现EGFR T790M突变"
print(list(jieba.cut(text)))
# ['患者','服用','伊马替尼甲磺酸盐','后','出现','EGFR','T790M','突变']
判断分词质量不能只看“读起来顺不顺”,而要看下游任务指标:实体识别 F1、关系抽取准确率、以及同一药物在不同文档中的归一化命中率。若“伊马替尼甲磺酸盐”被切碎,实体识别召回会明显下降,这是最直接的观察信号。
二、标准化:把同义表达收敛到唯一标识
标准化解决“一名多形”问题,核心是建立“表面形式 → 标准标识”的映射。药物层面通常对齐到 RxNorm、DrugBank ID 或国家药品编码;靶点对齐到 HGNC;疾病对齐到 ICD-10/MeSH。标准化不是简单替换字符串,而要处理大小写、全半角、希腊字母、盐型与母体、剂量单位等差异。
| 表面形式 | 问题类型 | 标准化结果 |
|---|---|---|
| Aspirin / aspirin / ASPIRIN | 大小写 | aspirin |
| 乙酰水杨酸 | 同义名 | aspirin |
| 伊马替尼甲磺酸盐 | 盐型 | imatinib(母体) |
| 5-氟尿嘧啶 | 全角/连字符 | 5-fluorouracil |
| HER-2 / HER2 / erbB2 | 别名 | ERBB2 |
实现上常用“规则归一 + 词典查表 + 模糊匹配”三级策略:先做 Unicode 归一化(NFKC)、大小写折叠、去多余空白;再查同义词词典;未命中时用编辑距离或向量相似度做候选召回,并设置阈值(如相似度 ≥ 0.92)人工复核。阈值过低会误合并不同药物,过高则漏合并,需在验证集上权衡。
三、实体识别与关系抽取:从词到结构化事实
实体识别(NER)负责标出药物、靶点、疾病、不良反应、剂量、给药途径等类型。规则方法依赖词典与正则(如剂量“\d+\s*(mg|g|μg)”),统计方法用 BiLSTM-CRF 或 BERT 微调。药物领域推荐“词典 + 模型”混合:词典保证已知药物高召回,模型捕捉新词与上下文。关系抽取则在实体对之间判断语义关系,如“药物—治疗—疾病”“药物—抑制—靶点”“药物—导致—不良反应”。常用做法是把关系建模为分类任务,输入为两个实体及其上下文句子。
四、清洗流水线与质量校验
把上述步骤串成流水线时,顺序很关键:先做编码与格式清洗,再分词,再实体识别,最后标准化与关系抽取。若先标准化再分词,会把未登录词提前替换,反而破坏上下文。流水线每一步都应输出可审计的中间结果,便于定位错误来源。
质量校验要落到具体指标:分词用人工标注集算 F1;实体识别看每类实体的召回与精确率,尤其关注药物与不良反应;标准化看“表面形式命中标准 ID 的比例”;关系抽取看三元组准确率。若药物实体召回低于 0.85,优先补词典;若标准化误合并多,优先提高相似度阈值或增加盐型规则。
完成上述流水线后,文本侧输出的是带类型、带标准 ID、带关系标签的结构化记录,可与分子指纹、分子图、靶点序列等模态对齐。下一阶段即可在此基础上做多模态特征拼接与联合训练。预处理的质量上限,往往就是整个联合建模系统的效果上限。