FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Googleの言語構文解析ツールSyntaxNetを試行(チュートリアルを試行したが上手くいかない)

前回はSyntaxNetのインストールと最初の試行で終了したが、今回は中身について簡単に見て行こう。

msyksphinz.hatenablog.com

とは言っても、まだチュートリアルを完全に読了できていないので試行錯誤にはなるが。

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のフィードフォワードのネットワークだ。

https://github.com/tensorflow/models/raw/master/syntaxnet/ff_nn_schematic.png

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)

データセットのファイルが無い?何だろうなあ。