4. InterProScan输出格式解析:TSV、GFF3、XML等

InterProScan跑完之后,会吐出一堆文件。很多人拿到结果就懵了,不知道怎么看。我个人习惯先搞清楚每种格式的结构,再决定用哪个。

今天我们就来拆解三种最常见的输出格式:TSV、GFF3、XML。每种格式我都踩过坑,我会把关键点都告诉你。

4.1 TSV格式:快速上手的首选

TSV(Tab-Separated Values)是最直接的格式。说白了,就是一列一列排好的表格数据。

适用场景:快速浏览结果、简单统计、导入Excel/SPSS做分析。

举个例子,一条典型的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匹配结束位点同上
7E-value显著性评分,越小越可信
8状态T=真阳性,?-不确定
9InterPro条目ID跨数据库整合后的统一ID
10日期运行分析的日期

我曾经在项目里用TSV做批量处理,遇到一个大坑:同一个蛋白的多个匹配结果是逐行排列的,不是合并在一行里。这会导致后续处理时需要分组聚合。嗯,这里要注意。

4.2 GFF3格式:基因组学家的最爱

GFF3(General Feature Format version 3)是生物信息学里通用的特征注释格式。如果你做基因组注释或者比较基因组学,这个格式你肯定绕不开。

核心思想:GFF3用9列制表符分隔的数据来描述基因组的特征(features)。

先看一个完整的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列分别是:

  1. seqid:序列ID
  2. source:来源,一般是InterProScan
  3. type:特征类型,如蛋白匹配、结构域、保守位点
  4. start:起始位置
  5. end:结束位置
  6. score:得分,通常为.表示无
  7. strand:链方向,+或-
  8. phase:相位,编码区用0/1/2,非编码区用.
  9. attributes:键值对形式的属性,分号分隔

我个人觉得GFF3最妙的地方在attributes列。你可以通过ID、Parent这些键来构建层级关系。比如上面的例子,hit1是父节点,domain1和site1都是它的子节点。

避坑指南:我曾经用Python的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(交叉引用)都清晰地分开了。每个部分都可以单独提取。

小技巧:我在训练机器学习模型时,常常从XML里提取E-value、匹配长度、位点数量等数值型特征。用Python的ElementTree解析起来很快。

4.4 三种格式的对比与选择

为什么会有三种格式?因为需求不同。我整理了一张对比表:

特性TSVGFF3XML
可读性★★★★★★★★★★★★
解析复杂度低中中高
信息完整性低(只有匹配结果)中高(含元数据)
层级结构支持无有(通过Parent)有(原生树结构)
文件大小小中等较大
常见用途统计、报表基因组注释数据挖掘、模型训练

你应该已经发现了,选择哪种格式取决于你下一步要做什么。如果只是看一眼结果,TSV就够了。如果要整合到基因组浏览器里展示,GFF3是标准。如果要拿去做机器学习特征工程,我强烈推荐XML。

4.5 核心知识点图解

下面这张SVG图帮你理清三种格式的核心差异和选择逻辑:

InterProScan 输出格式选择逻辑 InterProScan 输出 TSV 格式 GFF3 格式 XML 格式 特点 扁平结构,解析简单 适合快速统计 文件体积最小 特点 9列标准格式 支持层级结构 基因组注释标准 特点 完整元数据 原生树结构 可扩展性强 推荐场景 报表统计、快速浏览 推荐场景 基因组注释、可视化 推荐场景 数据挖掘、模型训练 选择格式 = 明确你下一步要做什么 综合来看,做机器学习特征提取时XML最优,兼顾完整性与可解析性

4.6 实战:如何选择解析方式

有了上面的基础,我们来看看实际开发中怎么选。

假设你的目标是训练一个蛋白质功能预测模型,你需要从InterProScan结果中提取特征。我个人经验是这样的:

  • 如果你只需要简单特征(比如匹配到的Pfam家族数量)→ 用TSV,一行awk命令就搞定
  • 如果你需要保留层级关系(比如某个结构域包含哪些保守位点)→ 用GFF3,注意维护Parent链
  • 如果你需要特征工程的全部信息(包括匹配坐标、E-value、数据库交叉引用、匹配片段长度比例等)→ 用XML,它是信息量最完整的
曾经我犯过一个错误:在一个项目中直接用TSV提取特征,跑完模型才发现缺少了匹配位点的准确坐标信息,导致特征空间不够丰富。后来重用了XML重新提取,模型AUC提升了5%。所以,在不确定之前,优先保留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图完整。根据你的下游任务,选最顺手的那一个。