Windowsでお手軽Doc2Vecことはじめ:AI的言語処理その1

本稿では、人工知能的な言語処理を目的に、Word2Vec、Doc2Vecの機能を実装したgensimというPythonモジュールをMiniconda3環境にインストールします。そしてそこでDoc2Vecのチュートリアルを実行します。

チュートリアルを検討するだけで、結構なことが確認できます。

はじめに

AI的な言語処理をしたくなりました。

Googleの人が作ったWord2Vecという技術を使うと単語を任意の次元のベクトルで表すことができます。尚且つそれを応用したDoc2Vecをという技術を使えば、文章も任意の次元のベクトルで表すことができます。

ベクトルで表せればニューラルネットワークの入力にもできるし、いろいろと便利そう。それにWord2Vecでは語彙数分の次元は必要なし!

それらの技術をPythonから扱えるようにしたgensimというモジュールがあることを知りました。

詳しくはDeepAgeさんの「Doc2Vecの仕組みとgensimを使った文書類似度算出チュートリアル」をご覧ください。(ほぼDeepAgeさんの記事から学んでます。ありがとうございます。)

本稿では、AI的言語処理の第一回として、Windowsにお手軽なgensim環境を作成し、チュートリアルを実行します。

本稿での環境

本稿での環境は以下です。

バージョンが違うと、もしかしたら本稿とは違う現象が起こるかもしれません。

環境の作成とインストール

まずはMinicondaからですが、これについては「WindowsでTensorFlowの環境作成」の「Minicondaのインストール」の節をご参照ください。

…といっても、上のリンク先からインストーラーをダウンロードして実行するだけですが。

環境の作成

Minicondaがインストールされた状態で、コマンドプロンプトを起動し(Windowsキー+X,C)、以下の通りに入力します。

conda create –n gs python=3.6
activate gs

ここに、gsは環境の名前です。お好みで「gensim」とかに変えてもOKです。その場合、以降はgsをその環境名でお読み替え下さい。また「3.6」はPythonのバージョンですが、こちらもお好みで。

「activate」は、その後の名前の環境に切り替えるコマンドです。

作成した環境の実態は「B:\Miniconda3\envs\gs」以下になります。

インストール

環境に切り替わるとプロンプトに「(gs)」が表示されますので、続いて以下のように入力してインストールします。

conda install cython
conda install gensim
conda install jupyter

簡単ですね。Cythonは必須ではありませんが、後々早くなるか検討したいので先にインストールしておきます。(「conda install cython gensim jupyter」でいっぺんにできそうですが、逐次確認ということで別コマンドにしています。)

もしかしたら、これらのパケージや、これらに依存するパッケージのインストールでエラーが発生するかもしれません。

そのような場合は、「conda search <パッケージ名>」でエラーが起こったパッケージの種類を確認し、失敗したバージョンより前のバージョンをインストールすればうまくいくかもしれません。

具体的にはjupyterのインストールの入力の後、qt 5.6.2のリンクで失敗したことがありました。もう一回「conda install qt」とやっても同様でした。(今考えるとキャシュをクリアしたほうがよかったかも。)

「conda search qt」とすると、5.6.2の前が5.6.0でしたので、以下コマンドでインストールに成功しました。

conda install qt=5.6.0
conda install jupyter

エラーが置きなければ、インストールは終了です。

チュートリアル

Doc2Vecの仕方(変な日本語)については、gensimのサイトのこの辺の記事「models.doc2vec – Deep learning with paragraph2vec」に書いてあります。本節でのチュートリアルでも、Doc2Vecオブジェクトのメソッドのリファレンスになりますので開いておきましょう。

このページから、githubのリポジトリにリンクが貼られています。「Doc2Vec Tutorial on the Lee Dataset」というタイトルの、Jupyter notebookのファイルです。

このファイルが、予めgensimのパッケージに入っているニュース記事のデータ(コーパス)を使った、Doc2Vecのチュートリアルになっています。

手始めとして、これをやってみます。

チュートリアル環境の作成

まずチュートリアルを行うディレクトリを作成します。本稿では「B:\nn\test」というディレクトリを作成することにします。各位の環境にお読み替え(ry。

ブラウザから先のgithubのページにアクセスし、右上にあるRawボタンを右クリックしてdoc2vec-lee.ipynbをそのディレクトリにダウンロードします。

jupyter notebookの起動

gs環境のコマンドプロンプトで以下のように入力します。

jupyter notebook B:\nn\test

これまでのことがうまく行っていれば、ブラウザにてjupyterが表示されます。

ダウンロードしたノートブックをクリックすると、githhubと同じ画面が表示されます。

jupyterの簡単な使い方

私はjupyterを全然使いこなしていませんが、簡単な使い方を記します。

チュートリアルで使う機能

  • セルの実行:ツールバーの「▶|」のボタンか、Shift+Enter。セルがコードの場合は実行されます。標準出力(或いはエラー)がその下のOut[n]に表示されます。
  • 実行のリセット:メニューの「Kernel>Restart」。一番上のコードから実行をやり直す場合に使います。
  • 終了:「FIle>Close and Halt」

自分でノートを書くときによく使いそうな機能

  • セルの追加:ツールバーより「Markdown」「Code」を選択し「+」。その後セルを編集。
  • その他編集:ツールバーかEditメニューで。
  • 保存:「File>Save and Checkpoint」
  • やり直し:「File>Revert to Checkpoint」

Haltせずにページを閉じた場合

起動直後のページのRunningタブをクリックします。

Shutdownをクリックすると、そのページでのプロセスを終了します。

Jupyterの終了

上の画面で全てのプロセスの終了を確認して、移動したコマンドプロンプトより「Ctrl+C」でjupyterを終了します。(ブラウザは端末、コマンドプロントがサーバーですので。端末からノートのプロセスをgracefullに閉じる必要があるかと。)

チュートリアルの実行

チュートリアルは、ノートを読みながらコードを実行して行くだけです。Shift+Enter連打でOK。

コードの実行に時間がかかる場合があるので、その場合は実行結果「Out[?]」が表示されるまで待ったほうが良いでしょう。

実行後の出力が書かれていた内容と変わったりしますが、このノートの書かれたときからアップデートがあったりしたかもしれないので気にしないことにします。

メモがしたくなったら、Markdown選択の状態で「+」を押してセルを追加し、そこに記述できます。

チュートリアルの感想

ここでチュートリアルをやってみての私の感想を書こうと思います。

入力データ一件の長さ

入力データは「B:\Miniconda3\envs\gs\Lib\site-packages\gensim\test\test_data」にあります。(コードのセルに「print(gensim.__path__[0])」と追加して調べました。各位の環境に合わせてお読み替え(ry。)

このディレクトリの中の「lee_background.cor」をテキストエディタで開くと、入力データを見ることができます。エディタ上での改行までの一行が一件のデータです。

まず一件の長さをみますと、普通のニュース記事くらいの長さです。

日本のブログの、Doc2Vecの記事を見ますと、文の単位(「。」で終わりの一文)で学習させていたり、パラグラフごとだったりでした。長い文章を一件としてよいのかが疑問でした。

これを見ると、ニュース記事程度ならそのままOK。

しかも同じディレクトリにある「head500.noblanks.cor」とか見ますと、一件がもっと長いです。ですのでarticle単位の長さも可能かなあ、と思いました。(しかしhead500.noblanks.corの処理が一行一件としているかは謎。)

実際に入力される単語列

「Out[5]」に見える、実際に学習に使われるデータと元データを見比べました。

まず、大文字が小文字に変換されています。これは同じ単語として扱うためなので理解できます。

そして、ピリオド、カンマ、ハイフン、ダブルクォーテーション等の記号は削除されています。とすると、文章の中で文・節の区切りのような情報は必要ないということになります。(口語と考えればそれでもいい?)

同様にアルファベット一文字も削除されています。なので「Jaish-e-Mohammad」(パキスタンの固有名詞?)さんは’Jaish’, ‘mohammad’になっています。

これらの処理は「gensim.utils.simple_preprocess」の仕事なので、日本語の場合も同様な前処理が必要かもしれません。

ノートの最初に論文へのリンクがありますので、そもそもそれらから当たるべきなのでしょう。しかしショートカットして、この処理に習えばよいですかね。(そのショートカットがかえって遠回りなことはありがち。)

学習に必要な時間

学習を行うIn[9]のセルと実行すると、終了後に時間が表示されます。

その上に「BLASが有効だと3秒以下、そうでないと2分」と書かれています。

私の環境では9秒ほどでした。

Linuxサーバーでは無いですし、ブログを書きながら、裏でいろいろ走らせながらです。その環境でこの数字ということは、BLASは有効なのでしょう。

実際は学習データ数とともに、In [7]で設定しているモデルのパラメータも学習パフォーマンスに効きますから、これらも検討し、実時間で学習を完了させる必要がありそうです。

(ノートPCでお気楽AIですから。またソフト的な学習のパフォーマンスについて別稿にて検討します。)

学習のためのコード

この短いチュートリアルだけで、実際にどのようなコードを書けばよいかわかります。というか、ほぼこのままでいけそう。

実際の学習(model.build_vocab、model.train)は、複数に分けてミニバッチにしたいところです。しかしそれができるかどうか。。。ぱっと調べたところ、できる確証なし。というか、元の論文読め、と言われそう。。。)

まとめ

以上、Condaコマンドで簡単にDoc2Vecの環境が作成できました。

その環境でチュートリアルを行うだけで、いろいろとわかりました。

次回は、学習データ(コーパス)の作成を検討してみたいと思います。

コメントを残す