あるケミストの独り言(winchemwinの日記)

ケミスト(化学者)の視点で、面白そうな情報(シミュレーション関係など)を発信

化学構造データ変換-Tips その1(canonical SMILES への変換)

化学構造のデータセットを扱う場合、ファイル形式、データ変換など細々と処理を行う場面によく遭遇します。
これらの事例について、自分自身の備忘録もかねて、Tipsとして記事を残しておきたいと思います。
過去の皆さんの事例を参考にしているので、特段目新しい部分はないかもしれませんが、すこし自分なりにアレンジしていることもあるので、何か皆さんの参考になれば幸いです。

今回は、smilesファイルの取り扱いです。
化学構造に対する文字列での表記法として「SMILES記法」が知られています。
様々な化学物質の表記に対応した優れた表記法ですが、表記のスタート位置の元素などの違いにより同じ化合物でも一見異なる表現となってしまっている場合も結構存在します。
一見異なるsmiles表記であっても、化学構造式に復元する場合は同じ化合構造になるはずですが、一方で「機械学習データ」として利用する場合、文字列の並び、表現が統一されていないとまったく異なるものとして学習されてしまうことも想定されます。
このような問題点に対応しうる表現として化合物の表現が一義的に決まるようルールかされた表現として「canonical SMILES」が知られています。
今回は機械学習等での利用を想定し、smilesファイルで得られたデータを正規化された表現の「canonical SMILES」に変換するコードについて紹介します。
(この記事については、下記の記事を参考に書かせて頂いています。)

datadriven-rnd.com

利用データですがMolecular_Netでて提供されている水和の自由エネルギーデータ(SAMPL_MOL)のデータを利用させていただきました。
変換ですが、PythonのライブラリーRdkit を用いてsmilesファイルを一度mol ファイルに変換した後、再度smiles ファイルに変換する形で行っています。
Rdkit のMolToSmilesモジュールではデフォルトでSMILES記法への変換の際に「canonical SMILES」されるようですので特にこのモジュールを使うことで特に意識することなく正規化表現に統一できるかと思います。
記事の最後にコードを示しています。

まず、既存のcsvファイル(Mol_Net_SAMPL_Mol.csv:元ファイルからファイル名変更)読み込んだ後にsmilesが表記されている列データをリストデータ(Orig_smi)として取り出しています。
続いて、MolFromSmilesモジュールで一度smilesファイルをmolファイルに変換した後、改めてMolToSmilesモジュールでSMILES記法データ(smiles_R)に変換し直しています。
最後に変換データが追加されたファイルをcsvファイルに保存し直しています。


実際に変換前後のデータ(最初から20データ)を比較したのが以下の図ですが、いくつかの化合物で「smiles」と「smiles_R」で表現が異なっているのが確認できるかと思います。

変換データの比較

以上、今回はsmilesファイルを正規化された「canonical SMILES」に変換するコードについて紹介させていただきました。
csvファイル等からの大量のsmilesの変換例として参考になれば幸いです。

import pandas as pd
from rdkit import Chem
from rdkit.Chem import AllChem, Draw

df=pd.read_csv('Mol_Net_SAMPL_Mol.csv', encoding='shift-jis')

Orig_smi=df['smiles']
mols=[]
Conv_smi=[]
mols=[Chem.MolFromSmiles(smi) for smi in Orig_smi]

Conv_smi=[Chem.MolToSmiles(mol) for mol in mols]
df['smiles_R']=Conv_smi
df.to_csv('Mol_Net_SAMPL_Mol_add_convSmi.csv')