728x90

 DeepSMILES는 분자 구조를 string 형태로 표기하는 표기법으로, SMILES가 ring과 branch에서 가지고 있는 invalidity 문제를 해결하기 위해서 제시된 방법이다. 이번 글에서는 DeepSMILES가 무엇인지에 대해 알아보겠다. 

* 이번 글은 SMILES에 대한 기본적인 이해가 있다고 가정한다.

Motivation

 SMILES는 가장 기본적인 분자의 string 표기법으로 널리 사용되어 왔지만 여러 가지 한계점을 가진다. 그 중 대표적인 한계점이 ring을 한 쌍의 숫자로, branch를 한 쌍의 괄호로 표현하기 때문에 이러한 쌍이 만족되지 못하면 invalid한 string이 된다는 점이다. 예를 들어, C1CCC2라는 string이 있다고 하자. SMILES는 하나의 ring을 같은 숫자로 표현하기 때문에 저러한 string이 만들어진다면 이는 적절한 분자 형태로 변환할 수가 없다. 또 다른 예로, (CCC(ON)이라는 string이 있다고 하자. SMILES는 괄호로 branch를 표현하기 때문에 닫히지 않은 괄호 형태는 적절한 분자 형태로 변환할 수가 없다. 이렇게 SMILES를 사용하게 되면 우리가 어떤 랜덤한 string을 만들었을 때 이들이 valid한 molecule로 변환되지 못하는 경우가 발생했고, 이러한 문제들을 해결하기 위해 등장한 것이 DeepSMILES이다.

Components

 DeepSMILES가 SMILES와 다른 부분은 ring과 branch의 두 개의 분류로 나눌 수 있다. 각 요소들에 대해서 차례로 알아보겠다.

Rings

 우선, DeepSMILES는 ring을 한 쌍의 숫자들이 아닌 하나의 숫자로 표현하고, 이 하나의 숫자는 ring에 포함되는 마지막 원자 다음에 표시된다. 또한 이 숫자는 ring의 크기를 말한다. 예를 들어, 다음과 같은 bicylohexyl 분자가 있다고 하자. 

Bicylohexyl 분자 예시

 이 분자를 SMILES 형태로 표현하면 두 개의 ring을 포함하고 있기 때문에 각각의 ring에 대해 두 개의 label을 붙여 C1CCCCC1C2CCCCC2가 된다. 하지만 이를 DeepSMILES로 표현하면 CCCCCC6CCCCCC6이 된다. 각각의 ring에 대해 하나의 ring size를 표현하는 label만 붙이는 것이다. 이 ring의 경우에 원자가 6개 포함된 ring이기 때문에 CCCCCC6이 된다.

 또한 DeepSMILES의 ring을 시작할 때 이에 연결된 결합 정보가 있다면 이는 마지막의 ring label 앞으로 이동해서 표현한다. 예를 들어 C=2CCC2라는 SMILES string이 있다고 하자. 이에는 ring을 시작할 때 =라는 결합정보가 포함되어 있기 때문에 이를 DeepSMILES로 표현하면 결합 정보를 마지막으로 이동하여 CCCC=4가 된다. 

 이는 단순한 ring 뿐만 아니라 aromaticity에도 해당한다. 예를 들어, 다음과 같은 피리딘 분자가 있다고 하자.

Pyridine 분자 예시

위 피리딘 분자는 SMILES로 표현했을 때 n1ccccc1로 표현할 수 있다. 하지만 DeepSMILES 형태로 표현하면, 보통의 ring을 표현하는 것과 같이 nccccc6 형태로 표현할 수 있다.

Branches

 다음으로, DeepSMILES는 branch를 한 쌍의 괄호가 아닌 하나의 닫는 괄호로 표현한다. 이 때, 괄호의 개수는 branch의 길이를 의미한다. 예를 들어, C(OC)라는 branch는 길이가 2인 branch이기 때문에 이를 DeepSMIELS로 표현하면 COC))가 된다. 좀 더 구체적으로 예시와 함께 살펴보겠다. DeepSMILES로 표현했을 때 COC))SC))F로 표현되는 분자를 SMILES 형태로 변환해보겠다. 그 과정을 표현하면 다음 그림과 같다.

Branch의 생성 과정

우선, DeepSMILES에서 닫는 괄호를 만날 때까지 각 원자들을 stack에 쌓는다. 우리의 예시의 경우 COC 다음에 닫는 괄호가 처음 나오기 때문에 COC를 stack에 쌓는다. 다음으로, 닫는 괄호를 만나면 닫는 괄호의 개수만큼 stack에서 각 원자들을 제거한다. 우리의 예시의 경우 COC))이기 때문에 stack의 C와 O를 제거하고, 마지막으로 제거된 문자 앞에 괄호를 만들어서 이에 해당하는 SMILES는 C(OC)가 된다. 이러한 과정을 끝까지 반복하면 우리는 DeepSMILES COC))SC))F를 C(OC)(SC)F로 변환할 수 있다.

Generation

 위의 규칙에 따라서 우리는 DeepSMILES를 SMILES와 비슷한 방식으로 만들 수 있다. 다음과 같은 분자가 있다고 하자.

예시 분자

1. 분자로부터 수소를 제거한다.

2. Ring들을 찾아 ring bond를 하나씩 제거한다. 이 때, SMILES와는 달리 각 ring에 번호를 매기지는 않는다.

ring bond를 제거한 분자

3. 특정 시작 원자를 정하고, 그 원자로부터 DFS 방식으로 DeepSMILES string을 만들어낸다. 이 때, ring bond를 만나면 ring의 크기에 맞는 숫자를 string에 더하고, branch를 만나면 branch의 길이에 맞는 개수의 괄호를 string에 더한다.

3의 DFS 과정을 거친 분자

4. DeepSMILES를 도출한다.

도출된 DeepSMILES string

Strengths & weakness

 DeepSMILES는 SMILES가 가지고 있던 invalid ring과 invalid branch 문제를 해결했기 때문에 valid한 molecule에 해당하는 string을 더 잘 만들 수 있다는 장점을 가진다. 또한 같은 ring label을 가지는 ring은 같은 개수의 원자를 포함하기 때문에 ring 크기에 따른 분자의 특성을 좀 더 잘 표현할 수 있다는 장점도 있다. 하지만 DeepSMILES는 invalid molecule problem을 완전히 해결하지는 못했다. 예를 들어, C))C처럼 stack에 쌓여있는 원자보다 괄호의 개수가 더 많다거나 CCCC6처럼 ring label의 숫자보다 앞에 나온 원자의 개수가 더 적은 invalid string이 존재한다.

 

 이번 글에서는 SMILES에 이어 DeepSMILES가 무엇이고 이것이 분자를 어떻게 표현하는지에 대해 알아보았다. 다음 글에서는 완벽하게 valid한 string만을 만들어낼 수 있는 표현방법인 SELFIES에 대해 알아보겠다.

 

References

1. O'Boyle, N., & Dalke, A. (2018). DeepSMILES: an adaptation of SMILES for use in machine-learning of chemical structures.
300x250
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기