2. 分子与蛋白数据对象解析
在分子蛋白多模态建模中,模型真正“看到”的并不是试管里的分子,而是一组被结构化编码的数据对象。同一对配体—蛋白,在不同模态下会呈现为完全不同的表示:小分子可能是一条 SMILES 字符串、一张原子键图、一组 3D 坐标;蛋白可能是一段氨基酸序列、一个残基接触图、一个结合口袋点云,以及若干条功能注释。理解这些数据对象各自的表示方式、字段含义与相互映射关系,是后续多模态对齐与融合的前提。
一、小分子:从 SMILES 到分子图与 3D 构象
SMILES(Simplified Molecular Input Line Entry System)用一串 ASCII 字符描述分子的原子与键拓扑。例如咖啡因可写作 CN1C=NC2=C1C(=O)N(C(=O)N2C)C,其中大写字母代表原子(C、N、O),= 表示双键,(...) 表示支链,环闭合用数字标号配对。SMILES 的核心价值是紧凑、可字符串化、便于批量存储与检索,但它只表达 2D 拓扑,不包含氢原子数、立体化学(除非用 @、/、\ 显式标注)和真实三维构象。
建模时通常把 SMILES 解析为分子图:节点是重原子,节点特征包括元素类型、度、形式电荷、手性、是否在环内、杂化方式等;边是化学键,边特征包括键级、是否共轭、是否在环内。若需要 3D 模态,则用 RDKit 等工具生成构象:
from rdkit import Chem
from rdkit.Chem import AllChem
mol = Chem.MolFromSmiles("CN1C=NC2=C1C(=O)N(C(=O)N2C)C")
mol = Chem.AddHs(mol)
AllChem.EmbedMolecule(mol, randomSeed=42)
AllChem.MMFFOptimizeMolecule(mol)
conf = mol.GetConformer()
# 每个原子的 3D 坐标
coords = [list(conf.GetAtomPosition(i)) for i in range(mol.GetNumAtoms())]
这里 EmbedMolecule 生成初始构象,MMFFOptimizeMolecule 做力场优化。需要注意:同一 SMILES 可能对应多个低能构象,建模时应明确使用单一构象还是构象集合(ensemble),并在数据字段中记录构象来源与随机种子,保证可复现。
二、蛋白:序列、3D 结构与残基级特征
蛋白的氨基酸序列是最基础的表示,通常用 20 种标准氨基酸的单字母码书写,例如 MKTAYIAKQRQISFVKSHFSRQLEERLGLIEVQ。序列对象的关键字段包括:链 ID、序列字符串、起止残基编号、非标准残基与缺失残基标记。序列模态适合用 one-hot、embedding 或预训练语言模型(如 ESM 系列)编码。
3D 结构模态则来自 PDB 或 AlphaFold 预测结果,核心数据是每个原子的三维坐标、元素类型、所属残基与链。从结构可以进一步派生:残基级 Cα 坐标、主链二面角(φ、ψ)、溶剂可及表面积(SASA)、二级结构(H/E/C)等。若把蛋白表示为图,节点是残基,边可由空间距离阈值(如 Cα 距离 < 8 Å)或序列邻接定义,节点特征可拼接氨基酸类型、SASA、相对位置编码。
三、结合位点:从坐标到口袋对象
结合位点是把小分子与蛋白关联起来的关键对象。常见定义方式有三类:一是以配体为中心,取配体周围一定半径(如 5~8 Å)内的蛋白残基;二是以已知关键残基为中心;三是用几何口袋检测算法(如 fpocket)给出空腔。无论哪种方式,最终都应落成一个可计算的口袋对象,包含:口袋中心坐标、半径、残基列表、原子索引集合,以及可选的网格化占据图。
在多模态建模中,结合位点常被表示为局部子图或局部点云,并与小分子的原子做配对。此时需要明确坐标参照系:蛋白坐标、配体坐标、口袋中心坐标三者必须统一到同一坐标系,否则距离阈值和接触判断都会出错。
四、功能注释:把语义信息接入数据对象
功能注释为结构数据补充语义层,常见来源包括 GO(Gene Ontology)条目、EC 编号、Pfam 结构域、UniProt 关键词、结合数据库记录(如 PDBbind 的亲和力数值)。这些注释通常以 ID 加文本的形式存在,建模时可编码为多标签向量或文本嵌入,用于辅助任务(如功能预测、结合亲和力回归)。
下面这张图把本节涉及的五类数据对象及其派生关系组织在一起,便于建立整体数据视图。
五、多模态对齐中的字段设计
把上述对象组织成一条可训练样本时,建议显式记录以下字段,避免模态间信息丢失:
| 字段 | 含义 | 示例 |
|---|---|---|
| ligand_smiles | 配体 SMILES 字符串 | CN1C=NC2=C1C(=O)N(C(=O)N2C)C |
| ligand_atom_coords | 配体重原子 3D 坐标 | [[1.24, 0.53, -0.12], ...] |
| protein_sequence | 蛋白单字母序列 | MKTAYIAKQRQ... |
| pocket_residues | 口袋残基编号列表 | [45, 47, 89, 102, 156] |
| pocket_center | 口袋中心坐标 | [12.4, -3.8, 7.1] |
| pocket_radius | 口袋半径(Å) | 6.0 |
| go_terms | GO 注释 ID 列表 | GO:0005515, GO:0004672 |
| affinity | 结合亲和力(可选) | 7.2 (pKd) |
gemmi 或 Bio.PDB 读取,注意区分 ATOM 与 HETATM 记录,前者是蛋白原子,后者常包含配体、水与离子。配体与蛋白的链 ID、残基编号、插入码都要保留,否则后续按残基索引对齐会错位。总结来看,小分子侧的核心是“SMILES → 分子图 → 3D 构象”,蛋白侧的核心是“序列 → 3D 结构 → 残基级特征”,两者在结合位点处通过坐标与残基索引建立对应,再由功能注释补充语义。把这五类对象及其字段、参照系、派生路径理清,后续的多模态编码、对齐与融合才有稳定的数据基础。