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 传入解析器,经过标记化、拓扑构建和后处理三步,最终输出一张完整的分子图。后面我们会详细讲每一步的实现细节。
1.7 小节:一点个人感受
讲了这么多,其实我想说的是:SMILES 是一个被严重低估的格式。它看起来只是一串文本,但背后承载了整个化学信息学的基础设施。
我个人的习惯是,每接到一个新项目,不管用什么工具,第一步就是把 SMILES 的读写和校验流程先搭好。这个基础打好了,后面做分子指纹、子结构匹配、图神经网络什么的才会顺手。
好,这一章就到这里。理清了 SMILES 是什么、怎么来的、能做什么。接下来我们就要写代码了——从零开始解析它。