第1章 SMILES简介

SMILES,全称是 Simplified Molecular Input Line Entry System。说白了,就是用一串字符来表示一个分子的结构。你想想看,一个复杂的有机分子,用几十个字符就能描述清楚,这事儿本身就很酷。

我刚开始接触化学信息学的时候,看着那一串串字母和数字,心里直犯嘀咕:这玩意儿真能准确表达分子结构?后来用了一段时间才发现,它不仅准确,而且高效。做化学信息学的同事之间交流,发一串 SMILES 比画一张结构图快太多了。

1.1 发展历史

SMILES 是 1988 年由 David Weininger 在 Daylight Chemical Information Systems 公司提出的。那时候计算机辅助药物设计刚刚起步,大家急需一种能在大规模数据库里快速检索和交换分子结构的方法。

我记得我第一次读到 Weininger 的论文时,觉得这个设计思路非常巧妙——用线性字符串表达树形结构。后来的所有化学信息学工具,几乎都绕不开 SMILES。

发展历程中有几个关键节点:

  • 1988 年:David Weininger 发布 SMILES 规范,最初只支持基本的原子和键表示。
  • 1990 年代:Daylight 公司扩展出 Isomeric SMILES,支持手性、同位素和双键几何异构。
  • 2000 年代:Canonical SMILES 出现,解决了同一分子的多种 SMILES 表示问题,给分子去重成为可能。
  • 2007 年:OpenSMILES 规范发布,社区驱动标准化,让不同工具之间的 SMILES 解析更统一。
  • 2010 年代后:随着机器学习和深度学习在化学领域爆发,SMILES 成为分子表示的标准输入格式之一。
时间 事件 贡献者 / 机构
1988 SMILES 规范首次发布 David Weininger
1990s Isomeric SMILES 扩展 Daylight CIS
2000s Canonical SMILES 标准化 Daylight CIS
2007 OpenSMILES 规范发布 OpenSMILES 社区
2010s SMILES 成为 ML/DL 标准输入 学术界 / 工业界

核心认知:SMILES 不是一门编程语言,也不是一种数据格式,它是一套用线性字符串表达分子拓扑结构的编码规则。它的设计哲学是——简单、紧凑、无歧义。

1.2 应用领域

SMILES 的应用范围比大多数人想象的要广。我在项目中遇到过好几个场景,没有 SMILES 几乎没法做。

  • 化学数据库:PubChem、ChEMBL、ZINC 等大型数据库使用 SMILES 作为核心分子标识。搜索一个分子,本质就是在索引里匹配它的 SMILES。
  • 药物发现与虚拟筛选:做高通量虚拟筛选时,备选化合物的 SMILES 会作为输入传给对接软件或 AI 模型。我参与的一个靶点筛选项目,处理了超过 200 万条 SMILES,用 Canonical SMILES 去重后才发现其中近 30% 是重复结构。
  • 机器学习 / 深度学习:从早期的分子指纹到现在的 Transformer 模型,SMILES 是分子最直接的序列化表示。你把它当作文本序列做 NLP,就能预测性质、生成新分子。
  • 化学信息学工具:RDKit、Open Babel、CDK 等工具都内置 SMILES 解析器和生成器。几乎每个做化学信息学的开发者,每天都会和 SMILES 打交道。
  • 数据交换:不同实验室、不同软件之间交换分子信息,SMILES 是最轻量级的选择。不用传文件,一段字符串就够了。

实用技巧:做虚拟筛选时,建议先对化合物库做 Canonical SMILES 去重。我在一个实际项目中用这个操作把 50 万条数据压缩到 38 万条,去掉了大量重复提交的结构,后续计算成本直接降了 24%。

1.3 基本概念

SMILES 的核心规则其实不多,掌握了下面几类,就能看懂绝大多数分子。

  • 原子表示:用元素符号直接写。碳就是 C,氧就是 O,氮就是 N。有机物中碳原子最多,所以默认省略氢——你写个 C,表示 CH₄。有机金属或特殊价态需要加方括号,比如 [Fe]。
  • 键型表示:单键直接连着写(CC),双键写等号(C=C),三键写井号(C#N)。芳香键用小写字母,比如苯写作 c1ccccc1。
  • 分支结构:用圆括号表示支链。比如乙醇写 CCO,异丙醇写 CC(O)C。括号可以嵌套,我见过最深的有五层——解析的时候要小心。
  • 环结构:用数字标记环的连接点。环己烷写 C1CCCCC1,第一个 C 和最后一个 C 之间会连成环。同一个数字出现两次就表示成环。
  • 电荷与同位素:写在方括号内。铵离子 [NH4+],带氘的甲烷 [2H]C。电荷用 + 或 - 表示,可以带数字如 [Fe+3]。
  • 立体化学:用 @ 或 @@ 标记手性中心。比如 L-丙氨酸写 N[C@@H](C)C(=O)O。双键几何异构用 / 和 \ 表示,例如 C/C=C\C 表示反式。

我个人习惯是:写 SMILES 时尽量用 Canonical 形式,这样同一个分子只有一种表示,去重和检索都方便。RDKit 里一行代码就能转:

from rdkit import Chem
mol = Chem.MolFromSmiles("CCO")
canonical = Chem.MolToSmiles(mol)
print(canonical)  # 输出 CCO
概念 表示法 示例
原子(默认价态) 元素符号 C(甲烷)、O(水)
原子(特殊价态) [元素符号] [Fe](铁)、[NH4+](铵)
单键 直接连接 CC(乙烷)
双键 = C=C(乙烯)
三键 # C#N(氢氰酸)
分支 ( ) CC(O)C(异丙醇)
环 数字标记 C1CCCCC1(环己烷)
电荷 + / - [NH4+]
手性 @ / @@ [C@@H](O)C

避坑提醒:我曾经在解析一个天然产物的 SMILES 时,遇到括号嵌套五层的情况。如果用手写解析器,很容易在栈深度上出 bug。建议用 RDKit 或 Open Babel 这类成熟的解析库,不要自己造轮子。另外,写环标记时数字不要重复用,否则环连接会乱掉。

嗯,这里要特别说一下:SMILES 里的原子默认都是有机化学中最常见的价态——碳默认四价,氧默认二价,氢被自动补齐。所以写乙醇只需要 CCO,系统会自动理解第一个 C 连着三个 H,第二个 C 连着两个 H 和一个 O,O 连着一个 H。如果你想明确控制氢的数量,用方括号:

[CH3][CH2][OH]  # 显式写氢的乙醇

这种写法在数据库存储和机器学习中更常见,因为它不含歧义,模型学起来更容易。

SMILES 编码知识体系 SMILES 简介 发展历史 应用领域 基本概念 1988 年诞生 Daylight 公司 IUPAC 标准化 化学数据库 药物发现 机器学习 原子与键 分支与环 电荷与手性 SMILES 用线性字符串表达分子拓扑结构 核心三要素:原子、键、连接规则

SMILES 看似简单,但背后涉及图论、拓扑和化学规则。我建议初学者先掌握基本表示法——原子、键、分支和环,能读懂常见有机分子就行。手性和电荷可以后面再补。等你用 RDKit 写几行代码处理过真实库之后,这些概念会自然内化。

本章核心:SMILES 是一套用 ASCII 字符表达分子结构的标准编码。它经历了三十多年的发展,从最初的简单表示法演变为化学信息学、药物发现和机器学习领域的基础设施。掌握原子、键、分支、环、电荷和手性这六大基本概念,你就已经入门了。