3. 分子结构表示与标准化

在QSAR建模中,分子结构表示是整条数据链的起点。同一化合物若以不同形式进入建模流程,模型看到的“特征”可能完全不同,最终活性预测结果也会出现偏差。本节围绕SMILES、InChI、分子图三种表示方式,以及盐离子处理与互变异构体标准化两个关键清洗环节,说明如何把原始结构数据整理成可比较、可建模的统一形式。

一、三种结构表示的分工

SMILES(Simplified Molecular Input Line Entry System)是用字符串描述分子连接关系的一种线性表示。例如乙醇写作 CCO,苯环写作 c1ccccc1。它的优点是紧凑、易存储、便于程序解析;缺点是同一分子可以有多种合法写法,如 CC(=O)O 与 OC(C)=O 都表示乙酸。若不做规范化,同一化合物会被当成两条记录,导致重复计数或训练集泄漏。

InChI(International Chemical Identifier)是IUPAC推出的标准标识符,由分层结构组成,如 InChI=1S/C2H6O/c1-2-3/h3H,2H2,1H3。它包含分子式层、连接层、氢原子层、电荷层、立体化学层等,具有唯一性和可校验性,适合作为跨数据库的“主键”。InChIKey是InChI的固定长度哈希,常用于快速检索与去重。

分子图把分子表示为节点(原子)与边(化学键)的集合,节点带元素、电荷、杂化等属性,边带键级、立体信息。图表示是图神经网络(GNN)等现代QSAR方法的直接输入,也是判断两个结构是否同构的数学基础。

同一分子的三种表示与标准化入口 分子图 C O O 节点=原子,边=键级 SMILES CC(=O)O OC(C)=O 同一分子,多种合法写法 需规范化才能去重 InChI / InChIKey InChI=1S/C2H4O2/c1-2 (3)4/h1H3,(H,3,4) QTBSBXVTEAMEQO-UHFFFAOYSA-N 分层结构,唯一性强 适合跨库主键 标准化入口:去盐 → 去同位素 → 中和电荷 → 互变异构体归一 → 生成规范SMILES/InChIKey 输出:唯一、可比较、可建模的结构标识

二、盐离子与反离子处理

药物化学数据库中大量化合物以盐形式存在,如盐酸盐、钠盐、马来酸盐。若直接对盐形式计算分子量、logP或指纹,反离子会引入额外原子,使描述符偏离真实活性分子。标准做法是保留最大的有机母体片段,剥离无机反离子与溶剂分子。例如 [Na+].[Cl-].CC(=O)O 应规范为 CC(=O)O;CN1C=NC2=C1C(=O)N(C)C(=O)N2C.Cl(咖啡因盐酸盐示例)应保留咖啡因母体。

需要注意两类例外:一是季铵盐、两性离子等母体本身带电荷的化合物,不能简单“去电荷”,而应保留其净电荷状态;二是含金属的配合物或硼酸类前药,剥离反离子可能改变活性实体,需结合具体项目判断。实操中常用RDKit的 SaltRemover 或 rdMolStandardize 模块完成,处理后再统一生成规范SMILES。

三、互变异构体标准化

互变异构体是同一分子因质子与双键位置不同而形成的不同结构,典型如酮式—烯醇式、酰胺—亚胺醇式、咪唑环上的N-H迁移。它们在数据库中常以不同记录出现,但化学本质相同。若不加处理,同一化合物会被重复计数,训练集与测试集之间还可能发生结构泄漏,使模型评估虚高。

标准化的目标是为每个互变异构体集合选定一个规范形式。常用规则包括:优先选择能形成更多芳香环的形式;优先选择电荷分离更少的形式;优先选择官能团稳定性更高的形式(如酮式优于烯醇式)。RDKit提供 TautomerEnumerator 与 CanonicalTautomer 接口,可按规则枚举并选取规范互变异构体。

示例:乙酰乙酸乙酯的酮式—烯醇式互变异构

酮式:  CCOC(=O)CC(C)=O
烯醇式:CCOC(=O)C=C(C)O
标准化后统一为酮式:CCOC(=O)CC(C)=O

若两条记录分别以酮式和烯醇式入库,标准化后应合并为同一条,避免重复。

四、可执行的标准化流程

把上述环节串起来,一个可复现的标准化流程如下(以RDKit为例,示例参数为教学假设,实际需按项目调整):

from rdkit import Chem
from rdkit.Chem.MolStandardize import rdMolStandardize

def standardize(smiles):
    mol = Chem.MolFromSmiles(smiles)
    if mol is None:
        return None
    # 1. 去盐:保留最大有机片段
    mol = rdMolStandardize.FragmentParent(mol)
    # 2. 去同位素
    mol = rdMolStandardize.IsotopeParent(mol)
    # 3. 电荷中和(保留母体净电荷逻辑)
    mol = rdMolStandardize.Uncharger().uncharge(mol)
    # 4. 互变异构体归一
    enumerator = rdMolStandardize.TautomerEnumerator()
    mol = enumerator.Canonicalize(mol)
    # 5. 输出规范SMILES与InChIKey
    can_smiles = Chem.MolToSmiles(mol, isomericSmiles=True)
    inchi_key = Chem.MolToInchiKey(mol)
    return can_smiles, inchi_key

print(standardize("[Na+].[Cl-].CC(=O)O"))
# 预期输出:('CC(=O)O', 'QTBSBXVTEAMEQO-UHFFFAOYSA-N')

运行后应检查三点:一是去盐后母体是否合理,分子量是否与预期活性实体一致;二是互变异构体归一后,同一化合物的不同记录是否收敛到同一InChIKey;三是立体化学信息是否被意外丢失,若项目需要区分对映体,应在标准化时保留手性标记。

五、常见问题与判断依据

  • 去盐过度:季铵盐、两性离子被错误中和,导致活性实体电荷状态改变。判断依据:检查母体净电荷是否与药理相关形式一致。
  • 互变异构体归一错误:某些含氮杂环的规范形式选择不符合项目化学直觉。判断依据:抽样人工核对,必要时自定义优先级规则。
  • SMILES解析失败:芳香性、手性标记或价态异常导致 MolFromSmiles 返回None。判断依据:记录失败条目并回溯原始数据源。
  • InChIKey冲突:不同结构生成相同InChIKey,通常意味着标准化过度或立体信息丢失。判断依据:对比标准化前后的InChI分层信息。

工程建议:标准化应作为数据入库前的固定环节,并保留“原始SMILES—标准化SMILES—InChIKey—处理日志”四列,便于追溯与复现。对同一批数据,标准化脚本应版本化,避免不同批次使用不同规则导致结构不一致。

分子结构表示与标准化看似是数据预处理的小环节,却直接决定QSAR模型能否学到真实的构效关系。把SMILES、InChI、分子图三种表示统一到同一套标准化流程下,再配合盐离子剥离与互变异构体归一,才能让后续的描述符计算、特征选择和模型训练建立在可靠的结构基础之上。