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 是脂肪碳。
使用 RDKit 验证 SMILES 合法性是个好习惯。一行
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%)。

我踩过的坑:环数字排序不能乱。比如有两个环,一个用 1,另一个用 2,但如果你把第一个环的第二次出现数字写成了 2,机器不会报错,实际上会创建错误连接。我的一次虚拟筛选结果烂了一半就是因为这个,后来强制用 RDKit 的 CanonSmiles 标准化才解决。

1.6 知识体系总览

下面这张图把 SMILES 的核心组成串了起来:

SMILES 核心组成 SMILES 分子描述结构 分子编码 原子符号与类型 C, O, N, [Na+], c 化学键 单键 -、双键 =、三键 # 分支与括号 CC(C)C 环结构 数字标记:C1CCCCC1 手性与立体化学 @ / @@ / / 和 \ 芳香性标记 小写字母 c、n、o 💡 核心要点 SMILES = 原子 + 键 + 分支 + 环 + 立体/芳香信息

1.7 一个完整的例子:阿司匹林

看个真实分子——阿司匹林(乙酰水杨酸)的 SMILES 是:

CC(=O)Oc1ccccc1C(=O)O

拆解一下:

  1. CC(=O)O — 乙酰基部分:C-C(=O)-O
  2. c1ccccc1 — 苯环,1 标记成环
  3. C(=O)O — 羧基连接在苯环上

我当年最开始读这个串的时候,要看半天才捋清楚连接关系。后来用 RDKit 绘制结构图,边看边拆,很快就习惯了。现在看到任何长度<200 的 SMILES,几乎能下意识画出结构。

在实际项目中,SMILES 处理的第一步永远是 标准化:去除多余括号、统一环数字、转化为规范形式。RDKit 的 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 里来回转换,很快就门清了。