化合物データのデータ拡張

大規模なデータセットを取得するためにデータ拡張技術がよく使用されます。ここでは、SMILES表現の化合物データのデータ拡張について示します。

ケモインフォマティクス分野では、Canonical SMILES表現が使用されています。Canonical SMILESは化合物に固有のSMILES表現として用いられます。これはデータベースなどで化合物を管理するときに適しています。

SMILES表現はどの原子から始めても問題ないので、1つの分子から複数のSMILES表現を作ることができます。これを利用して1つの分子から複数のSMILES表現を作成し、データを拡張します。

rdkitによって簡単にランダムなSMILES表現を作成することができます。

rdkitをimportします。

from rdkit import Chem, rdBase
print(rdBase.rdkitVersion)

>>> '2023.03.1'

例としてPenicillin Gを用います。
Chem.MolToSmilesのdoRandomオプションをTrueにするとランダムなSMILESが生成されます。

smi = "CC1([C@@H](N2[C@H](S1)[C@@H](C2=O)NC(=O)CC3=CC=CC=C3)C(=O)O)C"
mol = Chem.MolFromSmiles(smi)
for i in range(10):
    s = Chem.MolToSmiles(mol, doRandom=True)
    print(s)

###以下出力###
S1[C@@H]2[C@@H](C(N2[C@@H](C(=O)O)C1(C)C)=O)NC(Cc1ccccc1)=O
S1[C@@H]2[C@H](NC(=O)Cc3ccccc3)C(N2[C@H](C1(C)C)C(=O)O)=O
O=C1[C@@H](NC(=O)Cc2ccccc2)[C@H]2SC(C)([C@H](C(=O)O)N21)C
c1(CC(=O)N[C@H]2[C@@H]3N(C2=O)[C@H](C(S3)(C)C)C(=O)O)ccccc1
C(C(=O)N[C@@H]1C(N2[C@@H]1SC(C)(C)[C@@H]2C(=O)O)=O)c1ccccc1
[C@@H]1(C(C)(S[C@@H]2[C@@H](C(=O)N21)NC(Cc1ccccc1)=O)C)C(=O)O
c1c(CC(=O)N[C@H]2[C@H]3SC(C)(C)[C@@H](N3C2=O)C(O)=O)cccc1
O=C1[C@@H](NC(=O)Cc2ccccc2)[C@H]2SC(C)(C)[C@H](C(O)=O)N21
O=C(Cc1ccccc1)N[C@H]1[C@H]2SC(C)(C)[C@H](C(=O)O)N2C1=O
O=C(O)[C@@H]1N2C(=O)[C@H]([C@H]2SC1(C)C)NC(Cc1ccccc1)=O

ちなみにChem.MolToSmilesのデフォルトではCanonical SMILESが生成されます。

smi = "CC1([C@@H](N2[C@H](S1)[C@@H](C2=O)NC(=O)CC3=CC=CC=C3)C(=O)O)C"
mol = Chem.MolFromSmiles(smi)
print(Chem.MolToSmiles(mol))

>>> CC1(C)S[C@@H]2[C@H](NC(=O)Cc3ccccc3)C(=O)N2[C@H]1C(=O)O

その他オプションとして以下の項目があります。

  • isomericSmiles: 立体化学に関する情報を含めるかどうか。Defaultはtrue

  • kekuleSmiles: Kekule形式(芳香族結合なし)を使用するかどうか。 Defaultはfalse

  • rootedAtAtom: 負でない場合、特定の原子で強制的に開始する。Defaultは-1

  • canonical: falseにすると正規化されない。 Defaultはtrue

  • allBondsExplicit: 結合次数を明示的に出力するかどうか。 Defaultはfalse

  • allHsExplicit: 水素を明示的にするかどうか。Defaultはfalse

それぞれ試すと以下のようになります。

smi = "CC1([C@@H](N2[C@H](S1)[C@@H](C2=O)NC(=O)CC3=CC=CC=C3)C(=O)O)C"
mol = Chem.MolFromSmiles(smi)

###isomericSmiles=Falseにする###
print(Chem.MolToSmiles(mol, isomericSmiles=False))
>>> CC1(C)SC2C(NC(=O)Cc3ccccc3)C(=O)N2C1C(=O)O

###kekuleSmiles=Trueにする###
print(Chem.MolToSmiles(mol, kekuleSmiles=True))
>>> CC1(C)S[C@@H]2[C@H](NC(=O)CC3=CC=CC=C3)C(=O)N2[C@H]1C(=O)O

###rootedAtAtom=1にする###
print(Chem.MolToSmiles(mol, rootedAtAtom=1))
>>> C1(C)(C)S[C@@H]2[C@H](NC(=O)Cc3ccccc3)C(=O)N2[C@H]1C(=O)O

###rootedAtAtom=5にする###
print(Chem.MolToSmiles(mol, rootedAtAtom=5))
>>> S1[C@@H]2[C@H](NC(=O)Cc3ccccc3)C(=O)N2[C@@H](C(=O)O)C1(C)C

###canonical=Falseにする###
print(Chem.MolToSmiles(mol, canonical=False))
>>> CC1(C)[C@H](C(=O)O)N2[C@H](S1)[C@H](NC(=O)Cc1ccccc1)C2=O

###allBondsExplicit=Trueにする###
print(Chem.MolToSmiles(mol, allBondsExplicit=True))
>>> C-C1(-C)-S-[C@@H]2-[C@H](-N-C(=O)-C-c3:c:c:c:c:c:3)-C(=O)-N-2-[C@H]-1-C(=O)-O

###allHsExplicit=Trueにする###
print(Chem.MolToSmiles(mol, allHsExplicit=True))
>>> [CH3][C]1([CH3])[S][C@@H]2[C@H]([NH][C](=[O])[CH2][c]3[cH][cH][cH][cH][cH]3)[C](=[O])[N]2[C@H]1[C](=[O])[OH]

参考文献

rdkit.Chem.rdmolfiles module 

Generate possible list of SMLIES with RDKit
https://iwatobipen.wordpress.com/2018/11/15/generate-possible-list-of-smlies-with-rdkit-rdkit/

この記事が気に入ったらサポートをしてみませんか?