アミノ酸配列の分散表現

近年の機械学習の発展に伴い、蛋白質工学においても機械学習の活用事例が増えています。最適なアミノ酸配列の提案や、配列集団のクラスタリングをおこなうために、機械学習の訓練データにアミノ酸配列を利用する際には、一文字表記の列挙文字列を数値ベクトルに変換しなければなりません。

本記事では、Doc2Vecを使ってアミノ酸配列の分散表現を得る方法について解析します。

Doc2Vecの特徴

Doc2VecはBag of WordsやTF-IDFなど他の分散表現手法とは異なり、文書の語順を考慮したベクトルを作成することが可能です。アミノ酸配列のように20種類の小さいワードリスト(アミノ酸)をもとにした文書では語順が考慮されない限り正確に文書を表現することは難しいですのですが、Doc2Vecではその課題を克服することができます。

詳細な原理に関しては、原著の論文と日本語で解説されているページを引用します。

https://arxiv.org/pdf/1405.4053.pdf
Doc2Vecについてまとめる - Qiita
#はじめに今回はWord2Vecの発展としてDoc2Vecを勉強しました。自然言語処理でよく求められるタスクとして「文書分類」や「文書のグルーピング(クラスタリング)」がありますが、それらを実施…

ライブラリgensim

Doc2VecをPythonで扱えるライブラリとしてgensimがあります。これはトピックモデルを中心に自然言語処理をPythonでおこなうためのライブラリです。公式のサイトは以下のとおりです。

Gensim: topic modelling for humans
Efficient topic modelling in Python

まずはgensimをインストールしてみましょう。以下のコードでターミナルまたはanacondaからインストールすることができます。

# ターミナル から
pip install --upgrade gensim

# Anaconda Prompt から
conda install -c conda-forge gensim

モデル構築

モデル構築の流れは以下のとおりです。

  1. protein sequence splitting
  2. taggedcocument
  3. model construction

まずはじめに、配列(文書)を構成するアミノ酸モチーフ(単語)を定義します。蛋白質配列においてはk-merのオーバーラップしない配列に分割することが一般的です。k=3のとき、以下のように配列を分割します。この場合、開始箇所の違いにより1配列から独立した3配列分のコーパスが用意されることになります (PLoS One. 2015 Nov 10;10(11):e0141287.)。

ACDEFGHIKLMNPQRSTVWY.. →
1) ACD, EFG, HIK, LMN, PQR, STV, ..
2) CDE, FGH, IKL, MNP, QRS, TVW, ..
3) DEF, GHI, KLM, NPQ, RST, VWY, ..

次に、各配列に対して、断片化したk-merのリストと配列自身の識別子を付与するため、taggeddocumentメソッドを実行します。

from gensim.models.doc2vec import TaggedDocument

# seqs(list)にモデル構築に使用する配列のリストを格納する

i=0
k=3
trainings = []
for seq in seqs:
    for x in range(k):
        shifted_seq = seq[x:]
        kwords = []
        for y in range(len(shifted_seq)-(k-1)):
            kwords.append(shifted_seq[k*y:k*y+(k-1)])
        trainings.append(TaggedDocument(words = kwords, tags = [x]))
        i += 1
# words:文書に含まれる単語のリスト
# tags:文書の識別子(リストで指定)

最後に作成したリストを渡しモデルを構築します。

from gensim.models.doc2vec import Doc2Vec

# 引数
# documents:学習データ(TaggedDocumentのリスト)
# dm:学習モデル(0:DBOW(語順無視), 1:DM)
# vector_size:次元数
# window:次の単語の予測に何単語を用いるか(PV-DMの場合) 又は、文書idから何単語を予測するか(PV-DBOWの場合)
# min_count:最低n回出現した単語を学習に使用する
# wokers: 学習に用いるスレッド数

m = Doc2Vec(documents= trainings)

新規配列の圧縮ベクトルを取得

構築したモデルから任意の配列についてそのベクトルを得ることができます。そのためにはinfer_vectorを使用します。

new_vec = m.infer_vector(new_seq)

コメント