3. 分子表示方法

在药物分子性质预测中,模型真正“看到”的并不是试管里的化合物,而是某种数字化表示。同一分子可以被写成 SMILES 字符串、InChI 标识符、原子-键构成的分子图,也可以被压缩成固定长度的分子指纹向量。表示形式决定了模型能感知哪些结构信息,也直接决定了它擅长预测什么、容易在哪些性质上失效。理解这四类表示的构造逻辑与信息损失,是后续特征工程和模型选型的前提。

一、SMILES:线性字符串表示

SMILES(Simplified Molecular Input Line Entry System)用一串 ASCII 字符描述分子拓扑。原子用元素符号表示,芳香原子用小写(如 c、n),环闭合用数字配对标记,分支用圆括号嵌套,双键/三键用 =、# 表示。例如对乙酰氨基酚可写为 CC(=O)Nc1ccc(O)cc1。

SMILES 的关键特性是同一分子存在多种合法写法:可以从不同原子出发、按不同遍历顺序书写。这意味着字符串本身并不唯一,若直接把它当作序列喂给模型,同一分子可能得到不同编码。工程上通常先做规范化(canonical SMILES),使每个分子对应唯一字符串。SMILES 保留了完整的原子与键信息,适合作为图构建的输入或序列模型的输入,但它对字符顺序敏感,局部微小改动可能对应完全不同的分子,模型难以从字符串距离直接推断结构相似性。

二、InChI:分层、可逆的标准化标识

InChI(IUPAC International Chemical Identifier)由 IUPAC 设计,目标是为化合物提供唯一、可逆、可分层解析的标识符。它以 InChI=1S/ 开头,后接若干层:分子式层、连接层(/c)、氢原子层(/h)、电荷层(/q)、立体化学层(/t、/b)等。例如乙醇为 InChI=1S/C2H6O/c1-2-3/h3H,2H2,1H3。

与 SMILES 相比,InChI 的标准化程度更高,适合数据库去重、跨库检索和化合物登记。它的分层结构也便于按需截取:只比较连接层可做骨架匹配,加入立体层可区分手性异构体。但 InChI 字符串较长、字符集复杂,直接作为机器学习输入并不方便,通常需要先解析回分子图再提取特征。此外,InChI 对互变异构、质子化状态的处理有固定规则,可能与实际建模所需的化学形态不完全一致。

三、分子图:最贴近化学直觉的表示

分子图把原子视为节点、化学键视为边,节点带原子类型、电荷、杂化、手性等属性,边带键级、是否共轭、是否成环等属性。这种表示与化学家的结构式直觉一致,也是图神经网络(GNN)的直接输入。相比字符串,图表示天然具备置换不变性:无论原子编号如何变化,图的结构不变,模型不会因书写顺序不同而产生偏差。

分子图能完整承载拓扑与局部环境信息,适合预测依赖子结构、官能团和空间连接关系的性质,如溶解度、毒性、结合亲和力。其代价是计算复杂度较高,且对三维构象、立体化学的显式表达需要额外设计边特征或节点特征。对于小数据集,图模型容易过拟合;此时固定长度的指纹往往更稳健。

四、分子指纹:固定长度的结构编码

分子指纹把分子结构映射为固定长度的位向量或计数向量,常见的有 Morgan/ECFP、MACCS keys、RDKit 指纹等。以 Morgan 指纹为例,算法从每个原子出发,按半径 r 逐层扩展,把每个原子邻域哈希成一个整数索引,再映射到固定长度的位串中。半径 r=2 对应 ECFP4,是药物建模中常用的默认设置。

指纹的优点是长度固定、计算快、可直接接入随机森林、SVM、XGBoost 等传统模型,在中小规模数据上表现稳定。缺点是信息有损:哈希碰撞会丢失部分结构细节,且指纹不保留原子对应关系,难以解释具体哪个子结构驱动了预测。此外,指纹半径和位数是超参数,需要根据任务调整。

同一分子(对乙酰氨基酚)的四种表示形式与信息流向 目标分子 C₈H₉NO₂ · 分子量 151.16 SMILES 线性字符串 · 拓扑完整 CC(=O)Nc1ccc(O)cc1 不唯一,需规范化 适合序列模型 / 图构建 InChI 分层标准化 · 可逆 InChI=1S/C8H9NO2/c1-6(10) 7-5-3-2-4-8(11)9-7/h2-5,11H, 1H3,(H,9,10) 适合检索 / 去重 分子图 节点=原子 · 边=化学键 C O N C 置换不变 · 信息完整 适合 GNN 分子指纹 固定长度位向量 Morgan r=2 · 2048 位 哈希有损 · 计算快 适合传统 ML 信息保留程度与建模适用性对照 信息最完整 信息最压缩 分子图 GNN / 子结构 SMILES 序列 / 图构建 InChI 检索 / 去重 指纹 传统 ML

五、表示形式如何影响性质预测

不同表示对预测任务的影响可以从三个维度理解。

信息完整性。分子图保留全部拓扑与属性,SMILES 保留拓扑但丢失置换不变性,InChI 标准化但可能固定互变异构形态,指纹则因哈希碰撞丢失细节。预测依赖立体化学或精确子结构时,图或带立体层的 InChI 更合适;预测只依赖官能团计数时,指纹已足够。

模型匹配度。序列模型(RNN、Transformer)适合 SMILES;GNN 适合分子图;随机森林、SVM、XGBoost 适合指纹。把指纹喂给 GNN 或把 SMILES 直接喂给树模型,通常无法发挥表示本身的优势。

数据规模与任务类型。小数据(几百到几千条)下,指纹加树模型往往比 GNN 更稳;数据量上万后,图模型能学到更细的结构-性质关系。对于需要解释性的任务(如指出哪个子结构导致毒性),分子图或子结构指纹比全局哈希指纹更易追溯。

实操建议:在项目初期同时准备两套表示——Morgan 指纹(r=2,2048 位)用于快速基线,分子图用于后续 GNN 迭代。用同一划分比较两者在验证集上的 RMSE 或 AUC,再决定主路线。

六、一个可复现的表示生成示例

以下代码用 RDKit 从同一分子生成四种表示,便于对比其输出形态。示例参数为 Morgan 半径 2、2048 位,属于常用默认设置。

from rdkit import Chem
from rdkit.Chem import AllChem, inchi

smi = "CC(=O)Nc1ccc(O)cc1"
mol = Chem.MolFromSmiles(smi)

# 1. 规范化 SMILES
canonical = Chem.MolToSmiles(mol)

# 2. InChI
inchi_str = inchi.MolToInchi(mol)

# 3. 分子图(原子数、键数、邻接关系)
num_atoms = mol.GetNumAtoms()
num_bonds = mol.GetNumBonds()

# 4. Morgan 指纹
fp = AllChem.GetMorganFingerprintAsBitVect(mol, radius=2, nBits=2048)
on_bits = fp.GetOnBits()

print("canonical:", canonical)
print("inchi:", inchi_str)
print("atoms/bonds:", num_atoms, num_bonds)
print("fingerprint on-bits:", len(on_bits))

运行后典型输出为:规范化 SMILES 为 CC(=O)Nc1ccc(O)cc1,InChI 以 InChI=1S/C8H9NO2 开头,原子数 11、键数 11,指纹置位约 30~40 位(具体数值随 RDKit 版本略有差异)。这些输出可直接作为后续特征矩阵或图数据的输入。

七、选择表示时的判断依据

实际项目中可按以下顺序判断:先看任务是否需要立体化学或精确子结构,若是则优先分子图或带立体层的 InChI;再看数据规模,小于五千条时优先指纹加树模型建立基线;最后看可解释性要求,需要定位关键子结构时用分子图或子结构指纹。SMILES 更适合作为中间格式,用于解析、规范化或序列建模,而不是最终特征。InChI 则主要用于数据清洗阶段的去重与跨库对齐。

需要强调的是,表示形式不是孤立选择,它与模型、特征、评价指标共同构成建模方案。同一分子在不同表示下可能得到不同的预测精度,这种差异本身也是值得分析的信号:如果指纹模型与图模型结论差异很大,往往说明任务依赖的结构层次不同,需要进一步检查数据与标签定义。