第二章 · 2.2

2.2 SMILES:用一行文本写出分子

SMILES: Molecules as Text
SMILES 用一行字符写出一张分子图:挑一个原子起步,沿键深度优先遍历,分支入括号、环边拆成配对数字。本节从这一设计思想出发,逐级拆解原子、键、分支、环号与芳香小写的语法及省略推断,讨论手性与双键构型的编码,分析一物多写的组合爆炸、canonical SMILES 的规范化算法与跨工具局限,并说明语法有效性与环号长程依赖给序列模型带来的两重约束。

2.2.1 设计思想:把一张图读成一行字

2.1 节解决了"分子在内存里长什么样",本节解决"怎么把它写出来"。交换、入库、喂给序列模型,都要一维文本。SMILES(simplified molecular input line entry system)(Weininger, 1988)的回答直截了当:在分子图上挑一个原子起步,沿一条键走到下一个原子,再沿键继续;走不动了就回头换路,遇到岔口就先把旁支走完。把沿途的原子与键依次记成符号,就得到一行字符串。这是一次深度优先遍历(depth-first traversal):主干连成主链,旁支写进括号,走到已访问过的原子时说明碰上了环。二维图压成一维串,靠的不是压缩技巧,而是遍历——不妨称之为"图的语言化"。

遍历与图论的对应可以用生成树说清。对连通分子图 G=(V, E) 做深度优先遍历,首次到达每个新原子所经的 |V|−1 条边构成一棵生成树(spanning tree);其余的边都是回边——轮到它们时两端都已访问,无法再"前进"。SMILES 的处理是把每条回边断开:在第一次到达的原子旁记一个数字,行进到另一端时再记同一个数字,这对数字即环号(ring-closure digit),解析时照号连边。要断开的回边数由图本身决定:

μ = |E| − |V| + 1
(2.2-1)连通图的独立环数(cyclomatic number):生成树占去 |V|−1 条边,每条回边配一对环号。阿司匹林 |V|=|E|=13,μ=1,只需一对环号;萘 μ=2;甾体四环骨架 μ=4。环号数量是分子的图论属性,与怎么写无关。

由此看清 SMILES 的定位:它是描述语言,不是编号。同一分子有许多合法写法——起点任选、次序任选、断口任选;合法性不带来唯一性。这与 InChI 的定位互补:InChI 是 IUPAC 主持制定的标识符,算法写进标准,任何实现都应给出同一串(Heller et al., 2015)。SMILES 内部的唯一性靠各工具自己的规范化算法解决(Weininger et al., 1989);跨工具的一致性,至今仍要借助 InChI 或以 InChI 为中介的"通用 SMILES"方案(O'Boyle, 2012)。分工由此清楚:描述与输入用 SMILES,对账与去重用 InChI。

还需确立一个观念:读 SMILES 与写 SMILES 是同一趟遍历的两个方向。读串时,遇到原子符号就建一个节点,遇到键符号或紧邻关系就连一条边;左括号把当前原子压栈,右括号弹栈回位;数字找到同号的未闭合者即连边。写串规则与读串规则严格互逆——"语言"的含义正在于此:一套语法对读写双方同时生效。

2.2.2 原子与键:能省则省,必须明示处明示

原子的写法分两档。第一档是裸写:有机子集(organic subset)的十种元素——B、C、N、O、P、S、F、Cl、Br、I——直接写元素符号,氢从不出现,个数由价规则从连接关系推出(2.1.3 的隐式氢;允许价见表 2.1-1)。乙醇写作 CCO,三个符号、两条隐式单键,氢由读者补齐。第二档是方括号:有机子集之外的元素([Na+])、带形式电荷([NH4+])、标同位素([13C])、显式给氢计数或手性的原子,必须连同全部属性写进方括号,属性次序固定:同位素–元素–手性–氢计数–电荷。方括号是"退出默认价态"的显式声明。吡咯的芳香氮带氢,超出隐式推断的范围,必须写作 [nH],整个分子 c1cc[nH]c1。

键符号有五种:-(单键)、=(双键)、#(三键),以及方向键 / 与 \(2.2.4 专述)。省略约定:相邻两个原子符号之间不写键符号时,解释为"单键或芳香键中合法的那一个";= 与 # 永远不能省略,方向键也不在省略之列。点号 . 表示两个片段不相连,用于盐与混合物,如 [Na+].[Cl-]。显式的 - 几乎总是冗余:C-C-O 与 CCO 解析出同一张图。

注记

省略键的推断规则。相邻原子 A、B 之间省略键符号时,解析器两步推断:① A、B 均为小写芳香原子,取芳香键;② 否则取单键,随后交由价态检查裁决,推断结果使任一端超价即整体失败。两个例子对照:c1ccccc1 的环上键全部省略,解析为六条芳香键,合法;C#N 的 # 省略不得——省了就成单键,串 CN 指向另一个分子(甲胺对氰化氢)。省略的前提是不产生歧义:只有"省掉不改变分子"的键才可以省,规则只放行无信息损失的情形。

2.2.3 分支、环号与芳香表示

分支。遍历到一个原子的第二个及以后的邻居时,旁支整体写进括号:左括号记住当前原子,括号内的字符串自成一次完整遍历(可以嵌套),右括号回到分岔原子继续主干。CC(=O)O 中的 (=O) 就是一次绕行——从羰基碳出发访问氧再返回。括号的语义是"绕行—返回",跨度始终局部:进出括号之间就是一次小规模的遍历往返。

环号。写环时任选一条边作断口:起点原子缀数字开号,行进到断口另一端再缀同一数字闭号,解析时补连这条边。数字 1–9 可复用,闭合即释放;同时张开的环号超过九个时启用两位记法 %10、%11 等;回边的键级可缀在数字上,环己烯可写 C=1CCCCC1。断口选哪条边是自由的——这是"一物多写"的又一来源。图 2.2-1 把阿司匹林的字符串逐段对照到分子片段;图 2.2-2 把整条串回放成图,环号配对与分支绕行一目了然。

阿司匹林 CC(=O)Oc1ccccc1C(=O)O 的三个片段:乙酰氧基、苯环与羧基,环号 1 断开苯环左侧一条边 C C O O c c c c c c C O O H 0 1 2 3 10 11 12 1 1 环号 1 补上的边 CC(=O)O 乙酰基+酯氧(原子 0–3) c1ccccc1 苯环(原子 4–9),断口配环号 1 C(=O)O 羧基(原子 10–12) 换起点、换次序仍是合法写法—— 合法性不等于唯一性(见 2.2.5) CC(=O)Oc1ccccc1C(=O)O
图 2.2-1 阿司匹林 CC(=O)Oc1ccccc1C(=O)O 的逐段对照。上标数字为原子编号:主链从甲基(0)经羰基(1)、酯氧(3)进入苯环,小写 c 标记芳香原子;环的两个 1 标记断开的那条环边(虚线),环号在解析时把它补回;羧基(10–12)接在闭环原子上。氢全部隐含,由价规则推出。
C C ( = O ) O c 1 c c c c c 1 C ( = O ) O 0 1 2 3 4 5 6 7 8 9 10 11 12 CC(=O)Oc1ccccc1C(=O)O 的 21 个字符逐个回放:原子编号、分支绕行与环号 1 的长距离配对 开环号 闭环号 把串从头到尾读一遍=重建一张图(原子编号与图 2.2-1 一致) 环号 1:两端相隔 4 个原子(5–8) 环边被拆成两枚数字,闭合之前必须记住它 = 绕行后返回 = 0 1 2 3 4 5 6 7 8 9 10 11 12 分支括号的跨度是局部的;环号配对的跨度可达半条串。 序列模型必须带着"未闭合环号"前进——这是 2.2.7 的主题。
图 2.2-2 把 CC(=O)Oc1ccccc1C(=O)O 回放成图。上排为 21 个字符(深色为原子符号,浅色为括号与键符号,填色数字为环号),下方为遍历路径:原子按出现次序编号(与图 2.2-1 一致);(=O) 两处分支绕行后返回主干(灰箭头);虚线弧是环号 1 补上的环边,连接原子 4 与原子 9,中间隔着原子 5–8。

芳香表示。芳香原子小写:c、n、o、s 等。苯的 c1ccccc1 与凯库勒式 C1=CC=CC=C1 描述同一分子——2.1.4 已说明两种写法经 sanitize 收敛到同一内部态:凯库勒化验证交替单双键可以指派,芳构化感知再把环系折叠回芳香标记。小写约定让环上六条边在数据上保持等价,省去"双键画在哪"的无谓区分;代价是解析器必须自己完成芳构化判定,假芳香(不满足判据的小写声明)会在清洗时报错。小写原子必须处在芳香体系内,孤立的小写原子无法通过解析(Daylight Theory Manual)。

习题 2.2-1

对乙酰氨基酚(扑热息痛)是苯环对位分别接乙酰氨基与羟基的化合物。(1) 写出它的 SMILES,标出环号在哪两个原子之间配对;(2) 解释乙酰氨基与羟基的对位关系如何在字符串中体现;(3) 再给出一条"换起点"的合法写法,说明两条串为何解析出同一个分子。

参考解答

(1) CC(=O)Nc1ccc(O)cc1。主链 C–C(=O)–N 进入苯环:接 N 的环原子缀 1 开号,沿环走三个 c,第四个环原子以 (O) 分出酚羟基,再两个 c 缀 1 闭号;环号 1 配对的是首末两个环原子,这对原子在环上相邻。(2) N 挂在开环原子上,O 挂在从开环原子数起的第四个环原子上,沿环相隔三条边,恰为 1,4-位即对位;开环与闭环原子相邻这一事实,把"环走了一圈"编码进了两枚数字。(3) 例如 Oc1ccc(NC(C)=O)cc1,从酚羟基起步反向进入。两条串的遍历次序不同,但逐字符回放得到的边集相同,解析后的 Mol 对象相同——写法不唯一,分子唯一;两条串经 MolToSmiles 会收敛到同一规范串(2.2.5)。

2.2.4 立体化学:视角与方向

平面语法到此已经够写任何连通的分子图,但分子是三维的。SMILES 编码两类立体信息:四面体手性中心与双键构型。两者的共同设计取向是不记录绝对坐标,只记录相对关系,而且参照系由遍历次序决定。

手性标记 @ 与 @@。方括号原子内的 @ 与 @@ 指定四面体构型,语义是"观察视角":观察者站在前一原子——串中紧挨在手性中心之前出现的原子——的位置看向中心,其余配体按它们在串中的出现次序排列;逆时针记 @,顺时针记 @@。L-丙氨酸 N[C@@H](C)C(=O)O:站在 N 的方向看,H→CH₃→COOH 顺时针,故记 @@。同一分子换起点或换次序重写,视角随之改变,@ 与 @@ 可能互换——手性标记不是分子的绝对属性,是"分子加遍历"的联合属性。图 2.2-3 左侧给出该例的视角标注。

方向键 / 与 \。双键构型靠方向键表达:/ 记录左低右高的倾斜,\ 记录左高右低。方向键写在双键两侧的单键上,两端的方向符号给出取代基的相对几何:同向为反式(E),异向为顺式(Z)。二氟乙烯的两个构型:F/C=C/F 为 E,F/C=C\F 为 Z。方向键必须成对出现在双键两侧才有意义,且不可省略——省略即丢弃构型信息,双键退化为"不指定构型"。

左:L-丙氨酸 N[C@@H](C)C(=O)O 的手性视角语义;右:方向键 / 与 \ 对双键顺反的编码 手性标记:视角由遍历次序决定 C * N 前一原子=视角起点 H [C@@H] 内 C CH₃ C COOH N[C@@H](C)C(=O)O 从 N 方向看,H→CH₃→COOH 顺时针 → @@ 方向键:双键两侧的相对几何 C C F F F/C=C/F 两端同向 → E(反式) C C F F F/C=C\F 两端异向 → Z(顺式) /:左低右高 \:左高右低
图 2.2-3 立体化学编码的两种语义。左:手性标记的参照系——从前一原子(N)看向中心,配体按串中次序排列,顺时针记 @@;换个起点重写,@ 与 @@ 可能互换。右:方向键 / 与 \ 记录双键两端单键的倾斜方向,同向为 E、异向为 Z。两者都只记相对关系,不记坐标。

2.2.5 一物多写与 canonical SMILES

起点、次序、断口、分支嵌套都自由,写法数量随之爆炸。考虑两个极端情形:n 个原子排成链的路径图,任选起点之后,每一步向已写出片段的左端或右端添加原子,原子次序共有 2n−1 种;一个中心接 n−1 个分支的星形图,分支次序可以任意排列,写法数达 (n−1)!。n=20 的星形图已有约 1017 量级的合法写法(尚未计入括号嵌套与键符号的差别)。合法写法是天文数字,"哪条串代表这个分子"必须有确定答案,否则字符串无法当键使用。

N(Pn) = 2n−1, N(Sn) = (n−1)!
(2.2-2)Pn:n 原子路径图。给原子编号 1…n,n=3 时四种合法次序为 123、213、231、321——每个新原子必须与已写出的片段相邻。Sn:中心加 n−1 个分支的星形图,分支排列任意。两者都只是"原子次序"的自由度,键符号与括号结构的自由度尚未计入。
定义

规范 SMILES(canonical SMILES)。同一分子的全部合法写法中,由一个确定性算法选出的唯一代表串。要点有二:其一,唯一性是算法内部的——同一算法对同一分子(同一内部图)给出同一串,与输入写法无关;其二,确定性指不依赖随机性。规范 SMILES 不是全局标准:不同工具、甚至同一工具的不同版本,都可能给出不同的规范串。

Weininger 的规范化算法 CANGEN 分两步走(Weininger et al., 1989)。

方法

CANGEN:先分等价类,再定全序。第一步,为每个原子计算初始不变量(invariant)——元素、形式电荷、质量数、氢计数、连接度、环隶属等属性组成的元组——并据此给出原子的初始等价类划分。第二步,迭代细化:每个原子的类别由"自身不变量+邻居的当前类别"重新计算,重复到划分不再变化(Morgan 式的逐层传播,与 2.5 节的指纹同源);仍并列的等价类由确定性的树搜索依次打破,得到原子的全序。最后按全序做深度优先遍历,输出唯一的串。等价类同时标记了对称性:完全等价的原子互换不产生新写法,这正是把组合爆炸折叠掉的机制。

算法内部一致不等于跨工具一致。初始不变量选哪些属性、细化到什么程度、并列怎么打破,各家实现各有选择,最终串随之不同。规范 SMILES 解决"本工具内的唯一性",解决不了"跨工具的一致性"。

警示

规范串不是对账钥匙。用规范 SMILES 跨数据库去重是常见事故源:两边工具不同或版本不同,同一分子得到两个规范串,去重静默失效,没有任何报错。稳妥做法:跨工具的一致性交给 InChI 与 InChIKey——算法由标准固定,各实现给出同一串(Heller et al., 2015);或以 InChI 为中介生成"通用 SMILES"(O'Boyle, 2012)。库内主键可以用本工具的规范串,但应记录生成工具与版本,升级后须全量重算。

下面用 RDKit 印证"多条写法收敛到同一规范串":同一阿司匹林,一条从甲基起步,一条从羧酸起步,规范化后字面全同。

from rdkit import Chem

w1 = Chem.MolFromSmiles("CC(=O)Oc1ccccc1C(=O)O")   # 阿司匹林:从甲基起步
w2 = Chem.MolFromSmiles("OC(=O)c1ccccc1OC(C)=O")   # 同一分子:从羧酸起步的另一遍历
print(Chem.MolToSmiles(w1) == Chem.MolToSmiles(w2))  # True —— 规范化收敛
print(Chem.MolToSmiles(w1))                           # CC(=O)Oc1ccccc1C(=O)O
习题 2.2-2

(1) 论证:不使用任何环号,能否写出环丙烷?(2) 给出环丙烷的三种合法 SMILES,并逐一验证三者解析出的边集相同。(3) 以 C1CC1 为基式,"任选起点(3 种)× 任选断口(3 种)"共 9 种组合,为何只对应一个字符串?

参考解答

(1) 不能。无环号的写法只有主链与分支,两者都是树;环丙烷有三条边、三个原子,μ = 3 − 3 + 1 = 1(式 2.2-1),那条回边必须靠一对环号补记,缺了环号就只剩两条边。(2) C1CC1:主链 0–1–2,环号闭合 2–0;C(C1)C1:分支 0–1、主链 0–2、环号闭合 1–2;C1(CC1):分支 0–1、分支内主链 1–2、环号闭合 2–0。三者边集同为 {01, 02, 12},解析出同一个三元环。(3) 三个碳同种、同价态,三条边同型;任何"起点×断口"组合写出的串字面完全相同——写法多样性被原子对称性吞掉了一部分。规范 SMILES 算法中的等价类划分正是这一现象的算法化:完全等价的原子互换不产生新串。

2.2.6 合法性:不是每个字符串都是分子

SMILES 是形式语言:语法对字符串给出强约束。随机字符序列几乎必然非法——括号不配对、环号找不到配对、元素符号不存在、方括号属性排列有误。语法之上还有化学层:价态、凯库勒化与芳构化检查(2.1.4)。两层失败的表现都是"解析拿到 None",但原因不同:语法失败发生在解析器,价态失败发生在 sanitize;排查数据问题时先分层,再谈修复。

这对生成模型有直接含义。把分子生成当作"学一门语言":模型逐字符采样,语法约束并不会自动生效——采样出的串可能括号不配、环号不闭、价态不通,成为废句。自由采样的 SMILES 语言模型确有可观比例的无效输出(具体数值随模型与数据集差异很大),这既是算力与样本的浪费,也是分布偏差:废句集中在模型掌握不牢的结构区域,静默剔除会让训练分布与评测分布悄悄分叉。对策有三类:语法约束解码、把语法编进模型结构,或者换掉表示本身——4.2 节的图生成模型逐个原子、逐条键地搭建分子,动作空间天然受限,"非法字符串"这一失败模式从根上消失。字符串范式与图范式的取舍,到第 4 章展开。

下面一段代码印证语法层的拦截:三条废句都在解析入口返回 None,根本走不到价态检查。

for s in ["c1ccccc", "C1CC", "C(C(C(C1"]:   # 环号未闭 / 环号未闭 / 括号不配对
    m = Chem.MolFromSmiles(s)
    print(s, "解析结果:", m)               # 三者皆 None:语法层即告失败
# 语法检查先于价态检查;无效串在入口被拦截,不会进入任何下游计算
习题 2.2-3

判断下列字符串能否解析为分子,指出失败发生在语法层还是化学层:① c1ccccc;② C1CC;③ C(C(C(C1;④ CC(=O)Oc1ccccc1C(=O)O;⑤ O=C(C)(C)(C)C。并回答:若这些串来自某个生成模型的输出,评测程序应当如何处置?

参考解答

① 环号 1 未闭合(芳香原子也不足六元环),语法层失败。② 环号 1 未闭合,语法层失败。③ 三层括号只闭了两层且环号未闭,语法层失败。④ 阿司匹林,合法,通过价态与芳构化。⑤ 羰基碳带双键氧与四个碳取代基,价数 6,语法层通过、价态层失败。评测程序必须先解析、剔除返回 None 的输出,并统计无效比例作为模型指标之一;直接把废句计入样本量或性质均值,会同时污染效率指标与化学指标(2.1.4 的早失败原则)。

2.2.7 长程依赖:环号的隐性代价

回到图 2.2-2 的回放。第二枚"1"必须与第一枚"1"配对,中间隔着四个原子、十几个字符;环号把串中相距很远的两个位置强行绑定,配对错一个位置,要么非法,要么变成另一个分子。价态约束同样非局部:分支括号要求栈式记忆,氢计数依赖此前出现过的全部键。串的下一个字符是否合法,取决于远处的历史——这就是长程依赖(long-range dependency)

长程依赖是 SMILES 对语言模型的隐性难度。循环网络要维护"未闭合环号"的寄存器状态,跨长距离保留信息正是其弱项;Transformer 用注意力直接连接远端位置,缓解了记忆问题,代价是数据需求。依赖的规模随环系增长:环号对数等于 μ(式 2.2-1),一个四环甾体骨架至少要四对环号先后或同时张开,多环并合时两位环号 %10 也会登场。图模型没有这道坎——边是一等公民,环就是一个环,无须拆成两枚数字再记住配对。生成范式从字符串迁往图(4.2 节),语法有效性与长程依赖是两条方法论理由;但字符串的简洁、成熟的工具链与海量存量数据仍在,两条路线的实证比较留给第 4 章。

收束本节。SMILES 用极小的字符集达成对分子图的完整覆盖:原子两档写法、五种键符号、括号与数字两个结构记号,加上立体语义,一行文本即可交换任意有机分子。它的两个固有代价——写法不唯一与序列上的长程依赖——分别由规范化算法与图表示回应。下一节把同一套语法从"写一个分子"扩展到"写一类分子":SMARTS 与子结构匹配。


关键术语

SMILES (simplified molecular input line entry system)
把分子图沿深度优先遍历写成一行的描述语言;合法写法不唯一。
深度优先遍历 (depth-first traversal)
沿一条路径走到头再回溯换路的图遍历策略,SMILES 主链与分支的来源。
生成树 (spanning tree)
连通图的 |V|−1 条边构成的覆盖全部节点的树;深度优先遍历的主干。
独立环数 (cyclomatic number)
μ = |E| − |V| + 1,等于需要断开的回边数即环号对数。
有机子集 (organic subset)
可裸写元素符号且氢隐含的十种元素:B、C、N、O、P、S、F、Cl、Br、I。
环号 (ring-closure digit)
断开环边时在两端原子缀记的配对数字,解析时照号连边。
手性标记 (@ / @@)
相对前一原子视角的配体排列方向编码,随遍历次序改变符号。
方向键 (/ 和 \)
记录双键两端单键倾斜的符号,成对使用给出 E/Z 构型。
规范 SMILES (canonical SMILES)
由确定性算法从全部合法写法中选出的唯一代表串,唯一性仅限算法内部。
规范化 (canonicalization)
生成规范串的过程:初始不变量划分、迭代细化、择优定序三步。
InChI (IUPAC International Chemical Identifier)
算法由标准固定的化学标识符,跨工具一致,弥补规范 SMILES 的分歧。
长程依赖 (long-range dependency)
序列中远距离位置相互约束的现象;环号配对是其典型来源。

参考文献与延伸阅读

  1. Weininger D. 1988. SMILES, a chemical language and information system. 1. Introduction to methodology and encoding rules. Journal of Chemical Information and Computer Sciences 28:31–36.
  2. Weininger D, Weininger A, Weininger JL. 1989. SMILES. 2. Algorithm for generation of unique SMILES notation. Journal of Chemical Information and Computer Sciences 29:97–101.
  3. O'Boyle NM. 2012. Towards a universal SMILES representation — a standard method to generate canonical SMILES based on the InChI. Journal of Cheminformatics 4:22.
  4. Heller SR, McNaught A, Pletnev I, Stein S, Tchekhovskoi D. 2015. InChI, the IUPAC International Chemical Identifier. Journal of Cheminformatics 7:23.
  5. Daylight Chemical Information Systems. SMILES — A Simplified Chemical Language. Daylight Theory Manual.
  6. Landrum G, et al. 2026. RDKit: Open-Source Cheminformatics. RDKit 官方文档(Getting Started · RDKit Book),2026.03 系列.