2. 蛋白序列数据获取与质量控制

在蛋白序列相似性智能分析工程中,数据获取与质量控制是决定后续比对、聚类、注释和模型训练可靠性的第一道关口。无论下游使用 BLAST、MMseqs2、HMMER 还是基于嵌入的相似性检索,输入序列集若混入缺失片段、重复条目、非标准残基或长度异常记录,都会直接放大假阳性、扭曲距离矩阵,甚至让聚类结果失去生物学意义。本节围绕“批量获取—字段解析—质量筛查—清洗决策—留痕输出”这一条真实数据管线展开,重点说明每一步应看什么、怎么判断、如何留下可复现的记录。

一、批量获取:从 UniProt 与 NCBI 拿到可追溯的序列集

UniProt 与 NCBI 是蛋白序列最常用的两个来源,但它们的检索语义并不相同。UniProt 以 UniProtKB 条目为核心,强调注释完整性与审核状态,适合需要功能注释、跨库映射和高质量参考集的场景;NCBI 的 Protein 库覆盖面更广,包含大量 GenBank 推导序列和 RefSeq 参考序列,适合做物种覆盖或补全 UniProt 未收录的条目。批量获取时,优先使用官方 API 或可复现的检索式,而不是手工逐条下载。

以 UniProt 为例,可通过 REST 接口按查询条件批量拉取 FASTA。下面示例检索人源、已审核、长度在 100–1000 之间的蛋白,并限制返回字段:

curl -G "https://rest.uniprot.org/uniprotkb/search" \
  --data-urlencode "query=organism_id:9606 AND reviewed:true AND length:[100 TO 1000]" \
  --data-urlencode "format=fasta" \
  --data-urlencode "size=500" \
  -o human_reviewed.fasta

NCBI 侧可使用 E-utilities 的 esearch + efetch 组合,先取 GI 或 Accession 列表,再批量取 FASTA:

esearch -db protein -query "txid9606[Organism] AND refseq[Filter]" \
  | efetch -format fasta > human_refseq.fasta

无论走哪条路径,都应同时保存三样东西:原始检索式、下载时间戳、以及每条序列的来源库与 Accession。缺少这三项,后续发现异常时无法回溯,也无法判断某条序列是否应被替换或剔除。

二、字段解析:把 FASTA 头变成可筛选的结构化表

FASTA 头是质量控制的信息入口。UniProt 头通常形如 sp|P12345|NAME_HUMAN 或 tr|Q8N...|...,其中 sp 表示已审核,tr 表示未审核;NCBI 头常包含 ref|NP_...| 或 gb|AAA...|。批量处理时,应先把头解析为结构化表,至少包含:accession、来源库、审核状态、物种、序列长度、序列本身。这样后续的长度分布、重复检测和残基检查都可以在表上完成,而不是反复扫描 FASTA。

一个实用的做法是用 Python 的 Biopython 或轻量脚本解析,并输出 TSV 中间表。示例字段可设计为:accession, source_db, reviewed, organism, length, sequence, md5。其中 md5 用于后续冗余检测,length 用于长度异常筛查。

三、四类核心质量问题与判断依据

缺失。缺失有两种含义:一是条目本身缺失关键字段,例如没有物种、没有长度、序列为空;二是序列内部出现连续未知残基,如 X 或 ?。前者应在解析阶段直接标记为不可用;后者需要统计 X 的比例。经验上,若一条序列中 X 占比超过 5%,或连续 X 长度超过 20,通常不建议直接进入精细比对,可先保留在“待处理”集合中。

冗余。冗余包括完全重复和高度相似重复。完全重复可用序列 MD5 或去空格后字符串直接判等;高度相似重复则需在清洗前做一次快速聚类,例如用 MMseqs2 以 100% 一致度、90% 覆盖度预聚类,把同一蛋白的不同 isoform 或不同提交版本归并。若不做这一步,后续相似性搜索会出现大量自我命中,干扰阈值判断。

非标准残基。标准氨基酸为 20 种,加上 B、Z、X、U、O 等扩展符号。若下游工具只接受 20 种标准残基,就必须处理这些符号。常见策略是:B(Asx)和 Z(Glx)可分别映射为 N/D 和 Q/E 的占位,或直接替换为 X;U(硒代半胱氨酸)和 O(吡咯赖氨酸)在多数比对中可保留或转为 C/K,但必须记录转换规则。任何替换都不能静默进行,否则会破坏可复现性。

长度异常。长度异常没有绝对阈值,应结合物种和蛋白家族判断。一个可操作的流程是:先按来源库和物种分组,计算长度的中位数与四分位距,把小于 Q1−1.5×IQR 或大于 Q3+1.5×IQR 的条目列为疑似异常;再结合注释判断是否为片段、信号肽截断或融合蛋白。对于明显过短(如小于 50 aa)且无注释支持的条目,通常应剔除或单独存放。

蛋白序列批量获取与质量控制管线 UniProtKB REST API / reviewed 优先 sp | tr | 注释完整 NCBI Protein E-utilities esearch+efetch ref | gb | 覆盖广 FASTA 头解析 accession / source_db reviewed / organism length / md5 / sequence 缺失检查 空序列 / 无物种 / X 占比 冗余检测 MD5 判等 / 100% 预聚类 非标准残基 B / Z / X / U / O 映射 长度异常 IQR 离群 / 片段判断 清洗决策 保留 / 替换 / 剔除 规则写入日志 可回溯、可复现 清洗后输出 clean.fasta + qc_report.tsv + rules.log 每条序列保留 accession / 来源 / 处理动作 供下游比对、聚类与嵌入检索使用 异常条目回退复核

四、清洗决策与留痕:让每一步都可复现

质量筛查之后,必须把判断转化为明确的处理动作,并写入日志。建议把每条序列的处理结果归为三类:保留(通过全部检查)、替换(如非标准残基被映射、isoform 被代表序列替代)、剔除(空序列、严重缺失、无法解释的长度异常)。日志至少记录 accession、原始长度、处理后长度、触发规则、处理动作和时间戳。

下面给出一个可直接参考的 QC 报告字段示例,便于在工程中落地:

字段含义示例
accession序列唯一标识P12345
source_db来源库UniProtKB
raw_length原始长度842
clean_length清洗后长度842
x_ratioX 残基占比0.012
dup_group冗余组编号G017
action处理动作keep / replace / drop
rule触发规则X_RATIO_LT_5PCT
建议把“剔除”与“替换”分开统计。剔除率过高往往说明检索式过宽或来源库混杂;替换率过高则提示非标准残基处理规则可能需要调整,而不是简单继续清洗。
不要在没有记录的情况下直接删除序列或替换残基。相似性分析的可复现性依赖于输入集的可追溯性,任何静默修改都会让后续结果无法解释。

五、与下游分析的衔接

完成清洗后,输出应是一份干净的 FASTA 加一份 QC 报告。进入相似性搜索前,还应做一次快速自比对或预聚类,确认没有残留的完全重复条目;若使用 MMseqs2,可先以 --min-seq-id 1.0 -c 0.9 做预聚类,再进入正式比对。对于长度异常但确有生物学意义的片段,可单独建立“片段集”,不要与全长序列混在一起计算全局相似度,否则长度差异会主导距离,掩盖真实的序列相似关系。

整体来看,这一节的核心不是“下载序列”,而是建立一条可追溯、可判断、可复现的数据质量管线:来源清楚、字段结构化、四类问题有明确判据、处理动作有日志、输出能直接支撑下游分析。做到这一点,后续的相似性计算才有可靠的基础。