1. SMILES简介:从一行字符串读懂分子
我个人觉得,SMILES是化学信息学里最优雅的发明之一。你想想,一个复杂的有机分子,动辄几十个原子,怎么才能让计算机快速理解?SMILES给了答案:一行字符串。
1.1 SMILES的起源
SMILES全称是Simplified Molecular Input Line Entry System。上世纪80年代,David Weininger在USEPA工作时搞出来的。初衷很简单:给分子一个紧凑、可读、能被计算机快速处理的文本表示。
那时候,化学家们还在用连接表记录分子结构。文件又大又丑。SMILES一出来,大家发现——原来写化学式和写单词差不多。
1.2 基本规则
SMILES的规则并不多,但很严谨。我按从简单到复杂来捋一遍。
原子表示
原子直接用元素符号。碳就是C,氧是O,氮是N。有机分子里最常见的几个元素,都不用标数字。
| 原子 | SMILES符号 | 例子 | 注意 |
|---|---|---|---|
| 碳 | C | C (甲烷) | 有机骨架 |
| 氧 | O | O (水) | 羟基或醚键 |
| 氮 | N | N (氨) | 胺或杂环 |
| 氯 | Cl | CCl (氯甲烷) | 双字母,大写开头 |
| 溴 | Br | CBr (溴甲烷) | 同上 |
原子周围默认补足氢。C就是CH₄,O就是H₂O。嗯,这里要注意:写SMILES时不需要写氢,系统会自动补全。
键表示
单键不写符号,直接连原子。双键写=,三键写#。芳香键一般小写原子表示。
# 乙醇
CCO
# 乙烯
C=C
# 乙炔
C#C
# 苯
c1ccccc1
有个坑要记一下:单键虽然不写,但原子排列顺序决定了骨架。我刚开始学的时候总忘记这一点,写出来完全不对。
分支结构
分支用圆括号表示。括号里的原子或基团连在前一个原子上。
# 异丙醇
CC(O)C
# 甲基丙烯酸甲酯
C=C(C)C(=O)OC
括号可以嵌套。复杂分子的SMILES读起来很像Lisp语言的括号堆叠。我曾经有个项目,解析一个天然产物的SMILES,括号嵌套了5层。
环结构
环结构用数字标记开环和闭环的位置。数字本身没有化学意义,只用来配对。
# 环己烷
C1CCCCC1
# 苯
c1ccccc1
# 萘
c1ccc2ccccc2c1
数字可以重复使用,但同一环必须配对。环编号从1开始,原则上不超过9。
避坑指南:我曾经在生成大型稠环分子时,把环编号写错了。结果解析程序直接报错,找了半天才发现是数字重复冲突。记住,同一个数字只能出现两次——开环和闭环。
芳香性
芳香环里的原子用小写字母表示。苯环就是c1ccccc1,而不是C1=CC=CC=C1。后者是Kekulé式,虽然也能解析,但不够规范。
我在做分子指纹项目时发现,使用芳香SMILES生成的指纹比Kekulé式生成的更稳定。主要是因为芳香结构有共振稳定性,小写表示法能捕获这种电子离域特征。
1.3 SMILES的化学意义
SMILES不是随便写的。它背后有一套严格的化学逻辑。
SMILES的图论本质
每个分子本质上是一张图。原子是节点,化学键是边。SMILES就是这张图的深度优先遍历序列。
为什么能这么做?因为有机分子的骨架通常是一棵树(树状结构)加上少量环。遍历起来很自然。
SVG图放在这里,展示一下SMILES如何从分子结构映射到字符串:
SMILES与分子唯一性
同一个分子可以写出多种SMILES。比如乙醇可以是CCO,也可以是OCC。这取决于你从哪个原子开始遍历。
但实际应用中,我们需要标准化的SMILES。也就是规范SMILES。规则很简单:按照一套固定的遍历顺序(如原子序号、连接优先级),保证同一个分子只输出一个SMILES。
个人建议:做数据库存储或分子去重时,一定要用规范SMILES。我在高通量筛选项目中吃过亏——同一个分子存了两条记录,就是因为SMILES不规范。后来统一用RDKit的MolToSmiles函数的规范模式,才彻底解决。
SMILES的拓扑等价性
SMILES能区分不同分子,也能识别等同结构。为什么?因为SMILES的生成过程中隐含了原子和键的拓扑关系。
举个例子:
# 这两个SMILES都表示丙烷,但写法不同
CCC # 正确写法
C(C)C # 等价写法
它们虽然不同,但对应的分子结构完全一样。这就是SMILES的非唯一性,也是它的妥协:为了可读性,牺牲了唯一性。
但规范SMILES会强制选择一种标准写法,比如优先选择原子数更多的直链,或者分支放在较晚的位置。
SMILES在分子生成中的角色
你想想,现在的分子生成模型(像VAE、GAN、Transformer)为什么都用SMILES?说到底,因为SMILES把三维结构压缩成了一维序列。模型做的就是一个序列到序列的映射。
# 药物分子阿司匹林的SMILES
CC(=O)Oc1ccccc1C(=O)O
# 咖啡因的SMILES
Cn1cnc2c1c(=O)n(c(=O)n2C)C
我在训练生成模型时发现,SMILES的长度和分子复杂性高度相关。简单分子大概10-20个字符,复杂天然产物能到几百个字符。这给Transformer的自注意力机制带来了不同的挑战。
核心观点:SMILES不是唯一的表示法,但它是目前分子生成领域最成熟的序列表示。它把化学直觉和计算效率结合得很好。很多后来出来的表示法(如SELFIES、DeepSMILES)本质上都是在SMILES基础上的修正。
1.4 实操中的常见陷阱
学SMILES看着简单,一动手就出问题。我把这些年踩过的坑梳理一下。
坑1:忽略氢饱和度
SMILES不写氢,但要清楚每个原子应该有几个连接键。碳默认4键,氧2键,氮3键(或5键,取决于形式电荷)。写错直接导致分子解析失败。
坑2:环编号重复使用
同一个环编号只能在SMILES里出现两次。如果分子有超过9个环,从第10个环开始就要用两位数字(如%10)。别忘了加百分号。
# 正确使用两位数字环编号
C%10CCCCC%10 # 环编号10
坑3:芳香性检测
不是所有有双键的六元环都是芳香环。芳香性必须满足Hückel规则(4n+2个π电子)。如果你写C1=CC=CC=C1,程序会按Kekulé式解析,但不会自动识别为芳香。
避坑指南:我接手过一个项目,同事把所有六元环都写成了小写c。结果脂肪族环己烷也被当成芳环处理。后来我们强行规定:只有明确是芳香环的才用小写,非芳香环一律用大写。
坑4:手性标记
SMILS支持手性标记。@表示顺式,@@表示反式。这两个符号的朝向和原子连接顺序高度相关。写反了,分子对映体就反了。
# 两种L-氨基酸的SMILES(手性中心用@标记)
N[C@@H](C)C(=O)O # L-丙氨酸
N[C@@H](Cc1ccccc1)C(=O)O # L-苯丙氨酸
1.5 本章小结
SMILES看起来简单,但内涵丰富。它用最少的字符,表达了最完整的分子结构。你只需要理解:原子、键、分支、环、芳香性、手性。这六个核心概念,掌握了就能写出几乎任何有机分子的SMILES。
我建议你多写几个分子的SMILES练手。随便找个分子结构图,试着写写看。写错了不要紧,解析程序会告诉你哪里出问题。这种反馈是最好的老师。