1. SMILES 简介:定义、历史与应用场景

做化学信息学,绕不开一个东西:SMILES。

我第一次接触这玩意儿是刚入行那会儿。导师丢给我一个数据集,说“你把这里面分子的指纹算一下”。我打开一看,全是那种看起来像乱码的字符串——什么 CCO、c1ccccc1、O=C(O)c1ccccc1O。我当时是懵的。化学分子怎么能用字符串表示?

后来我才发现,这东西比我想象的厉害得多。

1.1 什么是 SMILES?

SMILES 的全称是 Simplified Molecular Input Line Entry System,翻译过来就是“简化分子线性输入规范”。说白了,它是一种用 ASCII 字符串来描述分子结构的方法。

你想想看,一个有机物分子,我们可以画成结构式,也可以在电脑里存成连接表。但这些都太“重”了。而 SMILES 就一行文本,轻量、可读、容易存储。

举个例子:乙醇的化学式是 C₂H₆O,结构式是 CH₃CH₂OH。SMILES 怎么写?

CCO

这就是乙醇的 SMILES。三个字符,搞定。C 表示碳,O 表示氧,单键默认连起来。就这么简单。

核心思想:SMILES 用深度优先遍历的规则,把分子图“拉”成一条线性的字符串。原子是节点,键是边,遍历规则决定了这个字符串长什么样。

1.2 我跟 SMILES 的第一次“翻车”

讲个我踩过的坑。最开始写 SMILES 解析脚本时,我遇到一个分子,苯环。我以为 SMILES 里苯只能写 C1=CC=CC=C1。后来同事看了一眼我的代码,说:

“你写 c1ccccc1 就行了,小写 c 代表芳香碳,不用双键符号。”

我当时脸都红了。原来 SMILES 对芳香性的支持是内置的。大写原子符号表示脂肪族,小写表示芳香族。这个细节我记到现在。

避坑指南:

  • 大小写不要写错。C 是脂肪碳,c 是芳香碳,两个完全不同的原子类型。
  • 数字是分支标记,不是索引。比如 C1CC1 表示三元环,不是编号。
  • 方括号 [ ] 用来表示非标准价态或者同位素,比如 [NH4+]、[13C]。

1.3 SMILES 的历史:从 1980 年代走来

SMILES 不是我发明的,是 David Weininger 在 1980 年代搞出来的。那时候还没有今天的 RDKit、Open Babel 这些工具。Weininger 在 US Environmental Protection Agency(EPA)工作,需要一种简单的方法来输入和存储分子结构。

时间 事件
1988 Weininger 发表 SMILES 原始论文,定义了基础语法
1990s Daylight 化学信息系统公司实现商业化 SMILES
2000s 开源工具(Open Babel、RDKit)开始支持 SMILES
2007 InChI 作为 IUPAC 标准出现,但 SMILES 依然占据主流
至今 SMILES 成为化学信息学领域的“通用语言”

为什么它能力压其他格式活到现在?我个人的看法是:刚好够用,而且够轻。MOL 文件繁琐,InChI 太冗长,SDF 文件太大。而 SMILES 一行搞定,存数据库、发邮件、做 API 传参都方便。

1.4 SMILES 能做什么?应用场景一览

在我经手的项目中,SMILES 几乎无处不在。我列几个典型的场景:

  • 数据库存储: PubChem、ChEMBL、DrugBank 等大型化学数据库都用 SMILES 来索引分子。查询时直接字符串匹配,比查连接表快得多。
  • 分子输入: 用户不需要画结构式,直接输入一行 SMILES 就能做计算。比如用 RDKit 做分子相似度。
  • 分子过滤: 对 SMILES 做正则匹配或子结构搜索。我曾经用这种方法快速筛掉含有毒性基团的候选分子。
  • 机器学习和深度学习: 很多分子图神经网络(GNN)的输入就是从 SMILES 解析出来的分子图。这是我后面会重点讲的内容。
  • 化学反应建模: 用 SMARTS(SMILES 的变体)来定义反应模板。

一个真实例子:

我在做药物虚拟筛选时,每天要处理上百万个分子。如果存成 SDF 文件,硬盘吃不住。改成 SMILES 后,一个文件几十 MB,内存里也能轻松做子结构匹配。速度提升至少一个数量级。

1.5 SMILES 的“坑”与注意事项

你说 SMILES 完美吗?不完美。它有一个绕不开的问题:非唯一性。

同一个分子,不同的人或者不同的工具,可能生成不同的 SMILES。比如甲苯可以有:

Cc1ccccc1
CC1=CC=CC=C1
c1ccc(C)cc1

这三个都是甲苯。你看着知道是同一个分子,但机器做字符串比较时就傻了。

重要提醒: 永远不要直接用字符串相等来判断两个 SMILES 是否代表同一分子。一定要先做标准化(Canonicalization)。RDKit 的 Chem.CanonSmiles() 就是干这个的。

另一个坑是异构体。双键的顺反、手性中心的 R/S,如果不明确写出,SMILES 默认是不指定的。比如:

C/C=C/C   # 反式-2-丁烯
C/C=C\C   # 顺式-2-丁烯

当年我有一个项目,就因为忽略了正反斜杠的差异,导致筛选出来的分子活性分布完全错了。复盘之后,我在所有 SMILES 处理流程里都加了立体化学检查。

1.6 从 SMILES 到分子图:为什么需要转换?

回到我们这个课程的核心问题:为什么要把 SMILES 转成分子图?

计算机是笨的。给它一行字符串 “CCO”,它不知道乙醇长什么样。但如果我们把 SMILES 解析成一个图结构——原子是节点,化学键是边——计算机就可以做很多事:计算分子量、找环、做子结构匹配、喂给图神经网络。

这张图就是连接 SMILES 世界和计算化学世界的桥梁。

SMILES 到分子图转换逻辑 SMILES → 分子图转换逻辑 SMILES 字符串 CCO / c1ccccc1 解析 SMILES 解析器 栈 + 标记化 构建 分子图 节点 + 边 核心步骤 1. 标记化(Tokenize) 拆出原子符号、括号、数字 2. 拓扑构建 用栈处理分支和环 3. 后处理 芳香性、立体化学、价态 最终产出:原子节点 + 边列表 → 可用于图神经网络或子结构搜索 例如:C-C 单边 / C=C 双边 / c:c 芳香边 / C1...1 环边

看看上面的流程你就明白了。SMILES 传入解析器,经过标记化、拓扑构建和后处理三步,最终输出一张完整的分子图。后面我们会详细讲每一步的实现细节。

1.7 小节:一点个人感受

讲了这么多,其实我想说的是:SMILES 是一个被严重低估的格式。它看起来只是一串文本,但背后承载了整个化学信息学的基础设施。

我个人的习惯是,每接到一个新项目,不管用什么工具,第一步就是把 SMILES 的读写和校验流程先搭好。这个基础打好了,后面做分子指纹、子结构匹配、图神经网络什么的才会顺手。

好,这一章就到这里。理清了 SMILES 是什么、怎么来的、能做什么。接下来我们就要写代码了——从零开始解析它。