1. 分子表征基础:分子结构表示方法
做分子相关的工作,第一步就是搞清楚:怎么把分子结构告诉计算机。我刚入行时天真地以为直接用化学式就行,结果模型连同分异构体都分不清,跑出来的预测结果一塌糊涂。说白了,计算机不认识三维结构,它只认识数字和符号。所以我们需要一套“翻译规则”,把分子结构变成机器能处理的形式。
1.1 SMILES——最常用的线性编码
SMILES 是个聪明的东西。它把分子结构压成一串字符,像写化学式一样简单。比如水就是 O,乙醇就是 CCO。但别被它的简洁骗了——规则其实挺多。
- 原子符号:大写字母表示非碳元素,比如 O、N、Cl。碳可以省略,我习惯直接写 C。
- 键类型:单键不写,双键写
=,三键写#。比如乙烯C=C。 - 分支:用圆括号表示支链。比如异丙醇
CC(O)C。 - 环结构:用数字标记环的起点和终点。比如苯
c1ccccc1。
@ 符号指定构型,结果模型把两个对映体当成了同一个东西。所以切记:[C@@H] 和 [C@H] 是不一样的。
举个完整的例子:阿司匹林的 SMILES 是 CC(=O)Oc1ccccc1C(=O)O。你想想看,这么短的字符串就能唯一确定一个分子,确实很厉害。但它也有弱点——不同软件可能生成不同的 SMILES 序列,你要做标准化。我自己一般用 RDKit 的 CanonSmiles 函数统一一下。
from rdkit import Chem
smiles = "CC(=O)Oc1ccccc1C(=O)O"
mol = Chem.MolFromSmiles(smiles)
canon_smiles = Chem.MolToSmiles(mol)
print(canon_smiles) # 输出规范化的 SMILES
1.2 InChI——更稳定的标识符
如果说 SMILES 是“速记符”,那 InChI 就是“分子身份证”。它比 SMILES 更严谨,不会出现同一分子不同编码的问题。InChI 分层次:前面是分子式,后面是连接信息、立体化学等。
| 特性 | SMILES | InChI |
|---|---|---|
| 可读性 | 较好,结构直观 | 较差,层级复杂 |
| 唯一性 | 需要规范化 | 天生唯一 |
| 长度 | 短(尤其小分子) | 较长 |
| 支持互变异构 | 需指定 | 自动处理 |
实际项目中我这样选:做数据库存储用 InChI,避免冲突;做模型输入用 SMILES,因为短、好解析。你如果做分子生成,SMILES 更顺;做检索比对,InChI 更稳。
1.3 分子图——把结构变成计算机真正能吃的形式
前面两种都是字符串,但神经网络喜欢结构化数据。所以我们将分子“转译”成一张图:原子是节点,化学键是边。每个节点可以附上特征(原子类型、电荷、手性等),每条边也可以附上特征(键类型、是否共轭等)。
我做过一个项目,用分子图预测毒性。刚开始我只用原子类型做节点特征,效果一般。后来加上了原子在环上的位置、杂化状态等特征,准确率直接提升了 8 个百分点。所以说,特征工程在分子图上同样重要。
# 用 RDKit 简单演示分子图构建思路
mol = Chem.MolFromSmiles("CCO")
# 遍历原子
for atom in mol.GetAtoms():
print(f"原子 {atom.GetIdx()}: 符号={atom.GetSymbol()}, 价电子数={atom.GetTotalDegree()}")
# 遍历键
for bond in mol.GetBonds():
print(f"键 {bond.GetIdx()}: {bond.GetBeginAtomIdx()}-{bond.GetEndAtomIdx()}, 类型={bond.GetBondType()}")
分子图的好处很明显:它保留了完整的拓扑结构。环、分支、手性中心都能通过图的连通性自然表达。而且你可以用图卷积、图注意力等操作直接在图上学习。这为 GNN 铺好了路。
1.4 为什么需要图神经网络
传统方法(比如 ECFP 指纹、SMILES 字符串用 RNN/Transformer)要么丢失结构信息,要么处理不了局部对称性。你想想看,一个苯环上的 6 个碳,用 SMILES 字符串去学,位置不同编码就不同,可它们在化学上是对等的。GNN 通过消息传递机制,让每个节点聚合邻居信息,天然具备置换不变性——这才是我们想要的。
另外,分子图的规模通常很小(几十个节点),GNN 计算开销可控。而且你可以引入化学先验——比如给边加上键级、给节点加上电负性,这些都能提升模型物理一致性。
有了上面这张图,你应该能看清主线了:从真实的分子结构出发,我们可以选择三种不同的“描述语言”,而分子图最终把拓扑信息原封不动地带到了深度学习模型中——这也是 GNN 成为分子表征主力的根本原因。
小结一下本章核心:
- SMILES 是线性的,适合快速处理和序列模型。
- InChI 是标准化的,适合唯一标识和跨库匹配。
- 分子图保留了连接性,把原子和键变成节点/边,是 GNN 的直接输入。
- GNN 能利用图结构做消息传递,比“把图压平”或“用字符串硬学”更像化家思考的方式。
好了,这一章先到这里。记住我开头说的那句话:选对表示方法,后面训练模型才能事半功倍。现在你对分子表征有了整体概念,接下来我才会一步步教你搭 GNN 网络。