# 構文解析器の使い方

English version

- Enju の起動
- 出力フォーマット
- コマンドライン引数
- 環境変数

## Enju の起動

`enju`コマンドまたは`mogura`コマンドを実行してください． `enju`は解析速度は遅いが高精度，`mogura`はやや精度が落ちるが高速なパーザです．

コマンドを実行すると，文法のデータファイルを読み込み，入力待ちになります．

    % enju
    Enju 2.4
    Copyright (c) 2005-2009, Tsujii Laboratory, The University of Tokyo.
    All rights reserved.
    Loading grammar module "enju/grammar"... done.
    Loading FOM module "enju/synmodel"... done.
    Loading parser module "mayz/up"... done.
    Loading module "enju/outputdep"... done.
    Initializing parser...
      Initializing external tagger: /usr/local/bin/stepp -e -m /usr/local/share/stepp/models_wsj02-21c
      Initializing morphological analyzer: /usr/local/bin/enju-morph -s /usr/local/lib/enju/DATA
      Initializing supertagger:
        lexicon:   /usr/local/lib/enju/DATA/Enju.lexicon
        model:     /usr/local/share/enju/enju-super.conf
        parameter: /usr/local/lib/enju/DATA/Enju-lex.output.gz
      Loading template database: /usr/local/lib/enju/DATA/Enju.templates
      Loading Syntax FOM model: /usr/local/lib/enju/DATA/Enju-syn.output.gz
      done.
    done.
    Ready

ここで文を一行で入力して下さい． すると，解析結果が標準出力に出力されます． 以下の例は，"Enju is an efficient HPSG parser." という文を入力したときの出力結果です．

    ROOT      ROOT      ROOT    ROOT    -1      ROOT            ROOT    is      be      VBZ     VB      1
    is        be        VBZ     VB      1       verb_arg12      ARG1    Enju    enju    NNP     NNP     0
    is        be        VBZ     VB      1       verb_arg12      ARG2    parser  parser  NN      NN      5
    an        an        DT      DT      2       det_arg1        ARG1    parser  parser  NN      NN      5
    efficient efficient JJ      JJ      3       adj_arg1        ARG1    parser  parser  NN NN       5
    HPSG      hpsg      NNP     NNP     4       noun_arg1       ARG1    parser  parser  NN      NN      5

## 出力フォーマット

Enju は，述語-項関係フォーマット，XML フォーマット，stand-off フォーマットでの出力をサポートしています． また，CGI サーバとして XML フォーマットを返すインタフェースもあります．

### 述語-項関係フォーマット

デフォルトでは，単語間の述語-項関係が出力されます． 例えば，他動詞 love は２つの名詞句を項としてとるので，たとえば "I love you." という文を解析すると，love と I の述語-主語関係，love と you の述語-目的語関係が出力されます． 一行が一つの述語-項関係，空行が文の終わりを表します． 各行の各カラムは，タブで区切られ，以下の情報を表しています．

- 述語の単語の入力文字列
- 述語の単語の base form
- 述語の単語の品詞 (Penn Treebank 形式)
- 述語の単語の base form の品詞 (Penn Treebank 形式)
- 述語の単語の位置(0から始まる)
- 述語の型
- 述語と項の関係のラベル (MOD, ARG1, ..., ARG4)
- 項の単語の入力文字列
- 項の単語の base form
- 項の単語の品詞 (Penn Treebank 形式)
- 項の単語の base form の品詞 (Penn Treebank 形式)
- 項の単語の位置(0から始まる)

始めの行は，文全体の主辞(ルート)となる述語を表しています． この行では，述語は ROOT という文字列で表され，関係の型とラベルも ROOT となっています． また，項が未知の場合(省略など)，その単語や品詞は UNKNOWN と出力されます．

単語の位置は，0 から始まる整数で表されます． 上の例では，Enju は 0, is は 1, ... そして parser が 6 になります． ピリオドや疑問符など，品詞が "." の単語は無視されます． ROOT と UNKNOWN の単語位置は -1 と出力されます．

述語と項の関係のラベルは，MOD, ARG1, ..., ARG4 の５つのうちの１つで表されます． ARG1 は動詞の主語や修飾語(形容詞や前置詞など)の修飾先を指します． ARG2 は動詞，前置詞，名詞などの目的語を指します． ARG3 以降も同様に動詞などの目的語を指します． MOD は，分詞構文などにおいて動詞句や副詞句が動詞句を修飾し，その動詞句が主語とならない時，その修飾先を指します．

述語は必ずしも統語上の主辞ではありません． 上の例で，"an efficient HPSG parser" の主辞は "parser" ですが，"parser" は述語 "efficient" の項となります． これは，例えば "An HPSG parser is efficient" の "parser" と"efficient" の関係も同じ述語-項関係で表すためです．

文全体を解析することに失敗した場合は，部分的な解析結果が出力されます． このときは，解析できた各部分について ROOT 行が出力されるため，ROOT 行が複数出力されます． また，述語-項関係が連結グラフにならないことがあります．

構文解析が失敗した場合は，"Parsing failure:" と出力され，その後に失敗の原因が表示されます．

### XML フォーマット

Enju は，XML 形式や stand-off 形式での出力もサポートしています． Enju の起動時に -xml オプションを指定すると XML 形式で，-so オプションを指定すると stand-off 形式で出力されます． これらの形式では，単語間の述語-項関係だけでなく，句構造も出力されます．

XML 形式では，述語-項関係と句構造が XML のタグおよび属性で表されます． 一文の構造が一行に出力されます． 以下の例は，"Enju is an efficient HPSG parser." を入力したときの結果です（実際は一行で出力されます）．

    <sentence id="s0" parse_status="success"><cons id="c0" cat="S" xcat="" head="c3" sem_head="c3"
    schema="subj_head"><cons id="c1" cat="NP" xcat="" head="c2" sem_head="c2" schema="empty_spec_head">
    <cons id="c2" cat="NX" xcat="" head="t0" sem_head="t0"><tok id="t0" cat="N" pos="NNP" base="enju"
    lexentry="[D&lt;N.3sg&gt;]_lxm" pred="noun_arg0">Enju</tok></cons></cons> <cons id="c3" cat="VP"
    xcat="" head="c4" sem_head="c4" schema="head_comp"><cons id="c4" cat="VX" xcat="" head="t1"
    sem_head="t1"><tok id="t1" cat="V" pos="VBZ" base="be" tense="present" aspect="none" voice="active"
    aux="minus" lexentry="[NP.nom&lt;V.cpl.bse&gt;NP.acc]_lxm-singular3rd_verb_rule" pred="verb_arg12"
    arg1="c1" arg2="c5">is</tok></cons> <cons id="c5" cat="NP" xcat="" head="c7" sem_head="c7"
    schema="spec_head"><cons id="c6" cat="DP" xcat="" head="t2" sem_head="t2"><tok id="t2" cat="D"
    pos="DT" base="an" lexentry="[&lt;D&gt;]N" pred="det_arg1" arg1="c7">an</tok></cons> <cons id="c7"
    cat="NX" xcat="" head="c9" sem_head="c9" schema="mod_head"><cons id="c8" cat="ADJP" xcat="" head="t3"
    sem_head="t3"><tok id="t3" cat="ADJ" pos="JJ" base="efficient" lexentry="[&lt;ADJP.adj&gt;]N"
    pred="adj_arg1" arg1="c9">efficient</tok></cons> <cons id="c9" cat="NX" xcat="" head="c11"
    sem_head="c11" schema="mod_head"><cons id="c10" cat="NP" xcat="" head="t4" sem_head="t4"><tok id="t4"
    cat="N" pos="NNP" base="hpsg" lexentry="[D&lt;N.3sg&gt;]_lxm-noun_adjective_rule" pred="noun_arg1"
    arg1="c11">HPSG</tok></cons> <cons id="c11" cat="NX" xcat="" head="t5" sem_head="t5"><tok id="t5"
    cat="N" pos="NN" base="parser" lexentry="[D&lt;N.3sg&gt;]_lxm" pred="noun_arg0">parser</tok></cons>
    </cons></cons></cons></cons></cons>.</sentence>

文全体は<sentence>タグで出力されます． 構文解析が成功した場合は，parse_status 属性の値が "success" となります． 句構造は，<cons> タグで表されます． 句の構成素を<cons> タグで囲み，cat 属性でその句のシンボルを表します． たとえば，名詞句の"an efficient HPSG parser" は，<cons cat="NP">an efficient HPSG parser</cons> と表します．

それぞれの単語は，<tok> タグで囲んで出力されます． 属性 pos, base がそれぞれ品詞と base form を表します．cat 属性は cons タグと同じです．

cons および tok タグには，テキスト中で一意の ID 番号が割り当てられます． ID 番号は id 属性で表示されます． cons タグには head 属性があり，これは子供の cons または tok の中で，syntactic head (統語上の主辞) になっているもののID 番号を表します． また，sem_head は意味上の主辞の ID 番号を表します． 例えば，助動詞句では，head 属性は助動詞の ID を指しますが，sem_head 属性は動詞句の ID を指します．

単語の述語-項関係は，tok タグの中の mod, arg1, arg2, ..., arg4 属性で表します． 述語になる単語の中の各属性は，項になる句の ID 番号を表します． 上の例では，"is" を囲んでいる tok タグでは，arg1="c1" arg2="c5" と出力されていますが，これはそれぞれ "Enju" と "an efficient HPSG parser" を支配する句の ID 番号になっています．

文全体を解析することに失敗した場合は，部分的な解析結果が出力されます． この時，parse_status 属性の値は "fragmental parse" になります． <sentence>タグの直下に複数の<cons>タグが出力され，それぞれが部分解析結果に相当します．

構文解析に失敗した場合は，parse_status 属性の値が失敗原因を表す文字列になります． <cons>や<tok>タグは出力されません．

XML フォーマットでは，それ以外にもさまざまな文法情報が出力されます． 詳しくは "Enju OutputSpecifications" を参照してください．

### Stand-off フォーマット

Stand-off 形式では，XML の各タグが支配する領域を，元の入力テキストの文字位置で出力します． 一行が一つのタグに相当します． 上の例の XML 出力は，以下のような stand-off 形式で出力されます．

    0       33      sentence id="s0" parse_status="success"
    0       32      cons id="c0" cat="S" xcat="" head="c3" sem_head="c3" schema="subj_head"
    0       4       cons id="c1" cat="NP" xcat="" head="c2" sem_head="c2" schema="empty_spec_head"
    0       4       cons id="c2" cat="NX" xcat="" head="t0" sem_head="t0"
    0       4       tok id="t0" cat="N" pos="NNP" base="enju" lexentry="[D&lt;N.3sg&gt;]_lxm" pred="noun_arg0"
    5       32      cons id="c3" cat="VP" xcat="" head="c4" sem_head="c4" schema="head_comp"
    5       7       cons id="c4" cat="VX" xcat="" head="t1" sem_head="t1"
    5       7       tok id="t1" cat="V" pos="VBZ" base="be" tense="present" aspect="none" voice="active" aux="minus" lexentry="[NP.nom&lt;V.cpl.bse&gt;NP.acc]_lxm-singular3rd_verb_rule" pred="verb_arg12" arg1="c1" arg2="c5"
    8       32      cons id="c5" cat="NP" xcat="" head="c7" sem_head="c7" schema="spec_head"
    8       10      cons id="c6" cat="DP" xcat="" head="t2" sem_head="t2"
    8       10      tok id="t2" cat="D" pos="DT" base="an" lexentry="[&lt;D&gt;]N" pred="det_arg1" arg1="c7"
    11      32      cons id="c7" cat="NX" xcat="" head="c9" sem_head="c9" schema="mod_head"
    11      20      cons id="c8" cat="ADJP" xcat="" head="t3" sem_head="t3"
    11      20      tok id="t3" cat="ADJ" pos="JJ" base="efficient" lexentry="[&lt;ADJP.adj&gt;]N" pred="adj_arg1" arg1="c9"
    21      32      cons id="c9" cat="NX" xcat="" head="c11" sem_head="c11" schema="mod_head"
    21      25      cons id="c10" cat="NP" xcat="" head="t4" sem_head="t4"
    21      25      tok id="t4" cat="N" pos="NNP" base="hpsg" lexentry="[D&lt;N.3sg&gt;]_lxm-noun_adjective_rule" pred="noun_arg1" arg1="c11"
    26      32      cons id="c11" cat="NX" xcat="" head="t5" sem_head="t5"
    26      32      tok id="t5" cat="N" pos="NN" base="parser" lexentry="[D&lt;N.3sg&gt;]_lxm" pred="noun_arg0"

行中の要素はタブで区切られています． はじめの要素はタグの開始位置，２つめは終了位置です． 位置は入力テキスト中の絶対位置です． ３つめがタグの内容を表します． 始めにタグのラベル (cons や tok など) が出力され，その後に属性が出力されます． タグや属性は XML フォーマットと同じです．

### CGI サーバ

Enju を HTTP サーバとして利用することで，ネットワーク経由で enju が利用できます． Enju を "-cgi ポート番号" オプション付きで起動すると，Enju は CGI サーバとして動作します． オプションで起動したポート番号の "/cgi-lilfes/enju?" にアクセスし，CGI 引数として "sentence" に文を与えると，その文の解析結果が XML 形式で返されます．

例えば，localhost で "enju -cgi 10000" を起動して，

    http://localhost:10000/cgi-lilfes/enju?sentence=Enju+is+an+efficient+HPSG+parser.

にアクセスすると，上で示した XML 出力と同じ結果が得られます．

引数なしで "/cgi-lilfes/enju?" にアクセスすると，簡単な HTML フォームが返されます． XHTML, Javascript と XSLT をサポートしたウェブブラウザ（例えば FireFox）を利用すれば，このインタフェースで CGI サーバの動作を試すことができます．

### その他

自分で lilfes プログラムを書くことによって，Enju が出力する構文解析結果の詳細な情報を利用して，自分なりの出力を得ることができます． 例えば，上で説明した述語-項関係や XML 出力は，実際は HPSG 構文解析の結果を LiLFeS プログラム(outputdep.lil, outputxml.lil) で変換することで計算されています． 構文解析結果にアクセスする詳しい方法については，発展的な使い方を参照して下さい．

## コマンドライン引数

Enju の起動時に，オプションやコマンドライン引数で動作を指定することができます． 以下は主なオプションとコマンドライン引数です．

enju [オプション] [-a 引数]
"-a" オプションより後ろの引数は，コマンドライン引数として LiLFeS プログラムに渡されます．
オプション
-h | ヘルプを表示する
-hh | 詳しいヘルプを表示する
-D ディレクトリ | 文法ファイルが置いてあるディレクトリを指定する．
-L ディレクトリ | LiLFeS モジュールのサーチパスを指定する （LILFES_PATH 環境変数の先頭に追加される）．
-t タガー | 品詞タガーを指定する．
-m ステマー | ステマーを指定する．
-s スーパータガー | 外部のスーパータガー(語彙項目割り当て器)を使う．
-nt | 品詞タガーを使わない．
-d | 述語-項関係フォーマットで出力する．
-xml | XML 形式で出力する．
-so | stand-off 形式で出力する．
-conll | CoNLL 形式で出力する．
-cgi ポート番号 | CGI サーバを起動する．
-genia | 生物医学文献用の構文解析モデルを使う．
-brown | 文学・小説用の構文解析モデルを使う．
-A | 品詞タガーの曖昧出力を使う（精度が向上するが速度が落ちる）．
-N 数 | Nベストの解析結果を出力する．
-W 数 | 単語数の上限値を設定する．
-l モジュール名 | LiLFeS モジュールをロードする．
-e LiLFeSコマンド | LiLFeS プログラムを実行する．
-i | インタラクティブモードにする(lilfes コマンドプロンプトを表示する)．
-n | インタラクティブモードにしない．

オプション "-l" で lilfes モジュールを指定した場合は，そのモジュールを読みこみます． オプション "-e" で lilfes コマンドを指定した場合は，それを実行します． インタラクティブモードの場合は，lilfes のコマンドプロンプトを表示して，lilfes コマンドの入力待ちとなります． Ctrl-D を押すとインタラクティブモードは終了します．

## 環境変数

文法データや LiLFeS モジュールをデフォルトの場所以外にインストールした場合は，以下の環境変数を設定し，インストール場所を Enju に教える必要があります． 環境変数の値は， コマンドライン引数の値で上書きされます．

環境変数 | 説明
--- | ---
ENJU_PREFIX | Enju をインストールしたディレクトリを指定する （文法データ，デフォルトの品詞タガーとステマーの場所が影響を受ける）
ENJU_DIR | 文法ファイルのディレクトリを指定する（-D オプショ ンに相当）
ENJU_TAGGER | 品詞タガーを指定する（-t オプションに相当）
LILFES_PATH | LiLFeS モジュールの探索パスを指定する（-L オプ ションに相当）
LD_LIBRARY_PATH | liblilfes の場所を指定する．

Enju の使い方 Enju ホームページ 辻井研究室