自然言語処理メモ

自然言語処理メモ

gensimによるword2vec

まずはjanomeなどを使って、各sentenceがtokenizeされた以下のようなリストsentencesを用意する。

あるていどの分量を用意しないと「RuntimeError: you must first build vocabulary before training the model」というエラーになる。

sentencesをgensimに与えて単語をベクトル化し、ファイルに保存する。

まずはどんなベクトルになったか確認。

今回のデータ量では7つの単語しかベクトル化されない。

ベクトル化された単語は以下。

単語をベクトルに変換。

vec.wv.vectorsとvec.wv.index2wordの順序は対応している。

ベクトルを単語に変換するには、vec.wv.most_similarメソッドを使ってcos類似度がいちばん高いものを選ぶ。

ググったりコード補完で調べたが、単語からIDに変換するメソッドやフィールドはもってないっぽい。自分で関数をつくった。

モデルをある状態に持っていってから文章生成したい場合

stateful=Trueにしてからpredictすると状態が更新されていくっぽい(参考)。ただ、ほんとうに更新されているかどうかどうやって確認していいかがわからない。たぶんFunctional APIを使わないと無理。あるいはtensorflowまで降りていくか。いやだなー。

「ゼロから作るDeep Learning2」は↓のようなコードが7章にあったので、predictで状態が更新されていくのはまちがいない。

参考リンクに貼られていた公式FAQに明言されていた。

predict, fit, train_on_batch, predict_classesなどの関数はいずれもstatefulレイヤーの状態を更新することに注意してください.そのため,statefulな訓練だけでなく,statefulな予測も可能となります.

predictで状態が更新されるということでまちがいない。

都度状態をとっておいてバックする方法

stateful=Trueにする以外にも、出力と一緒に状態もとっておいて、それらをデコーダーにフィードバックする方法もあるみたい。predict時にreturn_state=Trueで状態も出力するようにしておいて、それをinitial_stateをとおしてLSTMに与えるんだね(最後のソースの8-9行目と37-38行目と56行目)。冗長な書き方な気もするけど、直観的に理解しやすい。この書き方とstateful=Trueにするほうとで同じ結果になれば動作確認になる。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする