KNPの出力を例に格解析の重要性を説明してみる

KNPの紹介記事はいくつかあるのですが、この記事ではKNPの機能の一つである格解析機能の紹介をします。
というより、格解析が出来て何が嬉しいのかを実例を交えて紹介します。
KNPの基本的な使い方は、[この記事](http://qiita.com/Kensuke-Mitsuzawa/items/ca6967f0ce07a978f358)やそのリンク先を見てください。

# 格解析って何ぞや？
凄く大雑把に言うと、係り受け解析では分からない、用言と名詞の関係を解析する処理です。これだけではチンプンカンプンだと思うので実例を見てみましょう。

```
% echo "太郎は学校に行った" | juman | knp
# S-ID:1 KNP:4.17-CF1.1 DATE:2017/06/27 SCORE:-12.43451
太郎は═════╗　<体言><NE:PERSON:太郎>                                                                                                                                                                                                                                                                                   
学校に═════╣　<体言>                                                                                                                                                                                                                                                                                                   
        行った<用言:動><格解析結果:ガ/太郎;ニ/学校;デ/-;カラ/-;ヘ/-;時間/-;ノ/->
EOS
```
KNPはVersion 4.17からデフォルトで、構文木+主要なFeature(上記の例だと、`<体言>``<用言:動>``<NE:～>``<格解析結果:～>`の部分)となったようです。
格解析の説明だけなら`-tab`は必要ないので、今回はこの出力フォーマットで説明していきます。

格解析結果は、各用言に対して付与されます。この例では`行った`に`<格解析結果:ガ/太郎;ニ/学校;デ/-;カラ/-;ヘ/-;時間/-;ノ/->`が付与されています。
これを自然文っぽく書くと「太郎ガ 学校ニ 行った」という格構造を解析したということになります。また、「`行った`はガ格に`太郎`を取る」のような言い方をすることもあります。
ここでのポイントは表層では`太郎は行った`ですが、格解析ではガ格として扱うということです。「は」や「も」は提題助詞(topic marker)と呼ばれ、格解析の際の格としては扱わないことが普通です。「は」などの解析の難しさは後で触れます。

一般には格解析は述語項構造解析とほぼ同じ意味で用いられますが、格解析と言った場合には直接係り受けのある項のみを扱い、格の曖昧性を解消する側面が強いと思います。
一方、述語項構造解析と言う場合には、ゼロ照応解析などを含めた格構造の解析を指す場合もあります。ゼロ照応解析を含めた例は本記事の最後に扱います。

# 格解析の例
ここからは、複数の例を出しながら、係り受け解析では扱えない情報、そして格解析の難しさについて説明していきます。

## 並列構造の解釈
```
% echo "太郎と花子は学校に行った" | juman | knp
# S-ID:1 KNP:4.17-CF1.1 DATE:2017/06/27 SCORE:-12.43451
太郎と<P>══╗　　　　　<体言><NE:PERSON:太郎>                                                                                                                                                                                                                                                                              
花子は<P>═PARA═════╗　<体言><NE:PERSON:花子>                                                                                                                                                                                                                                                                          
        学校に═════╣　<体言>                                                                                                                                                                                                                                                                                           
                行った<用言:動><格解析結果:ガ/太郎;ガ/花子;ニ/学校;デ/-;カラ/-;ヘ/-;時間/-;ノ/->
EOS
```
この例では、`太郎`と`花子`の並列構造を扱っています。少し細かい話ですが、`太郎と`の文節は`花子は`の文節に係っています。どちらかというと基準決めの話になってしまいますが、単純な係り受けでは`太郎`と`行った`の関係は扱えないのです。


## 並列とト格
```
% echo "太郎は花子と学校に行った" | juman | knp
# S-ID:1 KNP:4.17-CF1.1 DATE:2017/06/28 SCORE:-17.42851
太郎は═════╗　<体言><NE:PERSON:太郎>                                                                                                                                                                                                                                                                                   
花子と═════╣　<体言><NE:PERSON:花子>                                                                                                                                                                                                                                                                                   
学校に═════╣　<体言>                                                                                                                                                                                                                                                                                                   
        行った<用言:動><格解析結果:ガ/太郎;ニ/学校;ト/花子;デ/-;カラ/-;ヘ/-;時間/-;ノ/->
EOS
```
先程の例と似ていますが、こちらではガ格が`太郎`のみになっていて、`花子`はト格となっています。
英語で言うと先程の例は`Taro and Hanako went to school.`でこちらは`Taro went to school with Hanako.`で、違いが分かりやすいと思います。

ト格って必要なの？という気もしますが、次のような構造があるので必要でしょう。

```
% echo "花子は弁護士と出頭した" | juman | knp
# S-ID:1 KNP:4.17-CF1.1 DATE:2017/06/28 SCORE:-14.63923
      花子は═════╗　<体言><NE:PERSON:花子>                                                                                                                                                                                                                                                                             
弁護═════╗　　　 ║　<体言>                                                                                                                                                                                                                                                                                            
        士と═════╣　<体言><Wikipediaエントリ:弁護士>                                                                                                                                                                                                                                                                   
            出頭した<用言:動><格解析結果:ガ/花子;ニ/-;ト/士;時間/-;ノ/->
EOS
```
この例では、`弁護士ガ出頭した`とは解釈しないですよね。

ト格の他の用例には以下のようなものもあります。

```
% echo "おはようと花子は言った" | juman | knp
# S-ID:1 KNP:4.17-CF1.1 DATE:2017/06/28 SCORE:-20.30315
おはようと═════╗　<体言>                                                                                                                                                                                                                                                                                               
    花子は═════╣　<体言><NE:PERSON:花子>                                                                                                                                                                                                                                                                               
            言った<用言:動><格解析結果:ガ/花子;ヲ/-;ニ/-;ト/おはよう;デ/-;カラ/-;時間/-;ノ/-;ガ２/->
EOS
```

## 連体修飾の格要素化
```
% echo "学校に行った太郎は先生に出会った" | juman | knp
# S-ID:1 KNP:4.17-CF1.1 DATE:2017/06/28 SCORE:-21.94986
学校に═════╗　　　　　　　　　<体言>                                                                                                                                                                                                                                                                                   
        行った═════╗　　　　　<用言:動><格解析結果:ガ/太郎;ニ/学校;デ/-;カラ/-;ヘ/-;時間/-;ノ/->                                                                                                                                                                                                                       
                太郎は═════╗　<体言><NE:PERSON:太郎>                                                                                                                                                                                                                                                                   
                先生に═════╣　<体言>                                                                                                                                                                                                                                                                                   
                      出会った<用言:動><格解析結果:ガ/太郎;ニ/先生>
EOS
```
この例では、`行った`に注目します。`行った`は`太郎は`の文節に係っています(連体修飾)。こういった連体修飾された要素が項になる現象は頻発します。
KNPでは、この連体修飾された項も格要素の候補として解析しているので`行った`のガ格が`太郎`と解釈できます。

```
echo "学校に行った太郎は先生に出会った" | juman | knp
# S-ID:1 KNP:4.17-CF1.1 DATE:2017/06/28 SCORE:-21.94986
学校に═════╗　　　　　　　　　<体言>                                                                                                                                                                                                                                                                                   
        行った═════╗　　　　　<用言:動><格解析結果:ガ/太郎;ガ/花子;ニ/学校;デ/-;カラ/-;ヘ/-;時間/-;ノ/->                                                                                                                                                                                                               
        太郎と<P>══╣　　　　　<体言><NE:PERSON:太郎>                                                                                                                                                                                                                                                                      
        花子は<P>═PARA═════╗　<体言><NE:PERSON:花子>                                                                                                                                                                                                                                                                  
                先生に═════╣　<体言>                                                                                                                                                                                                                                                                                   
                      出会った<用言:動><格解析結果:ガ/太郎;ガ/花子;ニ/先生>
EOS
```
もちろん並列構造があっても大丈夫です。

## ガ格以外の格要素
ここまでの例だと、表層形が分からない場合は、ガ格にしておけばいい例ばかりでした。

```
% echo "ケーキは花子が食べた" | juman | knp
# S-ID:1 KNP:4.17-CF1.1 DATE:2017/06/28 SCORE:-13.47873
ケーキは═════╗　<体言>                                                                                                                                                                                                                                                                                                 
  花子が═════╣　<体言>                                                                                                                                                                                                                                                                                                 
          食べた<用言:動><格解析結果:ガ/花子;ヲ/ケーキ;ニ/-;ト/-;デ/-;カラ/-;ヘ/-;時間/-;ノ/->
EOS
```
このように、表層では`は`がヲ格になる場合もあります。

```
% echo "花子が食べたケーキはスーパーで買った" | juman | knp
# S-ID:1 KNP:4.17-CF1.1 DATE:2017/06/28 SCORE:-31.71838
花子が═════╗　　　　　　　　　<体言><NE:PERSON:花子>                                                                                                                                                                                                                                                                   
        食べた═════╗　　　　　<用言:動><格解析結果:ガ/花子;ヲ/ケーキ;ニ/-;ト/-;デ/-;カラ/-;ヘ/-;時間/-;ノ/->                                                                                                                                                                                                           
              ケーキは═════╗　<体言>                                                                                                                                                                                                                                                                                   
            スーパーで═════╣　<体言>                                                                                                                                                                                                                                                                                   
                        買った<用言:動><格解析結果:ガ/-;ヲ/ケーキ;ニ/-;デ/スーパー;時間/-;ノ/-;ガ２/->
EOS
```
この例では、`食べた`で連体修飾の`ケーキ`をヲ格としています。
また、`買った`でも`ケーキ`をヲ格にしています。前の例では、ガ格が埋まっていたので、ヲ格と推定するのは比較的簡単でしたが、今回はガ格も空いているので、`ケーキ`をガ格にするかヲ格にするかを処理する必要があり、より難しい問題だったと言えます。

# ゼロ照応解析
ところで、前の例では、ガ格が空いていますが、誰がケーキをスーパで買ったんでしょう？
これを解くのがゼロ照応解析です。knpでは-anaphoraオプションで動作します。

```
% echo "花子が食べたケーキはスーパーで買った" | juman | knp -anaphora
# S-ID:1 KNP:4.17-CF1.1 DATE:2017/06/28 SCORE:-31.71838
花子が═════╗　　　　　　　　　<体言><NE:PERSON:花子><EID:0>                                                                                                                                                                                                                                                            
        食べた═════╗　　　　　<用言:動><EID:1><項構造:食べる/たべる:動1:ヲ/N/ケーキ/2;ガ/C/花子/0>                                                                                                                                                                                                                     
              ケーキは═════╗　<体言><EID:2><項構造:ケーキ/けーき:名1>                                                                                                                                                                                                                                                  
            スーパーで═════╣　<体言><EID:3><項構造:スーパー/すーぱー:名1>                                                                                                                                                                                                                                              
                        買った<用言:動><EID:4><項構造:買う/かう:動12:ヲ/N/ケーキ/2;デ/C/スーパー/3;ガ/O/花子/0>
EOS
```
少し出力のフォーマットが変わりましたが、`買った`の`<項構造:～>`を見てみましょう。
最後に`ガ/O/花子/0`とありますが、`買った`のガ格が`花子`と解析しているようです。


# 遅くてもリッチな解析にKNP
[KNPは遅くないという話もあるんです](http://fvcrc.i.nagoya-u.ac.jp/~sasano/knp/knp-4.1.pdf)が、今回紹介した格解析やゼロ照応解析ははっきし言って遅いです。特に複数文入力した時のゼロ照応解析。
ですが、係り受け解析では分からないリッチな情報を扱える強みは、時間に代え難いものです。
皆さんも是非KNPの高度な解析を使いこなして、周りに一歩差をつけた自然言語処理ライフを送りましょう。