PubMed药物靶点关系自动抽取与建模 - 第3节

PubMed——文献检索的起点

做药物靶点关系抽取,第一步就是找文献。PubMed,说白了就是生物医学领域的Google。我刚开始做这个方向的时候,总觉得PubMed就是「搜个关键词,点开文章,复制粘贴」——后来被坑了几次,才老实下来。

PubMed是什么?它是美国国立医学图书馆(NLM)维护的免费数据库,收录了超过3500万条生物医学文献记录。覆盖范围从1946年到现在,包括了MEDLINE、PubMed Central以及部分在线书籍。对于药物-靶点关系这类研究,PubMed是绝对的权威来源。

PubMed ≠ 全文数据库。它存的是「文献元数据」——标题、摘要、作者、期刊、MeSH词、PMID等。想拿全文,得靠出版商授权或PMC。

PubMed记录里有什么?

一条典型的PubMed记录包含以下关键字段。我一般在抽取药物-靶点关系时,最关注的就是TI、AB、MH这三个字段。

字段代码字段名说明
TITitle文献标题,通常是最浓缩的信息
ABAbstract摘要,我们的主要文本来源
MHMeSH TermsMeSH主题词,标准化标引,非常有价值
AUAuthors作者列表
PTPublication Type出版类型,比如Journal Article、Review
PMIDPubMed Identifier唯一标识符,后续数据关联的Key
DPDate of Publication出版日期
ADAffiliation作者机构信息

你想想看,如果我们直接用「drug target」在全文中搜,结果量巨大但噪声也大。而MeSH字段已经由专业标引员帮你把文献「标准化」了——这个信息质量,比普通关键词高一个档次。

个人习惯:先查MeSH字段,再用自由词做补充。这样可以兼顾「精准」和「全」。我在做DILI(药物性肝损伤)数据集时,就是用这个策略把正样本召回率提高了约15%。

MeSH词表——检索的「精确制导」

MeSH(Medical Subject Headings)是NLM维护的受控词表。它不是什么玄学,而是一套树状结构的概念体系。每个概念有唯一ID、层级关系和同义词集合。

举个例子。你想搜「高血压」相关文献。直接用“hypertension”搜会漏掉吗?不会。但你会把「pulmonary hypertension」也一锅端进来,明明你只关心系统性高血压。用MeSH词“Hypertension”[Mesh]就能精准限定。

MeSH的树状结构

示例:心血管系统药物相关MeSH树
D27.505.954.158     — 心血管药物  
  D27.505.954.158.100 — 抗心律失常药  
  D27.505.954.158.200 — 抗高血压药  
    D27.505.954.158.200.050 — 血管紧张素转换酶抑制剂  
    D27.505.954.158.200.100 — 钙通道阻滞剂

每层用句点分隔。可以看到,“抗高血压药”下面还有子类。如果你勾选了Explode选项,系统会自动把子类下的所有文献都包含进来——这就是一个很常见的操作,但很多人不知道。

我曾经在一次文献筛选中吃了亏:只搜了粗粒度的“Antihypertensive Agents”,以为全了。结果遗漏了以“Calcium Channel Blockers”为主要概念的文献。后来加上Explode才补齐。细粒度问题,做关系抽取时一定要留意。

MeSH词与自由词的对比

维度MeSH词自由词(关键词)
标准化程度高,同一概念统一标引低,缩写、变体、拼写差异
查准率高,减少无关文献低,容易引入噪声
查全率较高(配合Explode)高(但需要穷举同义词)
时效性新文献标引有滞后即时可用
适用场景系统综述、高质量数据集构建最新文献发现、补充检索

做药物-靶点关系抽取时,我的策略是:先用MeSH词构建核心语料库,再用自由词扩展边缘案例。说白了就是「精准包围」。

高级检索——把布尔逻辑玩明白

很多人用PubMed,还是直接在搜索框里打字。嗯,这样也行,但效率太低。高级检索就是用布尔运算符(AND, OR, NOT)组合字段检索,把需求精准表达出来。

基本运算符

  • AND:交集,缩小范围。例如“Doxorubicin”[Mesh] AND “Cardiotoxicity”[Mesh]
  • OR:并集,扩大范围。例如“Lung Neoplasms”[Mesh] OR “Lung Cancer”[tiab]
  • NOT:排除,剔除干扰。例如“Influenza”[Mesh] NOT “Swine Influenza”[Mesh]

字段限定符是用方括号写的。常用的有[mh](MeSH词)、[tiab](标题/摘要)、[pt](出版类型)、[dp](日期)。

示例:检索2020年以后发表的关于「阿霉素心脏毒性」的综述文献
("Doxorubicin"[Mesh] OR "doxorubicin"[tiab]) 
AND ("Cardiotoxicity"[Mesh] OR "cardiotoxic*"[tiab]) 
AND ("2020/01/01"[dp] : "3000"[dp]) 
AND (Review[pt])

这里有个小技巧:用“cardiotoxic*”来匹配cardiotoxicity、cardiotoxic等变体。通配符*在PubMed中是支持的,但注意不能放在词首。

构建检索式时,一定先用括号把逻辑关系写清楚。我见过太多人写“A AND B OR C”,结果PubMed的处理顺序和预期完全不一样。记住:AND优先级高于OR,显式用括号最安全。

检索式构建流程

我的个人习惯是这样的:

  1. 拆解概念:把需求拆成几个独立概念(比如药物、靶点、疾病)
  2. 映射MeSH:每个概念找到最匹配的MeSH词
  3. 补充自由词:列出同义词、缩写、拼写变体
  4. 组合布尔:概念内用OR,概念间用AND
  5. 加限定:时间、文献类型、语言等
  6. 验证测试:先用小范围跑一轮,看看结果是否符合预期

为什么要验证?我曾经为检索「EGFR抑制剂对非小细胞肺癌」的结果开心了半天——结果发现一半文献是体外实验,不是临床研究。后来加上“Clinical Trial”[pt]才拉回来。

建议在PubMed首页点击“Advanced”进入高级检索构建器。它提供下拉菜单选择字段、自动补全MeSH词,还能直接预览检索式。我刚开始做文献挖掘的时候,就是靠这个界面一步步熟悉字段的。

核心检索式示例——药物-靶点关系

假设我们要检索「他莫昔芬与乳腺癌相关的文献」,用于关系抽取数据集构建。

第一步:拆解概念。

  • 概念A:他莫昔芬(药物)
  • 概念B:乳腺癌(疾病)

第二步:检索式。

# 最终检索式(方便复制到PubMed)
("Tamoxifen"[Mesh] OR "tamoxifen"[tiab] OR "Nolvadex"[tiab]) 
AND ("Breast Neoplasms"[Mesh] OR "breast cancer"[tiab] OR "breast tumor"[tiab] OR "mammary carcinoma"[tiab]) 
AND (English[lang]) 
AND ("2000/01/01"[dp] : "3000"[dp])

这个检索式包含了MeSH词和自由词的双重覆盖,限定了语言和年份。对于关系抽取来说,通常把时间窗口拉宽一点,2000年之后的基本够用。

结果评估

检索完要看什么?我个人看三点:

  1. 数量:太少说明词表欠覆盖,太多说明检索太宽泛
  2. 相关度:随机扫5-10篇摘要,看是否是真的目标文献
  3. 噪声比例:不相关文献占多少,心里要有数

举个例子,如果搜“Tamoxifen AND Breast Neoplasms”出来一万多篇,但里面有一半是讨论其他药物的——那就说明检索式需要加限定,比如他莫昔芬必须在主要主题词位(MeSH Major Topic)出现。

# 限定主要主题词(使用[majr])
"Tamoxifen"[Majr] AND "Breast Neoplasms"[Majr]

这样检索出来的文献,大概率是核心讨论他莫昔芬和乳腺癌关系的。当然,查全率会降低——这是一个经典的查准vs查全权衡。

注意:PubMed的检索有自动术语映射(Automatic Term Mapping,ATM)。你输入“breast cancer”,系统会自动匹配MeSH词“Breast Neoplasms”以及它的下位词。有时候这是好事,有时候反而引入了你不想要的子主题。如果希望完全控制,可以用短语检索加上双引号,比如“breast cancer”[tiab]。

知识框架:PubMed检索体系

下面这张SVG图,是我对这个章节核心知识点的总结。整个检索流程可以拆成四个阶段:从理解数据对象开始,到词表映射,到高级检索构建,最后用结果评估闭环。

PubMed 检索体系与药物-靶点数据获取流程 ① 认识数据对象 PubMed 数据库 记录字段(TI, AB, MH…) PMID 唯一标识 ② 词表标准化 MeSH 词表树状结构 概念 ID & 层级关系 Explode 扩展检索 ③ 高级检索构建 布尔运算符 AND/OR/NOT 字段限定 [mh] [tiab] [pt] 括号分组 + 通配符 ④ 结果评估 & 迭代 数量 > 相关度 > 噪声比 查准 vs 查全 权衡 产出:结构化的检索式 + 高质量引文集合 可直接用于药物-靶点关系抽取的数据集构建 与后续的 Biopython/Entrez API 批量获取无缝衔接

这个流程反复跑几轮,你的检索策略基本就成熟了。我一般在构建数据集前,至少迭代3-5次检索式,直到结果稳定、噪声可控,才会进入下一步的数据导出。

好了,关于PubMed检索的基础就这些。掌握了这三块——数据库结构、MeSH词表、高级检索——你就拥有了从海量文献中精准抓取药物-靶点相关文献的能力。下一步就是用程序批量获取这些数据了,不过那是后面的内容。