
DeepChem 实战基于 Mol2Vec 的无监督分子子结构嵌入生成与使用【免费下载链接】deepchemDemocratizing Deep-Learning for Drug Discovery, Quantum Chemistry, Materials Science and Biology项目地址: https://gitcode.com/GitHub_Trending/de/deepchem导读Mol2Vec 是 Jaeger 等人提出的一种无监督分子表示学习方法它把 RDKit Morgan 指纹ECFP中每一位对应的子结构标识符视为单词把整个化合物视为句子借助 NLP 领域的 Word2Vec 技术学习子结构向量进而把分子编码为固定长度的稠密嵌入向量。本仓库的 contrib/mol2vec 提供了一套完整的复现方案——从 PubChem 化合物数据库批量下载 SDF 语料、抽取 Morgan 指纹子结构标识符、用 gensim 训练 200 维嵌入到用生成的vec.txt对分子做嵌入推理。读完本文你将掌握 Mol2Vec 的完整训练流水线、每一步的脚本与参数含义以及如何用 DeepChem 内置的Mol2VecFingerprint特征化器直接获得 300 维预训练嵌入。Mol2Vec 核心思想把化学子结构当作语言词汇Mol2Vec 的本质是化学领域的 Word2Vec。其核心映射关系如下单词wordRDKit Morgan 指纹即 ECFP中每一个置位的子结构标识符bit identifier。Morgan 指纹的每个 bit 对应分子中以某个原子为中心、给定半径内的一个环境circular environment这个环境本质上是一个化学子结构片段句子sentence一个化合物中全部子结构标识符组成的集合嵌入embedding用 Word2Vec 的 skip-gram 等模型在这些句子语料上训练后得到每个子结构标识符的稠密向量分子向量则由其包含的子结构向量聚合得到。这种思路让模型能够学习到具有化学直觉的子结构表示——相似化学环境的子结构在向量空间中彼此靠近。原 README 明确指出该实现的目标是复现 200 维的嵌入通过下载 PubChem 化合物数据库的全部 SDF 文件作为训练语料contrib/mol2vec/README.md。环境准备安装 gensim训练与推理依赖 gensimWord2Vec 的 Python 实现以及 RDKit用于读取 SDF 与计算 Morgan 指纹。README 中的安装步骤为pip install gensim从代码依赖看还需要 RDKitmol2vec.py、eval_mol2vec_results.py均import rdkit。仓库根目录的 requirements/env_common.yml 也包含了分子计算所必需的 rdkit 等依赖建议在 DeepChem 的 conda 环境中一并安装。训练语料构建下载 PubChem 化合物 SDF 全库Mol2Vec 是无监督方法训练质量直接取决于语料规模。README 给出的原始命令是python ../pubchem_dataset/download_pubchem_ftp.sh注意在当前仓库中该目录下实际存在的是 Python 脚本 contrib/pubchem_dataset/download_pubchem_ftp.py并无.sh文件因此应执行python contrib/pubchem_dataset/download_pubchem_ftp.py该脚本通过 FTP 连接到ftp.ncbi.nih.gov依次完成两类数据的下载SDF 语料切换至/pubchem/Compound/CURRENT-Full/SDF下载全部 gzip 压缩的 SDF 文件到deepchem.utils.get_data_dir()返回的数据目录下的SDF/子目录Bioassay 数据切换至/pubchem/Bioassay/CSV/Data下载全部 Bioassay CSV 到Data/子目录这部分用于后续生物活性数据集构建Mol2Vec 训练本身只用 SDF。脚本对已存在的文件会跳过if filename in existingfiles or README in filename: continue支持断点续传式的重复执行。存储空间要求README 明确提示脚本假定存在一个用于大容量下载的目录截至 2017 年 11 月PubChem 全量 SDF 约为 19 GB。结合 contrib/pubchem_dataset/README.md 的建议建议先设置DEEPCHEM_DATA_DIR环境变量指向有充足磁盘空间SDF 约 66GB Bioassay CSV 约 30GB的目录再运行下载脚本。生成训练语料mol2vec.py 源码解析下载完成后需要把 SDF 语料转换为 Word2Vec 可读的句子文本。README 中的命令是./train_mol2vec.sh该 shell 脚本contrib/mol2vec/train_mol2vec.sh内部先执行python mol2vec.py data.txtmol2vec.pycontrib/mol2vec/mol2vec.py是语料生成的核心其关键逻辑如下递归遍历SDF/目录下所有文件os.walk用gzip.open解压后用Chem.ForwardSDMolSupplier逐个读取分子已知解析坑文件名包含Compound_102125001_102150000的 SDF 文件在 Ubuntu 16.04 上无法被 RDKit 解析脚本会直接跳过对每个分子调用rdMolDescriptors.GetMorganFingerprint(mol, 1, bitInfoinfo)——注意这里radius 固定为 1即只编码每个原子的一阶邻域环境通过bitInfo拿到所有被置位的子结构标识符 key逐行输出为空格分隔的标识符序列一行即一个句子重定向到data.txt解析异常被try/except吞掉保证流水线不会被单个坏分子中断。最终data.txt的格式为每行对应一个分子行内是空格分隔的子结构标识符形如123456 789012 ...这正是 Word2Vec 标准的句子输入格式。训练 200 维嵌入train_mol2vec.sh 参数详解train_mol2vec.sh的第二条命令调用 gensim 自带的命令行训练入口python -m gensim.scripts.word2vec_standalone -train data.txt -output vec.txt -size 200 -sample 1e-4 -binary 0 -iter 3各参数含义如下参数值说明-traindata.txt训练语料文件即上一步生成的句子文本-outputvec.txt输出的词向量文件Word2Vec 格式-size200嵌入维度对应 README 中复现 200 维嵌入的目标-sample1e-4高频词下采样阈值用于抑制 thea 式的高频噪声标识符-binary0输出为文本格式而非二进制-iter3训练轮数epochs训练完成后得到vec.txt其中包含每个子结构标识符的 200 维向量。使用与评估嵌入eval_mol2vec_results.pyREADME 指出vec.txt可以直接作为 RDKit 指纹的固定长度替代方案示例代码在eval_mol2vec_results即 contrib/mol2vec/eval_mol2vec_results.py。该脚本演示了完整的推理流程gensim.models.KeyedVectors.load_word2vec_format(vec.txt)加载训练好的词向量使用论文原例——甘氨酸glycine的规范 SMILESC(C(O)O)N构建分子调用rdMolDescriptors.GetMorganFingerprint(mol, 0, bitInfoinfo)得到该分子的子结构标识符集合对每个标识符k从模型中取出向量model.wv[str(k)]并逐元素累加得到分子的 200 维总向量totalvec。这里展示了一个重要约定分子嵌入 其包含的子结构向量之和。这也是 Mol2Vec 论文的标准做法聚合后的向量可作为下游机器学习模型分类、回归的输入特征。进阶DeepChem 内置的 Mol2VecFingerprint 特征化器README 末尾提到作为 DeepChem 特征化器的完整实现尚在开发中WIP。实际上DeepChem 主线仓库已将该能力正式化实现在 deepchem/feat/molecule_featurizers/mol2vec_fingerprint.py并已从 deepchem/feat/molecule_featurizers/init.py 导出可用dc.feat.Mol2VecFingerprint()直接调用。预训练模型与默认超参数该类无需自己训练语料默认会自动从 DeepChem 数据服务器下载 300 维预训练模型mol2vec_model_300dim.tar.gz保存在deepchem.utils.get_data_dir()数据目录下。根据类文档字符串该默认模型是在ZINC 数据库的 2000 万化合物上训练得到的训练参数为指纹半径radius为 1出现次数少于 4 次的标识符统一替换为UNK使用 skip-gram 模型窗口大小为 10嵌入维度为 300。核心实现细节_mol2alt_sentence(mol, radius)为每个原子生成交替半径句子——把半径 0、1、2… 下该原子所处的子结构标识符按半径交替排列成一个序列作为分子级句子sentences2vec(sentences, model, unseenUNK)对句子中每个标识符查词向量并求和未登录词OOV使用UNK的向量替代unseenNone时则直接跳过这正是处理训练语料外子结构的关键策略_featurize(datapoint)对单个 RDKit Mol 对象生成 1 维numpy数组默认长度为 300。使用示例与测试验证官方文档字符串中的用法示例import deepchem as dc from rdkit import Chem smiles [CCC] featurizer dc.feat.Mol2VecFingerprint() features featurizer.featurize(smiles) # features 为 numpy.ndarrayfeatures[0].shape (300,)对应测试 deepchem/feat/tests/test_mol2vec_fingerprint.py 验证了端到端行为对阿司匹林 SMILESCC(O)OC1CCCCC1C(O)O调用Mol2VecFingerprint()后特征形状为(1, 300)。注意该特征化器要求环境已安装gensim否则构造时会抛出ImportError。完整流水线回顾与注意事项将整个 Mol2Vec 复现流程串起来PubChem FTP 下载 SDF约 19GB → contrib/pubchem_dataset/download_pubchem_ftp.py 抽取 Morgan(radius1) 子结构句子 → contrib/mol2vec/mol2vec.py data.txt Word2Vec 训练 200 维嵌入 → train_mol2vec.shsize200, sample1e-4, iter3 加载 vec.txt 并聚合分子向量 → eval_mol2vec_results.py 生产级特征化300 维预训练模型 → dc.feat.Mol2VecFingerprint()实操时需注意几点磁盘与网络全量 PubChem SDF 体积巨大务必预留足够空间并设置DEEPCHEM_DATA_DIR脚本名差异README 中写的download_pubchem_ftp.sh在仓库中对应的是download_pubchem_ftp.py训练成本全库训练规模庞大data.txt会包含海量句子若机器资源有限可考虑先用子集语料验证流程再扩展到全量两种使用路径如果追求完全按论文复现自训 200 维走contrib/mol2vec的脚本如果追求开箱即用直接使用Mol2VecFingerprint的 300 维预训练嵌入即可。通过本文你可以完整掌握 Mol2Vec 从语料下载、语料生成、嵌入训练到特征化集成的全链路实现并能够在 DeepChem 中把分子无缝转换为可直接输入机器学习模型的稠密向量。【免费下载链接】deepchemDemocratizing Deep-Learning for Drug Discovery, Quantum Chemistry, Materials Science and Biology项目地址: https://gitcode.com/GitHub_Trending/de/deepchem创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考