PubMed药物靶点关系自动抽取与建模 - 第3节
PubMed——文献检索的起点
做药物靶点关系抽取,第一步就是找文献。PubMed,说白了就是生物医学领域的Google。我刚开始做这个方向的时候,总觉得PubMed就是「搜个关键词,点开文章,复制粘贴」——后来被坑了几次,才老实下来。
PubMed是什么?它是美国国立医学图书馆(NLM)维护的免费数据库,收录了超过3500万条生物医学文献记录。覆盖范围从1946年到现在,包括了MEDLINE、PubMed Central以及部分在线书籍。对于药物-靶点关系这类研究,PubMed是绝对的权威来源。
PubMed ≠ 全文数据库。它存的是「文献元数据」——标题、摘要、作者、期刊、MeSH词、PMID等。想拿全文,得靠出版商授权或PMC。
PubMed记录里有什么?
一条典型的PubMed记录包含以下关键字段。我一般在抽取药物-靶点关系时,最关注的就是TI、AB、MH这三个字段。
| 字段代码 | 字段名 | 说明 |
|---|---|---|
| TI | Title | 文献标题,通常是最浓缩的信息 |
| AB | Abstract | 摘要,我们的主要文本来源 |
| MH | MeSH Terms | MeSH主题词,标准化标引,非常有价值 |
| AU | Authors | 作者列表 |
| PT | Publication Type | 出版类型,比如Journal Article、Review |
| PMID | PubMed Identifier | 唯一标识符,后续数据关联的Key |
| DP | Date of Publication | 出版日期 |
| AD | Affiliation | 作者机构信息 |
你想想看,如果我们直接用「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,显式用括号最安全。
检索式构建流程
我的个人习惯是这样的:
- 拆解概念:把需求拆成几个独立概念(比如药物、靶点、疾病)
- 映射MeSH:每个概念找到最匹配的MeSH词
- 补充自由词:列出同义词、缩写、拼写变体
- 组合布尔:概念内用OR,概念间用AND
- 加限定:时间、文献类型、语言等
- 验证测试:先用小范围跑一轮,看看结果是否符合预期
为什么要验证?我曾经为检索「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年之后的基本够用。
结果评估
检索完要看什么?我个人看三点:
- 数量:太少说明词表欠覆盖,太多说明检索太宽泛
- 相关度:随机扫5-10篇摘要,看是否是真的目标文献
- 噪声比例:不相关文献占多少,心里要有数
举个例子,如果搜“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图,是我对这个章节核心知识点的总结。整个检索流程可以拆成四个阶段:从理解数据对象开始,到词表映射,到高级检索构建,最后用结果评估闭环。
这个流程反复跑几轮,你的检索策略基本就成熟了。我一般在构建数据集前,至少迭代3-5次检索式,直到结果稳定、噪声可控,才会进入下一步的数据导出。
好了,关于PubMed检索的基础就这些。掌握了这三块——数据库结构、MeSH词表、高级检索——你就拥有了从海量文献中精准抓取药物-靶点相关文献的能力。下一步就是用程序批量获取这些数据了,不过那是后面的内容。