1. SMILES 简介与化学语言基础
说起 SMILES,可能有人觉得它只是串字符,但在我眼里它简直就是分子的「身份证号」。当年我第一次接触它,就被这种用一行文本描述三维结构的能力震住了——说白了,SMILES 就是化学家写给计算机看的分子速记法。
1.1 为什么需要 SMILES?
做药物发现的人都知道,我们天天跟分子结构打交道。早期存结构要么画图,要么用 mol 文件,但都不方便做序列化处理。我参与过一个虚拟筛选项目,需要把 300 万个小分子拿去跑模型,如果用文件格式传,光 IO 就卡死你。用 SMILES 就不一样了,一行字符串,轻量、可哈希、可拼接,简直是给 ML 喂数据的天然格式。
简单说,SMILES(Simplified Molecular Input Line Entry System)是一套规则,它把原子、键、分支、环、立体构型全部编码成 ASCII 字符。你想想看,一个CC(=O)O 就知道是乙酸,多直观。
1.2 原子表示
SMILES 的原子表示很直接:
- 有机元素:直接写元素符号,如 C、O、N、S。碳默认是 sp³ 饱和,但我个人习惯在写杂原子时一定检查化合价,否则容易闹笑话——我曾有个同事把
CN写成C#N,结果氰根变成了胺,这个错误让模型训了三天才发现,嗯,教训深刻。 - 方括号表示非有机原子:比如 [Na]、[Cl-]、[Fe+2]。带电荷、同位素、手性标记都必须放方括号里。
- 芳香碳:小写 c 表示苯环上的碳。我刚开始老搞混大小写,后来养成了习惯:看到环里是 c 就默认为芳香,C 是脂肪碳。
from rdkit import Chem; m = Chem.MolFromSmiles(s) 就能快速排雷。1.3 键的类型
键的表示也很简单直白:
| 符号 | 键型 | 示例 |
|---|---|---|
| - | 单键 | C-C(实际上可省略,直接写 CC 也行) |
| = | 双键 | C=O |
| # | 三键 | C#N |
| : | 芳香键 | c1ccccc1(自动推断) |
注意,单键通常省略不写,比如乙醇 SMILES 是 CCO 而不是 C-C-O。在我做数据清洗时,遇到过一些不规范写法把单键全写上了,其实也能解析,但会增大序列长度,建议标准化时去掉不必要的减号。
1.4 分支与括号
分支用圆括号表示。括号里的原子表示连接在前一个原子的侧链上。举个例子:
CC(C)C # 异丁烷,中间C连接一个甲基分支
C(C)(C)C # 新戊烷,中心C连接三个甲基
CCOC(=O)C # 乙酸乙酯,括号内是羰基的双键分支
我曾在处理一个大环分子时,括号层级嵌套到 5 层,肉眼根本读不出来。后来我写了个递归遍历函数帮自己检查括号匹配——相信我,用任何编程语言写个简单的括号栈校验,都能省掉你手动排查的几小时。
1.5 环的表示
环是 SMILES 最巧妙的发明之一。它用数字标记前后两个连接点,表示成环:
C1CCCCC1 # 环己烷,数字1标记两个环连接点
c1ccccc1 # 苯环,六个芳香碳组成环
C1=CC=CC=C1 # 1,3-环己二烯,双键与单键交替
环数字的规则:每个数字必须成对出现;若一个分子有多个环,不能重复使用相同数字(除非是相互作用的环,通常用 % 扩展,如 C%12%)。
CanonSmiles 标准化才解决。1.6 知识体系总览
下面这张图把 SMILES 的核心组成串了起来:
1.7 一个完整的例子:阿司匹林
看个真实分子——阿司匹林(乙酰水杨酸)的 SMILES 是:
CC(=O)Oc1ccccc1C(=O)O
拆解一下:
CC(=O)O— 乙酰基部分:C-C(=O)-Oc1ccccc1— 苯环,1 标记成环C(=O)O— 羧基连接在苯环上
我当年最开始读这个串的时候,要看半天才捋清楚连接关系。后来用 RDKit 绘制结构图,边看边拆,很快就习惯了。现在看到任何长度<200 的 SMILES,几乎能下意识画出结构。
Chem.MolToSmiles(mol, canonical=True) 是首选工具。1.8 容易踩的坑
- 忘记方括号:有机物中的非有机元素(如Cl, Br)要写 [Cl], [Br],不能直接 Cl(会被解析成碳+氮)——我曾经把氯代烷写成 ClCC,结果模型当成了 C l C C,训出来的性质完全不对。
- 环数字顺序错乱:一个分子有多个环时,数字必须按出现顺序分配。RDKit 的 canonical 化能自动重排,但如果你自己手动写 SMILES,务必遵守规则。
- 氢原子显式与隐式:SMILES 默认省略碳上的氢,但季铵盐或带电荷的氮必须显式写成 [NH4+] 。我之前处理一批胺类化合物时,没注意质子化状态直接扔进模型,结果 pKa 预测全乱了。
好了,这一节就是这样。SMILES 说简单很简单,说到底就是一套用 ASCII 字符编码分子结构的规则。但要想在实际应用中少掉坑,理解它的底层逻辑比你背一百条规则管用。我强烈建议你拿几个自己熟悉的分子,手写 SMILES 然后在 RDKit 里来回转换,很快就门清了。