またしてもTensorFlow系の派生形ツールが登場した。SyntaxNetというツールらしい。 いわゆる自然言語構文を解析するツールで、解析精度はGoogleいわくかなり高い。
Google Open Source Blog: Announcing SyntaxNet: The World’s Most Accurate Parser Goes Open Source
githubで公開されたのはTensorFlowに統合されたSyntaxNetフレームワークと、英文に最適化された構文解析ツールParsey McParsefaceというパッケージ。 Parsey McParsefaceについては良く分からないが、SyntaxNetを英語構文向けに最適化したという話なのかな?
SyntaxNetのインストール手順
試行した環境はUbuntu 14.04LTS on Vagrantだ。新しいVagrantの仮想マシンを作成してそのうえで行った。
models/syntaxnet at master · tensorflow/models · GitHub
Bazelのインストール
Googleのビルド環境はほとんどBazelに統合されているのだろうか。まずはBazel-0.2.2をインストールする。 現在公開されている最新のBazel-0.2.2.bではダメらしい。
$ sudo add-apt-repository ppa:webupd8team/java $ sudo apt-get update $ sudo apt-get install oracle-java8-installer $ sudo apt-get install pkg-config zip g++ zlib1g-dev unzip
Pythonもインストールしておく。
$ sudo apt-get install python python-dev python-pip python-numpy
さらに各種パッケージをインストールしておく。
apt-get install swig
SyntaxNetのビルド
これもインストールマニュアルに従えばよい。ただしかなりハマったのだが、メモリが4GB程度では全くビルドできない。Memoryが足りずに途中でコンパイルに失敗したため、仮想マシンの数を1つに絞り、12GBのメモリを割り当てるとビルドができるようになった。ビルドにはおよそ30分かかった。
$ git clone --recursive https://github.com/tensorflow/models.git $ cd models/syntaxnet/tensorflow $ ./configure $ cd .. $ bazel test syntaxnet/... util/utf8/... ... At global scope: cc1plus: warning: unrecognized command line option "-Wno-self-assign" [enabled by default] INFO: From Compiling external/tf/tensorflow/core/util/memmapped_file_system_writer.cc [for host]: external/tf/tensorflow/core/util/memmapped_file_system_writer.cc: In function 'tensorflow::StringPiece tensorflow::{anonymous}::EncodeUint64LittleEndian(tensorflow::uint64, char*)': external/tf/tensorflow/core/util/memmapped_file_system_writer.cc:86:36: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] for (int i = 0; i < sizeof(uint64); ++i) { ^ INFO: From Compiling external/tf/tensorflow/core/lib/strings/numbers.cc [for host]: external/tf/tensorflow/core/lib/strings/numbers.cc: In function 'bool tensorflow::strings::safe_strtou64(tensorflow::StringPiece, tensorflow::uint64*)': external/tf/tensorflow/core/lib/strings/numbers.cc:164:37: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] if ((kuint64max - digit) / 10 < result) { ^ INFO: Elapsed time: 746.872s, Critical Path: 709.78s //syntaxnet:arc_standard_transitions_test PASSED in 0.1s //syntaxnet:beam_reader_ops_test PASSED in 11.9s //syntaxnet:graph_builder_test PASSED in 9.7s //syntaxnet:lexicon_builder_test PASSED in 0.8s //syntaxnet:parser_features_test PASSED in 0.1s //syntaxnet:parser_trainer_test PASSED in 40.3s //syntaxnet:reader_ops_test PASSED in 2.8s //syntaxnet:sentence_features_test PASSED in 0.0s //syntaxnet:shared_store_test PASSED in 0.5s //syntaxnet:tagger_transitions_test PASSED in 0.0s //syntaxnet:text_formats_test PASSED in 0.8s //util/utf8:unicodetext_unittest PASSED in 0.0s $
Getting Startedを実行してみる
以下のように文章を渡してみる。
$ echo 'Bob brought the pizza to Alice.' | syntaxnet/demo.sh I syntaxnet/term_frequency_map.cc:101] Loaded 46 terms from syntaxnet/models/parsey_mcparseface/label-map. ...
すごい勢いでログを吐き始めた。最後に、以下のように出力される。
INFO:tensorflow:Read 1 documents Input: Bob brought the pizza to Alice . Parse: brought VBD ROOT +-- Bob NNP nsubj +-- pizza NN dobj | +-- the DT det +-- to IN prep | +-- Alice NNP pobj +-- . . punct
おお、解析できている。