前回はSyntaxNetのインストールと最初の試行で終了したが、今回は中身について簡単に見て行こう。
とは言っても、まだチュートリアルを完全に読了できていないので試行錯誤にはなるが。
SyntaxNetが構文解析をする仕組み
チュートリアルをまとめると、SyntaxNetが英語構文を解析する仕組みは以下のようになる。
基本的に英語構文は左から右へ読み進めていく。これが成立するのは、左側(ひとつ前の単語)を読めば、その次の単語がどのような種類の単語が来るかはある程度想像できるからであるとのことらしい。
まずは、POS(Part-of-Speech)タグ付けから見ていく。POSとは、英文の中で、それぞれの単語がどのような立ち位置にあるのか、タグ付けを行っていく処理である。
前回の例でいうならば、I saw the man with glasses.
という単語を、
Parse: saw VBD ROOT +-- I PRP nsubj +-- man NN dobj | +-- the DT det +-- with IN prep | +-- glasses NNS pobj +-- . . punct
という分類にする処理に該当する。
以下の図がすべてを語っている(?)のだが、使っているのはTensorFlowのフィードフォワードのネットワークだ。
models/syntaxnet at master · tensorflow/models · GitHub より抜粋。
Stackに格納されているのはすでにタグ付けが完了した単語群だ。ここでは、I saw the
までが完了している。次にこれらの行列に変換し、簡単なフィードフォワードのTonsorFlowニューラルネットワークモデルを通すことにより、次に登場する単語を予測するという訳だ。非常にシンプルなモデルだが、これでうまくいくんだろうか。
例としてサンプルスクリプトが用意されているが、これが実行してみても上手くいかなかった。
$ ./bazel-bin/syntaxnet/parser_trainer --task_context=./syntaxnet/context.pbtxt --arg_prefix=brain_pos --compute_lexicon --graph_builder=greedy --training_corpus=training-corpus --tuning_corpus=tuning-corpus --output_path=models --batch_size=32 --decay_steps=3600 --hidden_layer_sizes=128 --learning_rate=0.08 --momentum=0.9 --seed=0 --params=128-0.08-3600-0.9-0 INFO:tensorflow:Computing lexicon... F ./syntaxnet/proto_io.h:187] Check failed: ::tensorflow::Status::OK() == (tensorflow::Env::Default()->NewRandomAccessFile(filename_, &file)) (OK vs. Not found: <your-dataset>/treebank-train.trees.conll)
データセットのファイルが無い?何だろうなあ。