2. 分子表示方法:SMILES、SELFIES与分子图
做分子生成,第一步就是选对分子的「语言」。就像做软件你得先定数据结构一样,分子的表示方式直接决定了后面所有模型的设计思路。我这些年折腾过不少分子生成项目,可以说,选错表示方法,后面跑出来的结果基本没法看。
今天咱们把三种主流表示方法掰开揉碎讲清楚:SMILES、SELFIES 和 分子图。你理解清楚了,后面看质量指标才不会晕。
2.1 SMILES:最古老的分子「字符串」
SMILES 全称 Simplified Molecular Input Line Entry System。说白了,就是把分子结构压扁成一行字符串。它依赖深度优先遍历,用括号、数字和符号记录原子连接方式。
举个例子,乙醇的 SMILES 是 CCO。听着简单,对吧?但遇到环、手性中心、同位素,事情就复杂了。
SMILES 的关键规则:
- 原子符号:大写字母代表重原子,小写字母加方括号表示特殊记号。
- 单键/双键/三键:单键不写,双键写
=,三键写#。 - 分支:用圆括号
()表示支链。 - 环:用数字标记环的起点和终点。比如苯环是
c1ccccc1。 - 手性:用
@和@@表示立体构型。
# SMILES 示例
乙醇: CCO
苯甲酸: C1=CC=C(C=C1)C(=O)O
咖啡因: CN1C=NC2=C1C(=O)N(C(=O)N2C)C
手性分子: C[C@H](O)C(=O)O
那 SMILES 的问题在哪?我记得早期做分子生成模型时,模型经常输出无效的 SMILES。比如括号不匹配、环数字没闭合。你一算有效性,直接归零。这是字符串表示的天生缺陷——语法和化学结构是脱钩的。
2.2 SELFIES:解决 SMILES 的「硬伤」
SELFIES(Self-Referencing Embedded Strings)是我个人比较喜欢的表示法。它诞生的原因很简单——SMILES 的非确定性太折磨人了。同样的分子可以有完全不同的 SMILES 写法,比如乙醇可以写成 CCO、OCC,甚至加括号乱套都行。
SELFIES 的核心思想:
- 每个符号告诉你下一个符号是什么类型。
- 环的闭合用数字 + 方括号直接写。
- 天生的「100% 语法有效性」。只要你随机生成一串 SELFIES,它一定是合法的 SMILES。
说白了,SELFIES 就是把 SMILES 的「不确定语法」变成了「确定性语法」。模型再也不会输出「括号不匹配」这种低级错误了。
# SELFIES 示例(对应上方的 SMILES)
乙醇: [C][C][O]
苯甲酸: [C][=C][C][=C][C][=C][Ring1][=Branch1][C][=Branch1][C][=O][O]
咖啡因: [C][N][C][=N][C][=C][Ring1][=Branch1][C][=Branch1][C][=O][N][=Branch1][C][=O][N][Ring1][=Branch1][C]
注意,SELFIES 并不是什么黑魔法。它只是加了一层「语法编码」,把分子图的信息打包成自洽的序列。我最近用 SELFIES 做蛋白质配体生成时,有效分子率从 SMILES 的 60% 直接跳到 99% 以上。
2.3 分子图:最接近「化学直觉」的表示
分子图,说白了就是把分子结构画成图。节点是原子(带属性如元素、形式电荷),边是化学键(带类型如单键、双键)。
我在项目中遇到过用图神经网络做生成的任务。图表示的好处是,它天然保留了化学结构——你可以直接看到哪个原子是碳、哪个键是双键。不像 SMILES 和 SELFIES,还需要额外解析。
分子图的典型数据格式(PyTorch Geometric 风格):
# 分子图示例(假设是乙醇)
# 原子特征矩阵: [C, C, O]
atom_features = [[6, 0, 0, 0], # C:原子序数 6,形式电荷 0,...
[6, 0, 0, 0], # C
[8, 0, 0, 0]] # O:原子序数 8
# 邻接矩阵(简单表示)
edge_index = [[0, 1], # 第一根键:C0-C1
[1, 2]] # 第二根键:C1-O2
# 键类型
edge_type = [1, 1] # 1 = 单键
但是图表示也有它的「坑」。图神经网络的计算开销大,尤其是当分子尺寸变大(比如超过 100 个原子)时,消息传递会变得很慢。
2.4 三种表示的对比与选择
下面这个表格是我在实际项目中的经验总结,你直接拿来用就行。
| 特性 | SMILES | SELFIES | 分子图 |
|---|---|---|---|
| 表示本质 | 字符串 + 语法 | 字符串 + 确定性语法 | 图结构 |
| 语法有效性保证 | 否 | 是(100%) | 不适用 |
| 化学有效性保证 | 否 | 否 | 否 |
| 读入/解码效率 | 高(简单字符串) | 中(需解析) | 低(图构建慢) |
| 适合任务 | 序列生成、SLATM | 无条件生成、多样本 | 图神经网络、变性生成 |
| 数据大小 | 小(字符串短) | 略大(每原子多几个字符) | 大(邻接矩阵 + 特征) |
| 可逆性/唯一性问题 | 非规范 SMILES 多 | 天然唯一 | 天然唯一 |
| 我的经验建议 | 适合快速原型、规则驱动 | 首推无条件生成 | 适合图学习方法、需要化学先验 |
2.5 知识体系:三种表示背后的逻辑
下面这张图展示了三种分子表示方法的核心逻辑关系。你看完应该能理解,它们本质上都是对「分子图」不同维度的投影。
2.6 实际项目中的选择建议
好,我们回到真实场景。假设你手头有个分子生成项目,你怎么选?
我个人习惯是这样做的:
- 第一步:确定任务类型。如果是无条件生成(从噪声生成新分子),我直接上 SELFIES。理由很朴素——你不用担心语法无效,模型想怎么输出就怎么输出,最后再转 SMILES 验证。
- 第二步:评估计算资源。如果设备是 CPU 或者内存小,用 SMILES。它对计算友好,字符串短,解析快。相反,如果你有大显存 GPU 且要做图神经网络,那就用分子图。
- 第三步:考虑后处理复杂度。SMILES 和 SELFIES 都需要额外步骤转成分子图才能做能量计算或对接。如果你的验证流程全是基于分子图的,那不如直接用分子图做生成,省一次转换。
- 第四步:想清楚要不要「可解释性」。分子图天生有可解释性——哪个原子、哪个键。SMILES 和 SELFIES 靠解析器。解析器是把字符串转成分子图的过程,这个解析器可能引入额外错误。
避坑指南:我曾经在一个项目中同时用了 SMILES 和分子图做对比。结果发现,同样一个分子,在 SMILES 里因为字符串顺序不同,模型把它当成两个不同的样本。这不是个例——SMILES 的非规范性会导致数据泄露。如果你做对比实验,一定要先规范化为「规范 SMILES」或直接用 SELFIES。
好了,三种分子表示方法的核心逻辑和选择思路就是这些。你理解了这些,后面看各种质量指标(有效性、唯一性、新颖性等)时就知道它们到底是基于「字符串」还是「图」来计算的。这一点非常关键,因为不同表示下的「有效」定义是不一样的。