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方法的直接输入,也是判断两个结构是否同构的数学基础。
二、盐离子与反离子处理
药物化学数据库中大量化合物以盐形式存在,如盐酸盐、钠盐、马来酸盐。若直接对盐形式计算分子量、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、分子图三种表示统一到同一套标准化流程下,再配合盐离子剥离与互变异构体归一,才能让后续的描述符计算、特征选择和模型训练建立在可靠的结构基础之上。