アラカン"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