アラカン"BOKU"のITな日常

文系システムエンジニアの”BOKU”が勉強したこと、経験したこと、日々思うことを書いてます。

NNablaで単語のベクトル表現化処理(Word2Vec)をやってみる。(1回め)

Word2VecをNNablaでやってみます。

 

Word2Vecは、「単語の意味や文法を捉えるために単語をベクトル表現化して次元を圧縮したもの」で、以下にわかりやすく説明されてます。

 

でも、「単語の意味や文法を捉えるために単語をベクトル表現化して次元を圧縮」なんて言われても、文系人間には、普通わけがわかりませんよね。

 

なので、ちょっと補足します。

 

単語を数字に置き換えて比較できるようにする

 

単語をそのままでは、ニューラルネットワークで処理できません。

 

なんとかして、数字に変換してやらないと駄目です。

 

単語を数字に変換する一つの方法が「ベクトル化」です。

 

ベクトルの意味は「大きさと向きを持つ量」だと習いました。

 

つまり、入力されたテキストデータに含まれる単語を出現頻度や出現位置などの情報を使って、大きさと向きを持つ量に変換することで、数字に変換してやろう。

 

かなり、荒っぽいですけど、「単語のベクトル化」だと考えると、自分は理解しやすかったです。

 

数字にさえ変換してしまえば、あとは計算で、単語同士の近さ・・類似というのかな・・を判断できるようになりますから。

 

その判断を使えば、数値が近いか・遠いかで、指定した単語の類義語や反対語を見つけたりできるので、色々遊べるわけです。

 

例えば、「王様」をインプットして、類義語で「女王様」を持ってきたりみたいなことを、学習結果をうけた推論として、コンピュータが行ったりするわけです。

 

入力テキストの中での出現頻度や出現位置をもとに学習するわけでから、入力テキストによって結果が変わったり、予想外のものが表示されたり・・します。

 

色々と面白い事例がインターネットでも公開されてます。

 

NNablaにもWrd2Vecのサンプルがあります

 

このWord2Vecができるツールは色々ある(例えば Gensimとか)のですが、NNabla(Neural Network Libraries)にもサンプルで、word_embedding.pyがあるみたいなので、それを使ってやってみようかな・・と思ってます。

 

2017/12/15追記

> word_to_vec.py という名前でしたが名前が変わりました。

>現在「word_embedding.py」という名前に変更になってます。

>なので、記事は「word_embedding.py」に書き換えてます。

 

NNablaによるword_embedding.pyのサンプルソースはここにあります。

github.com

 

 

 

このソース「word_embedding.py」は、READMEにあるみたいに、単独で実行できます。 

You can start learning by the following command.

python word_to_vec.py [-c cuda.cudnn]

 

ですが、そのまま実行すると、「https://raw.githubusercontent.com/tomsercu/lstm/master/data/ptb.train.txt」を読み込んで延々と学習を始めます。

 

もう、いつ果てるともなく延々と・・。

 

自分は、実行させたまま寝ました。(だから、いつ終わったのか知りません。)

 

しかも、ptb.train.txtは英語ですから、長いこと待って結果が表示されても、いまいち面白くありません。

 

英語じゃつまらないので、日本語で遊べるようにしよう

 

このソースをちょっとだけ修正して、日本語のテキストファイルで遊んでみようと思います。

 

長くなるので、この記事は3回にわけます。

 

1回めである今回は、word_embedding.py を修正して、日本語のごく小さなテキストファイルを読み込んで、とりあえず、動かしてどんな結果が得られるかを確認します。

 

2回めは、ネットから何か適当なテキストデータをとってきて、自然言語処理をおこなって、Word2Vecで利用できるインプットデータを作るところまでやります。

 

3回めで、それを学習させて、その結果を利用して、任意の単語で類義語を取得して遊んでみようかなと思います。

 

さてでは一回目を続けていきます。 

 

サンプルソースを修正してオリジナルデータを使えるようにする

 

これ以降の説明は、以下の記事にそってインストールと環境設定をしてあることを前提にしています。

arakan-pgm-ai.hatenablog.com

 

それ以外の環境でインストールしている方は、読み替えてください。

 

まず、Activate nnabla で、nnabla環境にします。

 

IDLEを立ち上げます。

 

IDLEで、New Fileを開きます。

f:id:arakan_no_boku:20171008233505j:plain

 

前に書いたリンクからソースをコピーして貼り付けて、とりあえず、適当な名前で保存します。

 

自分は今回「my_word_embedding.py」にしました。

f:id:arakan_no_boku:20171008233043j:plain

 

2017/12/16追記

GitHub - sony/nnabla-examples: Neural Network Libraries https://nnabla.org/ - Examples

 >から、まるごとZIPファイルでダウンロードしてもいいです。

>その場合は、word-embeddingフォルダの下に「word_embedding.py」があります。

>それを開いて、別名保存してもいいです。

 

このソースを一部分だけ、修正していきます。

 

まず、URLからテキストファイルを読むのではなく、ローカルに用意したファイルを読み込むようにします。

 

まず、「def load_ptbset(ptbfile):」をみつけます。

 

その中で以下の行をコメントアウトします。

f = download(ptbfile)

 

その下に以下を書き足します。

f = open(ptbfile)

 

修正後は以下になります。

#f = download(ptbfile)
f = open(ptbfile)

 

次に、[「def main」以下の行を探して、コメントアウトします。

data_file = "https://raw.githubusercontent.com/tomsercu/lstm/master/data/ptb.train.txt"

 

その下に以下を書き足します。

data_file = "w2v_data.txt" 

 

修正後は以下の通りです。

#data_file = "https://raw.githubusercontent.com/tomsercu/lstm/master/data/ptb.train.txt"
data_file = "w2v_data.txt"

 

一旦、これで保存しておきます。

 

動作確認用データを作成する

 

ソース・ファイルと同じフォルダに、「w2v_data.txt」の名前でテキストファイルを作ります。

 

そこに適当な単語をいくつか書き込みます。

 

今回は、「男 女 出会う 恋 結婚」とでもしておきます。

 

注意点は2つです。

  • 単語と単語の間は空白で区切る。(全角空白もいけるみたいです)
  • 文字コードSJIS(CP932)にする。

 

これを保存します。

 

実行の前にあと一箇所だけ修正する必要があります。

 

ソースを開いて、以下の行を見つけます。

parser.add_argument("--max-check-words", "-mw", type=int, default=405)

 

ここの数が、読み込ますファイルの単語数より大きいとエラーになってしまいます。

 

さっき、用意したテキストデータの単語数は5つしかないので、ここの「405」を「5」にへ変更して保存します。

parser.add_argument("--max-check-words", "-mw", type=int, default=5)

 

これで実行します。

 

IDLEを使っているので、F5キーを押して実行します。

 

結果はこんな感じです。 

f:id:arakan_no_boku:20171009115126j:plain

 

画像だとちょっと見づらいですが、例えば「男」という単語に対して、近いと判断された単語順に並んでいるのがわかります。

 

それにしても、わずか5つの単語でしかないのに、ちょっと「ニヤリ」とするような結果がでてますね。

 

例えば、「男」に一番近いのが「恋」、対して「女」に一番違いのは「結婚」とか。

 

逆に「結婚」から一番遠い単語が「恋」とかね。

 

意図した結果でないだけに、ちょっと楽しめます。

 

続きます。

 

関連情報

NNabla関連の記事一覧はこちらです。

arakan-pgm-ai.hatenablog.com

 

ニューラルネットワークコンソール関連の記事一覧はこちらです。

arakan-pgm-ai.hatenablog.com

 

f:id:arakan_no_boku:20170910161122j:plain