BERT（Keras BERT）を使用した文章ベクトル作成

[日本語BERT学習済みモデル](https://yoheikikuta.github.io/bert-japanese/)を使った日本語の文章ベクトル作成をしてみました。
BERTで文章ベクトルを作るやり方はいろいろなサイトで見たのですが、モデルファイルの配置場所が分からなかったり、なかなかゼロから始めてすんなりできなかったので、[Google Colaboratory](https://colab.research.google.com/)を使って、自分のマシンに色々入れずに手軽にやる方法でやってみたいと思います。
# Google Colaboratoryとは？
自分のマシンに何もインストールしなくてもブラウザとGoogleアカウントがあればクラウド実行環境でPythonプログラムを実行できます。イメージ的にはクラウド上のJupyterノートブック環境です。Pythonコードを書くとすぐにその場で実行することができます。Googleが機械学習の教育、研究用に使われることを目的としているので、素晴らしいことに無料で使うことができます。なんとGPUやTPUも使えるという、実験や勉強のために使わない選択肢はないというサービスです。
# BERTのモデルを準備する
まずはBERTの学習済みモデルを準備します。ありがたいことに日本語のWikipediaで学習済みモデルを作り公開してくださっている方がいらっしゃいますので、こちらのモデルを使わしていただくことにします。

[BERT with SentencePiece を日本語 Wikipedia で学習してモデルを公開しました](https://yoheikikuta.github.io/bert-japanese/)

こちらのページに**google drive**のリンクがあるのでそちらからファイルをダウンロードしてください。必要なのは以下のファイルです。（一番サイズが大きいbz2ファイルは要らないです！）

- graph.pbtxt
- model.ckpt-1400000.data-00000-of-00001
- model.ckpt-1400000.index
- model.ckpt-1400000.meta
- wiki-ja.model
- wiki-ja.vocab

ファイルをダウンロードしたら自分のGoogle Driveの**マイドライブ**の下に**bert**フォルダを作成、その中に**bert-wiki-ja**フォルダを作成し、その中に上記のファイルをすべてアップロードします。

さらに、[こちらから](https://drive.google.com/drive/folders/1tGiWcYJ6Q3xnZK8nMtTQVDaPNm5pYfq9?usp=sharing)以下のファイルをダウンロードしてこれも同じく**bert-wiki-ja**フォルダにアップロードします。このファイルは先にアップロードしたモデルファイルを使うのに必要な設定値が記載されているファイルになります。

- bert_config.json

最終的にGoogle Driveに以下のファイルがそろっていれば大丈夫です。
![googledrive.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54031/46ce14ce-5417-0100-e29b-e87efce4d3f7.png)

# 文章ベクトルを作るプログラムを動かす
[こちらから](https://drive.google.com/drive/folders/1tGiWcYJ6Q3xnZK8nMtTQVDaPNm5pYfq9?usp=sharing)プログラム本体である以下のipynbファイルをダウンロードしてGoogle Driveの任意の場所にアップロードします。

- bert_sentencevector_test1.ipynb

[Google Colaboratory](https://colab.research.google.com/)が使えるようにGoogle Driveに設定をして、このファイルをGoogle Colaboratoryで開きます。開いたらRun all ([Ctrl]+[F9])で実行します。

コードが順に走り、途中一か所「Google Driveをパス/content/driveにマウントする」という部分で以下のように表示されます。Google Driveのファイルを参照するために認証を通す必要がるため、表示されたリンクをクリックし、画面の指示に従ってアクセス許可を与え、最後に表示されたコードを、"Enter your authorization code:" のところに入れてやると先に進みます。

```
Go to this URL in a browser: https://accounts.google.com/o/oauth2/auth?client_id=...

Enter your authorization code:
```

最後のコードセルの、textに設定された文章が文章ベクトルを作る対象の文章です。

```
text= '東京の表玄関とも言うべきターミナル駅。特に東海道新幹線と東北新幹線の起点となっており、全国の新幹線網における最大の拠点となっている。'
texts2matrix([text])
```

作られた文章ベクトルはこんな感じです。

```
array([[ 7.48805702e-01,  6.90443218e-01, -2.08694339e-01,
         2.60837108e-01, -6.57196045e-01,  2.21781164e-01,
         2.99572378e-01, -5.03947437e-02,  2.57107586e-01,
        -3.71909142e-02,  4.70012784e-01, -4.32350069e-01,
        ...
        -2.44613029e-02, -5.86998463e-02,  3.70831758e-01,
        -2.27520689e-01,  3.76363575e-01,  2.21934259e-01,
         7.50128254e-02,  1.20648248e-02, -2.35060215e-01]], dtype=float32)
```

うまくうごきましたでしょうか？
`text`を書き換えて、このコードセルを再度実行すると文章ベクトルが再計算され出力されます。

# 参考文献
今回の記事はこちらのドキュメントを参考にさせていただきました。

- [BERTで文章のベクトル表現を得るための環境構築紹介](https://qiita.com/Jah524/items/2f651b479888ae352088)
- [BERT with SentencePiece を日本語 Wikipedia で学習してモデルを公開しました](https://yoheikikuta.github.io/bert-japanese/)

コード説明を追加した改訂記事、ベクトルの視覚化の記事を公開していますので、こちらもぜひご覧ください。

- [BERTを使用した文章ベクトル作成（コード説明あり）](https://www.enoki.ifocus-network.com/tech-6/)

- [BERTによる文章ベクトルを視覚化する](https://www.enoki.ifocus-network.com/tech-7/)

# おわりに
できるだけ簡単に最短手順で文章ベクトルを作る方法をご紹介しましたが、うまくいかなかったなどあればコメントください。文章がベクトルにできると使い道がいろいろ広がりそうです。

普段はこちらの会社で自然言語関連の業務をしています。
BERT以外の技術も使っていますのでご興味あればぜひご覧ください。
→  [アイフォーカス・ネットワーク株式会社](https://wwww.ifocus-network.com/)