01|为什么我们要做这个实战课?

说实话,我刚入门药物靶点抽取那会儿,最头疼的事就是:翻了一堆论文,代码要么不公开,要么跑不起来。更别说把整套流程串成一条生产线。所以这门课的设计初衷很单纯——把PubMed文献里“化合物”和“靶向蛋白”之间的关系,从检索到训练再到评估,一条龙给你拆明白。

我见过太多人卡在“把论文PDF转成结构化三元组”这一步。你想想看,PubMed上光是摘要就有三千多万篇,人工读是不可能的。但机器读完,能不能吐出类似“阿司匹林→抑制→环氧合酶-1”这种关系?能。这就是我们要干的事。

个人偏见:我一直觉得,真正有用的NLP项目,不是刷榜单,而是能帮生物信息团队每天省下两小时筛选文献的活。这门课的所有内容,都是从这种“实用主义”出发踩出来的。

1.1 课程背景:为什么是PubMed和药物靶点?

药物靶点关系抽取,说白了就是从生物医学文献里抽取出“哪个药,对哪个靶点,产生了什么效果(激活/抑制/结合…)”。PubMed是最大的免费生物医学数据库,每天新增几千条摘要。

我几年前给一家药企做内部工具,发现他们采购的第三方知识图谱更新太慢,很多新发现的靶向关系一两个月后才入库。当时就琢磨——能不能自己每天从新文献里自动抽出来? 这个想法,就是这门课的起点。

常见需求场景
场景痛点课程对应模块
新药筛选手动阅读大量文献,漏掉潜在靶点PubMed检索 + 关系抽取
知识库维护依赖人工标注,更新周期长自动抽取 + 验证
靶点验证证据链不完整,需要多文献佐证共指消解 + 聚合

1.2 学完这门课,你能做什么?

  • 从PubMed官网或者API批量拉取指定疾病的文献摘要
  • 对文献做分词、词形还原、实体识别(药物、基因、疾病)
  • 用SOTA模型(比如基于BERT的fine-tune版本)抽取药物‑靶点关系
  • 把结果存成结构化的三元组,可以直接喂给知识图谱
一个可量化的目标:给你30篇关于“肺癌靶向治疗”的文献,在一天内(含模型训练)输出一个准确率>85%的关系抽取管道,并生成JSON格式的关系列表。

1.3 整体流程:我们这个管线长什么样?

我不想一上来就甩出一堆概念。先让你看一眼完整的pipeline,心里有个地图。下面这张图,就是我们未来30章要一步步搭起来的骨架。

PubMed文献药物靶点关系抽取管线 ① 文献获取 ② 文本预处理 ③ 命名实体识别 ④ 关系抽取 ⑤ 后处理 & 评估 关键思想 PubMed API + 本地缓存 → SciSpacy / BioBERT → 三元组输出 → 知识图谱

你可能注意到了,这不是一条直线。右边NER做完之后,结果会回流到关系抽取模块;后处理阶段还会做共指消解和冲突检测。每一个环节我们都准备了可复用的代码,而不是概念演示。

1.4 技术栈一览

我习惯用Python + PyTorch打底,因为生物医学领域的预训练模型(BioBERT、PubMedBERT)正好都是PyTorch生态的。下面这个表是你这30章会用到的核心工具,我提前列出来,你心里有个底。

核心技术栈
模块工具/库用途
文献获取Biopython (Entrez), RequestsPubMed E‑Utilities API封装
预处理SciSpacy + BioWordVec分词、断句、词形还原、嵌入
实体识别HuggingFace Transformers (BioBERT)药物/基因/疾病NER标注
关系抽取REBEL / SpERT / 自定义分类器从实体对中抽取语义关系
评估scikit-learn, seqeval精确率、召回率、F1
数据存储JSON / SQLite / Neo4j (可选)结构化三元组持久化
曾经踩过的坑:第一次用Biopython拉数据时,没有设置本地缓存。结果反复请求同样的PMID,被NCBI封了IP整一天。后来我学乖了——所有API响应都先存一份JSON到本地,别信网络。这门课你会看到如何用`sqlite3`做轻量缓存。

1.5 你能得到什么,以及怎么跟课

每个章节都是“背景说明 → 代码实现 → 避坑总结”三段式。代码全部在Colab和本地双环境验证过。

我个人的建议:别只看不敲。哪怕第一遍完全照着抄,也比光读强。

  • 第1-5章:PubMed API + 文本预处理,这是数据基础设施
  • 第6-15章:NER + 序列标注,你会亲手训练一个生物医学NER模型
  • 第16-25章:关系抽取主流方法(REBEL、SpERT、远程监督)
  • 第26-30章:工程化落地,包括接口封装、Docker部署、持续抽取

嗯,大致就是这样。把地图摊开,咱们就可以出发了。