4. InterProScan输出格式解析:TSV、GFF3、XML等
InterProScan跑完之后,会吐出一堆文件。很多人拿到结果就懵了,不知道怎么看。我个人习惯先搞清楚每种格式的结构,再决定用哪个。
今天我们就来拆解三种最常见的输出格式:TSV、GFF3、XML。每种格式我都踩过坑,我会把关键点都告诉你。
4.1 TSV格式:快速上手的首选
TSV(Tab-Separated Values)是最直接的格式。说白了,就是一列一列排好的表格数据。
举个例子,一条典型的TSV记录长这样:
P12345 Pfam PF00001.29 7 transmembrane receptor 123 456 9.8e-15 T IPR000276 15-03-2024
P12345 Superfamily SSF81321 Rhodopsin-like 130 440 1.2e-20 T IPR017452 15-03-2024
每一列的含义如下:
| 列号 | 字段名 | 说明 |
|---|---|---|
| 1 | 蛋白序列ID | 一般是FASTA的header里的ID |
| 2 | 分析库 | Pfam、Superfamily、Gene3D等 |
| 3 | 匹配的条目ID | 例如PF00001.29 |
| 4 | 条目名称 | 人类可读的描述 |
| 5 | 匹配起始位点 | 在蛋白序列上的位置 |
| 6 | 匹配结束位点 | 同上 |
| 7 | E-value | 显著性评分,越小越可信 |
| 8 | 状态 | T=真阳性,?-不确定 |
| 9 | InterPro条目ID | 跨数据库整合后的统一ID |
| 10 | 日期 | 运行分析的日期 |
我曾经在项目里用TSV做批量处理,遇到一个大坑:同一个蛋白的多个匹配结果是逐行排列的,不是合并在一行里。这会导致后续处理时需要分组聚合。嗯,这里要注意。
4.2 GFF3格式:基因组学家的最爱
GFF3(General Feature Format version 3)是生物信息学里通用的特征注释格式。如果你做基因组注释或者比较基因组学,这个格式你肯定绕不开。
先看一个完整的GFF3例子:
##gff-version 3
# InterProScan 5.65-96.0 output
seq1 InterProScan protein_match 10 300 . + . ID=hit1;Name=PF00001;Dbxref=InterPro:IPR000276
seq1 InterProScan domain 50 200 . + . ID=domain1;Parent=hit1;Dbxref=GO:0004930
seq1 InterProScan conserved_site 120 130 . + . ID=site1;Parent=hit1;Dbxref=PROSITE:PS00237
9列分别是:
- seqid:序列ID
- source:来源,一般是InterProScan
- type:特征类型,如蛋白匹配、结构域、保守位点
- start:起始位置
- end:结束位置
- score:得分,通常为.表示无
- strand:链方向,+或-
- phase:相位,编码区用0/1/2,非编码区用.
- attributes:键值对形式的属性,分号分隔
我个人觉得GFF3最妙的地方在attributes列。你可以通过ID、Parent这些键来构建层级关系。比如上面的例子,hit1是父节点,domain1和site1都是它的子节点。
gffutils库解析GFF3,发现如果一个蛋白有多个结构域,它们的Parent属性必须拼写正确,大小写敏感。拼错了整个层级关系就断了。
4.3 XML格式:程序员的瑞士军刀
XML(eXtensible Markup Language)是信息最完整、结构最灵活的格式。它把整个分析过程的元数据都保存下来了,包括参数、版本号、每个匹配的细节。
我建议在需要做深度数据挖掘或机器学习特征提取时使用XML。因为它的嵌套结构很容易用XPath或DOM解析器提取任意层次的信息。
一段简化的XML示例:
<protein xmlns="http://www.ebi.ac.uk/interpro/resources/schemas/interproscan5">
<sequence-id>P12345</sequence-id>
<sequence-length>350</sequence-length>
<matches>
<match>
<signature>
<ac>PF00001.29</ac>
<description>7 transmembrane receptor</description>
<database>Pfam</database>
</signature>
<locations>
<location>
<start>123</start>
<end>456</end>
<score>9.8e-15</score>
<status>T</status>
</location>
</locations>
<cross-references>
<db-reference>
<db>InterPro</db>
<dbkey>IPR000276</dbkey>
</db-reference>
</cross-references>
</match>
</matches>
</protein>
你看,XML把signature(匹配的模板)、locations(位置)、cross-references(交叉引用)都清晰地分开了。每个部分都可以单独提取。
ElementTree解析起来很快。
4.4 三种格式的对比与选择
为什么会有三种格式?因为需求不同。我整理了一张对比表:
| 特性 | TSV | GFF3 | XML |
|---|---|---|---|
| 可读性 | ★★★★★ | ★★★★ | ★★★ |
| 解析复杂度 | 低 | 中 | 中高 |
| 信息完整性 | 低(只有匹配结果) | 中 | 高(含元数据) |
| 层级结构支持 | 无 | 有(通过Parent) | 有(原生树结构) |
| 文件大小 | 小 | 中等 | 较大 |
| 常见用途 | 统计、报表 | 基因组注释 | 数据挖掘、模型训练 |
你应该已经发现了,选择哪种格式取决于你下一步要做什么。如果只是看一眼结果,TSV就够了。如果要整合到基因组浏览器里展示,GFF3是标准。如果要拿去做机器学习特征工程,我强烈推荐XML。
4.5 核心知识点图解
下面这张SVG图帮你理清三种格式的核心差异和选择逻辑:
4.6 实战:如何选择解析方式
有了上面的基础,我们来看看实际开发中怎么选。
假设你的目标是训练一个蛋白质功能预测模型,你需要从InterProScan结果中提取特征。我个人经验是这样的:
- 如果你只需要简单特征(比如匹配到的Pfam家族数量)→ 用TSV,一行awk命令就搞定
- 如果你需要保留层级关系(比如某个结构域包含哪些保守位点)→ 用GFF3,注意维护Parent链
- 如果你需要特征工程的全部信息(包括匹配坐标、E-value、数据库交叉引用、匹配片段长度比例等)→ 用XML,它是信息量最完整的
解析XML的Python代码骨架,我一般这么写:
import xml.etree.ElementTree as ET
tree = ET.parse('output.xml')
root = tree.getroot()
# 获取所有匹配
for protein in root.findall('.//{http://www.ebi.ac.uk/interpro/resources/schemas/interproscan5}protein'):
seq_id = protein.find('{http://...}sequence-id').text
matches = protein.find('{http://...}matches')
for match in matches.findall('{http://...}match'):
sig_ac = match.find('{http://...}signature/{http://...}ac').text
evalue = match.find('.//{http://...}score').text
start = match.find('.//{http://...}start').text
end = match.find('.//{http://...}end').text
print(f"{seq_id}\t{sig_ac}\t{evalue}\t{start}-{end}")
命名空间前缀不能省,这是XML解析的常规坑。我建议直接把命名空间字符串定义成常量,避免写错。
好了,到这儿InterProScan的输出格式你应该心里有数了。记住一句话:TSV图方便,GFF3图标准,XML图完整。根据你的下游任务,选最顺手的那一个。