FPGA開発日記

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

Googleの言語構文解析ツールSyntaxNetを試行(CONLLの理解)

前回はSyntaxNetを使って何か構文解析を試行しようとして、上手くいかなくて終了したのだった。

msyksphinz.hatenablog.com

よくよく読んでみると、CONLLというフォーマットの資料を利用して構文解析ツールのトレーニングをしてやる必要があるらしい。

CONLLとは

osdn.jp

CONLLとは、"Conference on Natural Language Learning"という学会て規定された(?)自然言語の構文を表記するためのフォーマットらしい。

ある文章があると、それを品詞、詳細な品詞、さらに係りの関係などを表現する。

ID: 文内のトークン番号で、1から開始される。
FORM: 表層形(句読点等も含む)
LEMMA: 基本形
CPOSTAG: 品詞の上位分類
POSTAG: 品詞の詳細分類
FEATS: 付加的属性。属性は制御文字および"|"以外の文字列で表される。複数の属性を持つ場合、"|"によって結合して一つの文字列とする。
HEAD: 現トークンのHEAD(係り先)トークンのID。なければ0。
DEPREL: 係りの種別(文字列)。
PHEAD: 使用しません。
PDEPREL: 使用しません。

となっており、SyntaxNetでは以下のセットを使用していると書いてある(これが無料で使用可能だから)。

https://osdn.jp/projects/chaki/wiki/CONLL%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88/attach/158.png

Universal Dependencies

中身を見てみると、なるほど、英文が構文の情報を示した形で格納してある。以下は、"Two of them were being run by 2 officials of the Ministry of the Interior!"を構文解析したときの情報。

1       Two     two     NUM     CD      NumType=Card    6       nsubjpass       _       _
2       of      of      ADP     IN      _       3       case    _       _
3       them    they    PRON    PRP     Case=Acc|Number=Plur|Person=3|PronType=Prs      1       nmod    _       _
4       were    be      AUX     VBD     Mood=Ind|Tense=Past|VerbForm=Fin        6       aux     _       _
5       being   be      AUX     VBG     VerbForm=Ger    6       auxpass _       _
6       run     run     VERB    VBN     Tense=Past|VerbForm=Part|Voice=Pass     0       root    _       _
7       by      by      ADP     IN      _       9       case    _       _
8       2       2       NUM     CD      NumType=Card    9       nummod  _       _
9       officials       official        NOUN    NNS     Number=Plur     6       nmod    _       _
10      of      of      ADP     IN      _       12      case    _       _
11      the     the     DET     DT      Definite=Def|PronType=Art       12      det     _       _
12      Ministry        Ministry        PROPN   NNP     Number=Sing     9       nmod    _       _
13      of      of      ADP     IN      _       15      case    _       _
14      the     the     DET     DT      Definite=Def|PronType=Art       15      det     _       _
15      Interior        Interior        PROPN   NNP     Number=Sing     12      nmod    _       SpaceAfter=No
16      !       !       PUNCT   .       _       6       punct   _       _

これらの情報を使ってまずは訓練してやらないといけないということか。 まずは、bazelのparser_trainingを使って実行してみよう。

syntaxnet/context.pbtxtを編集して、trainingのコンテキストを設定してみよう。training-corpus, tuning-corpus, dev-corpus を書き換えてみる。

input {
  name: 'training-corpus'
  record_format: 'conll-sentence'
  Part {
    file_pattern: '/home/vagrant/work/ud-treebanks-v1.3/UD_English/en-ud-train.conllu'
  }
}
input {
  name: 'tuning-corpus'
  record_format: 'conll-sentence'
  Part {
    file_pattern: '/home/vagrant/work/ud-treebanks-v1.3/UD_English/en-ud-dev.conllu'
  }
}
input {
  name: 'dev-corpus'
  record_format: 'conll-sentence'
  Part {
    file_pattern: '/home/vagrant/work/ud-treebanks-v1.3/UD_English/en-ud-test.conllu'
  }
}

これで、トレーニングを実行してみたのだが、エラーで落ちてしまった。

bazel-bin/syntaxnet/parser_trainer \
  --task_context=syntaxnet/context.pbtxt \
  --compute_lexicon \
  --arg_prefix=brain_pos \
  --graph_builder=greedy \
  --training_corpus=training-corpus \  # names of training/tuning set
  --tuning_corpus=tuning-corpus \
  --output_path=models \  # where to save new resources
  --batch_size=32 \       # Hyper-parameters
  --decay_steps=3600 \
  --hidden_layer_sizes=128 \
  --learning_rate=0.08 \
  --momentum=0.9 \
  --seed=0 \
  --params=128-0.08-3600-0.9-0  # name for these parameters

F syntaxnet/term_frequency_map.cc:166] Check failed: category == it->second (VERB vs. AUX)POS tag cannot be mapped to multiple coarse POS tags. 'VB' is mapped to: 'VERB' and 'AUX'

うーん、確かにトレーニングセットを見ると、VBという詳細文るいはVERBとAUXの両方に割り当てられている。これらはどのように処理すればいいのだろう?

まだまだ試行は続く。。。