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。比如括号不匹配、环数字没闭合。你一算有效性,直接归零。这是字符串表示的天生缺陷——语法和化学结构是脱钩的。

我曾经踩过的坑:用 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% 以上。

我个人的建议:如果是做无条件分子生成(比如从随机噪声生成分子),强烈推荐 SELFIES。它的「100% 语法有效性」特性可以让你放心地只关注化学有效性,不用纠结字符串语法。但注意,SELFIES 并不保证「化学稳定性」——你仍然需要能量力场或专业化学验证器。

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 知识体系:三种表示背后的逻辑

下面这张图展示了三种分子表示方法的核心逻辑关系。你看完应该能理解,它们本质上都是对「分子图」不同维度的投影。

分子表示方法知识逻辑图 分子表示方法知识逻辑图 分子图(真实结构) 节点:原子 | 边:化学键 SMILES 字符串 + 语法 深度优先遍历 括号/数字标记环和支链 语法有效 ≠ 化学有效 SELFIES 确定性语法字符串 自引用 + 分支/环编码 100% 语法有效性 天然唯一,可逆性好 分子图(图表示) 邻接矩阵 + 原子特征 天然保留拓扑结构 适合图神经网络 计算开销大 核心逻辑:三种表示是「分子图」的不同投影 1. SMILES: 把图压平成深度优先序列,方便字符串操作和理解。 2. SELFIES: 在 SMILES 基础上保证语法确定性,解决「无效字符串」问题。 3. 分子图: 保留图的完整结构,让模型直接学原子和键的相互作用。 选择建议: 无条件生成 → 选 SELFIES;有条件/引导生成 → 选 SMILES 或分子图; 图神经网络 → 分子图;早期验证 → 用 SMILES 或者 SELFIES 快速迭代。

2.6 实际项目中的选择建议

好,我们回到真实场景。假设你手头有个分子生成项目,你怎么选?

我个人习惯是这样做的:

  1. 第一步:确定任务类型。如果是无条件生成(从噪声生成新分子),我直接上 SELFIES。理由很朴素——你不用担心语法无效,模型想怎么输出就怎么输出,最后再转 SMILES 验证。
  2. 第二步:评估计算资源。如果设备是 CPU 或者内存小,用 SMILES。它对计算友好,字符串短,解析快。相反,如果你有大显存 GPU 且要做图神经网络,那就用分子图。
  3. 第三步:考虑后处理复杂度。SMILES 和 SELFIES 都需要额外步骤转成分子图才能做能量计算或对接。如果你的验证流程全是基于分子图的,那不如直接用分子图做生成,省一次转换。
  4. 第四步:想清楚要不要「可解释性」。分子图天生有可解释性——哪个原子、哪个键。SMILES 和 SELFIES 靠解析器。解析器是把字符串转成分子图的过程,这个解析器可能引入额外错误。

避坑指南:我曾经在一个项目中同时用了 SMILES 和分子图做对比。结果发现,同样一个分子,在 SMILES 里因为字符串顺序不同,模型把它当成两个不同的样本。这不是个例——SMILES 的非规范性会导致数据泄露。如果你做对比实验,一定要先规范化为「规范 SMILES」或直接用 SELFIES。

好了,三种分子表示方法的核心逻辑和选择思路就是这些。你理解了这些,后面看各种质量指标(有效性、唯一性、新颖性等)时就知道它们到底是基于「字符串」还是「图」来计算的。这一点非常关键,因为不同表示下的「有效」定义是不一样的。