一、SMILES 简介:从化学结构到一行字符串

做化学信息学的人,每天打交道最多的就是 SMILES 了。说白了,它就是一套把分子结构写成一行文本的规则。我刚开始接触这个领域时,看到 CC(=O)O 这种字符串,心想:这什么东西?后来才明白,它代表的是乙酸 —— 两个碳,一个双键连着氧,还有一个羟基。嗯,SMILES 的魅力就在这里。

1.1 SMILES 的发展历史

SMILES 全称是 Simplified Molecular Input Line Entry System。1998 年,David Weininger 在 US Environmental Protection Agency 工作时提出了这个概念。为什么要发明它?

  • 1970 年代:化学信息学早期,大家还在用 WLN(Wiswesser Line Notation)。这玩意儿很强大,但学起来像背密码,太复杂了。
  • 1988 年:Weininger 在《Journal of Chemical Information and Modeling》上发表了第一篇关于 SMILES 的论文。我记得当时他提出的规则只有十几条,非常简洁。
  • 1990 年代:Daylight Chemical Information Systems 公司将其商业化,并扩展了规范,例如加入了手性标记。
  • 2000 年后:开源社区涌现了 OpenBabel、RDKit 等工具,让 SMILES 几乎成了分子表示的通用语言。

为什么 SMILES 会流行起来?你想想看,以前的分子结构数据要么是二维的 MOL 文件,要么是三维的 PDB 文件,又大又不好比较。而 SMILES 用一行字符串就能唯一表示一个分子 —— 这给数据库的存储、检索和去重带来了革命。我在一个项目中曾经处理过 500 万个化合物的库,如果用 MOL 文件,光存储就要几个 TB,换成 SMILES 后,一个几 GB 的文本文件就搞定了。

1.2 SMILES 的基本语法规则

SMILES 的语法规则其实不复杂。我先给你一个总体印象:它用字母代表原子,用符号代表键,再利用括号和数字处理支链和环。核心流程可以看我下面这张图:

SMILES 知识体系与演化历程 SMILES 知识体系与演化历程 Weininger 初始规范 Daylight 扩展 当前主流 SMILES 原子表示 键的表示 分支 & 环 元素符号 芳香族 / 脂肪族 单键 / 双键 / 三键 括号支链 数字环标记 标准化 & 去重:确保唯一性 SMILES 核心路径:从历史 → 规则 → 原子 & 键 → 分支 & 环 → 标准化 & 去重

1.3 原子与键的表示

原子表示其实很简单:直接用元素周期表的符号。碳就是 C,氧就是 O,氮是 N,氯是 Cl。但这里有几个坑,我遇到过:

C       # 碳甲烷
CC      # 乙烷
CCO     # 乙醇
C=O     # 甲醛(注意双键)
c1ccccc1 # 苯(小写 c 表示芳香族碳)

为什么苯的小写 c 这么重要?因为 SMILES 区分芳香族和脂肪族。芳香族用小写字母,脂肪族用大写字母。你想想看,如果没有这个规则,C1=CC=CC=C1 和 c1ccccc1 虽然描述同一个分子,但在计算机看来是两种完全不同的表示——这就是后面要讲的标准化问题。

键的表示有三种常见形式:

键类型 符号 示例 说明
单键 - C-C 可以省略,例如 CC
双键 = C=C 不能省略
三键 # C#C 不能省略

我个人习惯,单键能省略就省略。为什么呢?因为省略后字符串更短,读起来更快。但有一个例外:当你需要明确指明连接顺序时,比如在括号支链里,单键有时可以辅助阅读。

还有一类更特殊的键,比如配位键和氢键,传统的 SMILES 并不直接支持。你可以在一些扩展规范中看到 -> 或 <-,但主流工具(RDKit、OpenBabel)默认只处理上面三种。我记得以前有个项目处理金属配位化合物,用 SMILES 怎么都表达不对,最后改用 MOL 文件才搞定——嗯,SMILES 也不是万能药。

1.4 分支与环的规则

分支我举一个典型的例子:乙酸乙酯。直链是乙基连着酯基,如果写成 CC(=O)OCC,括号里面的 (=O) 就表示它是主要链上的一个支链。

CC(=O)O  # 乙酸:一个甲基,一个支链双键氧,再一个羟基

括号的嵌套也很常见。比如有一个叔丁基的分子:

CC(C)(C)CC  # 注意括号内是一对甲基

环的表示用数字标记。比如环己烷:

C1CCCCC1  # 数字 1 表示环的开头和结尾共用同一个碳

多环怎么办?就用不同的数字:

C1CC2CCCC2C1  # 两个环公用两个碳(中间 2 号环)

这里要注意:数字不能重复使用。我曾经在数据库里看到过 C1=C1 这种奇怪的写法——其实它表示一个双键,但两个碳被标记成同一个环,是无效的。标准化的时候就会报错。

1.5 “高级查询”:原子性质标签

在标准的 SMILES 之上,还允许加入方括号对原子进行修饰。这算是原子表示的扩展语法,但非常重要:

[C@@H]      # 手性方向:@@ 表示顺时针
[OH-]       # 带电荷:羟基阴离子
[13CH4]     # 同位素:13C 甲烷
[Na+]       # 金属钠离子

实战经验:在做化合物去重时,一定要小心这些修饰。两个 SMILES 字符串可能因为手性标记的顺序不同(比如 [C@] 与 [C@@])导致去重失败。我用 RDKit 的 CanonicalSmiles 方法就能自动帮我把这些统一。

1.6 为什么标准化和去重要从 SMILES 基础开始?

我花这么多篇幅讲基础知识,是因为后面所有标准化去重方法都建立在这个地基上。你想想看:如果你连单键能否省略、双键怎么表示、环数字怎么分配都不清楚,那你怎么判断两个 SMILES 是不是同一个分子?

比如水和重水:O 和 [2H]O[2H],长得完全不一样,但前者是普通水,后者是重水。去重的时候要不要把它们合并?这就涉及标准化策略的选择了。

核心总结:SMILES 是一套半结构化的分子表示语言。它的语法简单,但存在冗余表示(同一个分子有多种写法)。这正是标准化的必要性所在。后面的章节会一步步教你如何写脚本把这些“异形变体”统一。

1.7 本章小提示

  • 熟记基本规则:原子大小写、键省略规则、括号与数字的用法。
  • 多做练习:建议拿几个常见分子(水、乙醇、苯、环己烷、乙酸乙酯)手动写 SMILES,然后用 RDKit 验证。
  • 注意版本差异:不同工具对 SMILES 的解释有细微差别。我曾经试过 OpenBabel 和 RDKit 对同一个 c1ccccc1 输出的规范形式不一样——原因是对芳香性的判断标准不同。