コロナ社「構文解析」本のレビュー

# はじめに

自然言語処理シリーズの「[文脈解析](http://www.coronasha.co.jp/np/isbn/9784339027600/)」本の[レビュー](http://qiita.com/hiro5585/items/ba8ff6d29c5029a0fe46)に引き続き、
「[構文解析](http://www.coronasha.co.jp/np/isbn/9784339027594/)」本を手に入れたのでレビューしたいと思います。


<a href="http://www.coronasha.co.jp/np/isbn/9784339027594/"><img width="150" alt="文脈解析" src="https://qiita-image-store.s3.amazonaws.com/0/184122/b206e7ca-6591-18d4-5a62-b33d043f6bda.jpeg"></a>

構文解析とは、文の背後にある「構造」を抽出する処理のことを指します。
例えば、どの単語とどの単語が一つのまとまりなのかであったり、
どの単語がどの単語に係っているかなどを見つけることです。

そして、抽出した「構造」に「意味」を与えるのが文脈解析です。
今の例だと、ある単語が別の単語に係っている時に、どういう意味関係かを推定するのが文脈解析です。

そのため、構文解析と文脈解析は処理タスクとして共通している部分も多く、
例えば、KNPなどのツールでは、両方の解析結果を同時に出力してくれます。
この本では、「構造」と「意味」を分解した際の前者を説明した本になります。

自然言語処理全体の解析レイヤーを図で示すと以下のようになり、
主に、この図の「構文解析」と、その下位レイヤーの「形態素解析」について書かれています。

<a href="https://qiita-image-store.s3.amazonaws.com/0/184122/25389911-a03d-0035-d612-90d49f4c2046.png"><img width="30%" alt="文脈解析" src="https://qiita-image-store.s3.amazonaws.com/0/184122/25389911-a03d-0035-d612-90d49f4c2046.png"></a>

## 総評


「[文脈解析](http://www.coronasha.co.jp/np/isbn/9784339027600/)」本では、意味の概念やタスク設定などに重きを置いてましたが、
今回は**現実に解く**ことに主眼を置いており、手法の話が詳しく書いてあります。

それは、「文脈解析」では意味やタスク設定自体を定義することが難しく、
それを定義することそのものが価値になっているためです。

一方で、「構文解析」は概念としての曖昧さが少なく、
解く問題がはっきりしているため、どう解くかに主眼を置いているからです。
そのため、具体的な解析手法である機械学習の説明が各章に散りばめられており、
**系列に対する構造を推定する手法**が丁寧に説明されています。

内容はまず、シンプルなタスクに対して、機械学習をどう適用できるか説明して、
その後に、その手法の課題点を挙げて、どのような改善がされているか説明しています。

「文脈解析」本と比較すると数式が多い分、難易度が上がっていますが、
読み終えたあとには「構文解析」をどうやって解くべきか説明できるようになっていると思います。

以上で述べたように、
「[文脈解析](http://www.coronasha.co.jp/np/isbn/9784339027600/)」本では、問題の設定の仕方に力を注いでおり、
「[構文解析](http://www.coronasha.co.jp/np/isbn/9784339027594/)」本では、問題の解き方に重きを置いています。
そのため、この２つの本は同時に読むと効果が大きいです。

「[言語処理のための機械学習入門](http://www.coronasha.co.jp/np/isbn/9784339027518/)」で説明が少なかった、
構造に対する手法の解説が詳しく書いてあり、非常に有益な情報が含まれています。

# 各章のレビュー

ここからは各章のレビューになります。
「品詞解析」「句構造解析」「依存構造解析」の３つの構文解析手法についての説明と、
「構文解析の応用例」と「構文解析ツールとデータ」の紹介がされています。

## 「品詞解析と機械学習」

文の各単語に、どのように品詞を割り当てるか説明されています。
内容としては、品詞解析を題材にして、機械学習の基礎について書かれています。
品詞解析は、構文解析を含む上位の解析の土台になる部分であるため、非常に重要です。

ここでは、単語を**一つずつ**見て品詞を割り振るのではなく、
**系列**として見て割り振ることの重要性を例文を用いて説明しています。

### マルコフモデルと最大エントロピーモデル

まずは、系列を扱うモデルとして有名な隠れマルコフモデルの説明がされています。
そこでは、確率の連鎖則に基づいてマルコフモデルがどのように導出されるか書かれており、
計算量が増える問題点への対応について説明されています。

そして、それを解決する策として、Viterbiアルゴリズムの紹介がされており、
具体的なグラフを使って、どのような動きをするか示されています。
疑似コードも掲載されており、実装上の問題が指摘されていてよかったです。

その次は、最大エントロピーモデルについて紹介されており、
隠れマルコフモデルが扱うことができない特徴量（素性）を扱う方法が書かれています。
そして、その学習方法である勾配法の説明が式展開とともにされています。

それから、順序関係も加味した最大エントロピーマルコフモデルが紹介され、
そこで用いられる具体的な特徴量の例が説明されています。

### 条件付き確率場（CRF）

そして、言語処理の機械学習手法として、
隠れマルコフモデルと双璧を成す、条件付き確率場の説明がなされています。
逐次的な解析では誤差が、後段に伝わっていきます。
それを防ぐために、系列全体として最適になるような解を求めます。

しかしながら、そうすると計算量爆発が起きるので局所性を仮定し、近似を導入します。
そして、前向き後向きアルゴリズムを用いることで、
系列に対する出力の確率値を計算できることが説明されています。
上記の話に関して、式の導出が詳しく書かれており、非常に読みやすかったです。
また、前節と同様に疑似コードで流れを説明しています。

### その他の手法と解析の際の工夫

それ以外の手法として、より計算コストが小さく済む「構造化パーセプトロン」の説明がされています。
非常にシンプルな計算で、上記の手法と同精度を出すことができるそうです。

それ以外に、n-gramによる拡張や、絞込みを行っていくビーム探索の説明がされています。
また、ラベルが付与されていないデータを用いた、半教師あり学習の用い方が書かれています。

基本的な手法が課題に基づいて体系的に説明されていて、分かりやすかったです。
この章を理解するだけでも、機械学習の知識はかなり付くと思います。

## 「句構造解析」

句構造解析とは、文を入力とし、句同士の包含関係を階層的にまとめあげる処理を指します。
出力される解析結果は木構造となります。例えば、名詞句と動詞句がまとまり、文になるといったものです。

Time flies like an arrow（光陰矢の如し）という例文を用いて、
句構造の曖昧性に関する課題について述べられており、その解決策が次節以降に載っています。

### 文脈自由文法（CFG）

まずは、句構造の表現方法として、文脈自由文法について解説がされています。
文脈自由文法は、句同士の関係を構文ルールで記述したものです。
例えば名詞句が、限定詞と名詞からなるといったルールを用います。

これを用いて、全ての句構造を計算するのは不可能なので、
CKYアルゴリズムという手法で計算を行います。
その実際の挙動をテーブルと疑似コードで説明がされています。
そのため、テーブルの変化を追うことでどのような動きをするか理解できます。

### 確率文脈自由文法（PCFG）

この文脈自由文法のルールに確率値を与えたものが確率文脈自由文法になります。
ルールの適用で生成された構文木に対して、確率に基づいた確からしさを測ることができます。

確率文脈自由文法に対してもCKYアルゴリズムを拡張することで、同様に適用が可能です。
その方法が疑似コードとともに説明がされています。

また、その他の確率文脈自由文法に対する解析アルゴリズムとして、
内側外側アルゴリズムが紹介されています。
これにより、ルールの出現確率の計算が可能になることが説明されています。

### 遷移型モデル

上記以外の方法として、ビルド＆チェック法とシフトリデュース法について紹介されています。

ビルド＆チェック法では、操作を逐次的に実行していくことで解析を行っていくものです。
ビルドが句同士のチャンキング操作で、チェックが句の末尾か判定しそこまでをまとめあげるものです。
操作の決定には、最大エントロピー法などを用いて、分類問題として解けることが説明されています。

シフトリデュース法では、二つのデータ構造スタック、キューを使います。
シフトは、キューに入っている単語を品詞に変換してスタックに格納する操作で、
リデュースは、スタックに格納されている記号を別の非終端記号に変換操作になります。
上記を繰り返すことで、句構造の解析が可能なことを、実例を用いて説明されています。

これらの句構造解析の結果を評価する方法についても述べてあり、
実際の木を用いてどのような評価になるか示されており、非常に参考になります。


## 「依存構造解析」

依存構造とは、句同士（単語同士）の関係を表したもので、
どの句がどの句を修飾しているかなどの情報を表すものです。

依存構造も、句構造と同様に木構造で表すことが可能で、
それを実際に例文と実際の木を用いて説明されています。

依存構造では、句同士の関係が以下のような制約を満たすという仮定を置いています。
これらを仮定することで、これまで通りのアルゴリズムが適用可能だそうです。

- 木構造制約：句は必ず一つだけ係り先を持つ
- 非交差制約：関係を表すエッジが交差しない

### CKY法

句構造と依存構造は明確な対応関係があり、
依存関係のある単語および句をボトムアップにまとめることで、句構造になることが例示されています。
そのため、句構造で使ってきたCKYアルゴリズムなどが同様に用いることができるそうで、
疑似コードが示されており、両者の挙動の違いが説明されています。

### Eisner法

しかしながら、一つの同じ依存構造に複数の句構造が存在し、
確率が散らばり、正しい解析ができないことが書かれています。
そこで、句をまとめあげていく際に、その順序に曖昧性がないようにする方法が書いてあり、
実例を用いて各処理ステップでどのようになっているか示してあります。

### 遷移型依存構造解析法

句構造解析と同様に、シフトリデュース法を用いることができることも説明されています。
スタックが部分木を保持しており、キューが単語列を保持しており、
リデュースで依存関係を作る処理を行うそうです。


句構造解析に関しても、評価方法が説明されており、
実際の解析結果を元に評価がどうなるかを示してあり、分かりやすいです。
説明された各手法とも、図を用いて処理ステップごとにどのように処理が進むか、
示されているため、疑似コードとつき合わせて理解することができるため、分かりやすかったです。


## 「文法理論・深い構文解析」

句構造、依存構造で表現できない、意味的構造をどう解析する話について説明されています。
より高次の表現を保持する文法についての説明と、文法を用いずに解く方法について説明されています。

### 組合せ範疇文法（CCG）

組合せ範疇文法では、単語に文法機能を表すカテゴリを与え、
そのカテゴリの組合せで文の構造を表す仕組みとなっています。
変換規則を適用した際に、カテゴリにどのような意味が与えられたかが図示されています。

### 主辞駆動句構造文法（HPSG）

主辞が持つ文法機能を素性構造で表し、文の構造を表現する文法になります。
単語に与える構造を、語彙項目として付与していることを例で説明しています。
語彙項目というのは例えば、主語や目的語としてどのような句を取るかなどの情報を指します。

組合せ範疇文法は語順だけを見ていましたが、主辞駆動句構造文法は統語的関係も見ているそうです。
具体的な文法規則の適用で、主辞駆動句構造文法による構文木の例があり、分かりやすかったです。

### 意味役割付与、格解析

これまでは句記号に構造をもたせるような文法を用いていましたが、
それとは別に、構文解析後に意味的関係を付与する方法について述べています。

この部分が、「[文脈解析](http://www.coronasha.co.jp/np/isbn/9784339027600/)」本で書かれている内容の一部に相当します。
例えば、述語がどの句を項として取るかという情報を付与する話が書かれており、
これまでと同様に、機械学習の手法が適用できることが示されています。

前回の「[文脈解析](http://www.coronasha.co.jp/np/isbn/9784339027600/)」本の[レビュー](http://qiita.com/hiro5585/items/ba8ff6d29c5029a0fe46)を参考にしてください。


## 「構文解析の応用」

### 情報抽出

文中の人や物の間の関係を抽出する処理になります。
処理ステップは以下のようになっています。
処理ステップ3で、構文構造を特徴に用いること有効であることが書かれています。

1. エンティティ認識：文の中から人名、地名に相当するものを特定
2. 共参照解析：代名詞が指しているものを特定
3. エンティティ間の関係認識

### 機械翻訳

機械翻訳は、日本語と英語などの文構造が違う言語間では難しく、
語順が違うことが大きな影響を及ぼします。

そこで、語順を日本語のように変えて翻訳する方法が紹介されています。
具体的には、英語の構文木に対して、主辞を後ろに移動することを行うそうです。

### テキスト間含意関係認識

二つのテキスト間に包含関係があるかを判定するタスクで、
その際に、構文構造の近さを用いることで精度が向上することが述べられています。
木構造の類似度を測るための方法についても簡単に紹介されています。


## 「構文解析ツール」

どのような目的のときに、どの構文解析器を使えばいいか示唆がされています。
世の中の多くの構文解析器は新聞のデータを用いて学習しているため誤解析が多いそうです。

17種類の構文解析器に関して、どの手法を用いているか、どんな特徴があるか書かれています。
日本語ではKNPとCaboChaが有名でそれらの紹介がされています。

KNPは、格解析、照応解析、固有表現解析ができ、具体的な出力例を掲載しています。
格解析には大量のWebから構築した辞書があり、それを用いることができるそうです。
内部では、コスト最小法に基づく形態素解析器のJUMANが用いられています。

CaboChaは、日本語係り受け解析を高速で行うことができます。
チャンキングの段階適用によって係り受け解析を行っており、SVMの逐次適用を行っています。
内部では、CRFに基づく形態素解析MeCabが用いられています。

日本語に限らず、どのようなツールが世の中に存在するのかが説明されており、
また、それぞれがどのような思想をもって作られたかが簡単に紹介されており、
どれを使うか悩んだ時に、この章は有力な手掛かりになると思います。

## 「ツリーバンク」

構文構造のアノテーションコーパスであるツリーバンクが紹介されています。
7種類のツリーバンクが紹介されており、なにをアノテーションしているかが説明されています。
日本語では、京都大学テキストコーパス、NAISTテキストコーパスが有名です。

京都大学テキストコーパスは、毎日新聞約４万文に形態素、構文情報が付与されています。
構文情報に関しては文節区切り、係り受けが付与されており、
どこがどこに係るなどのコーパスの構造の例について、丁寧に説明されています。
なお、5千文には表層格、照応関係、共産情報がアノテーションされています。

NAISTテキストコーパスは、京大コーパスに述語項構造と照応関係がアノテーションされています。
このコーパスでは、表層格レベルでのアノテーションとなっているそうです。

ツリーバンクに関しても、構築された時の歴史的な背景などが書かれており、
それはタスク設定とも密接に関係があるもので、その部分が説明されていたのが非常に良かったです。

# おわりに

この「[構文解析](http://www.coronasha.co.jp/np/isbn/9784339027594/)」本では、機械学習をどのように現実のタスクに適用するかが詳細に書いてあります。
そして、系列に対する特徴量などの扱いや、構造を抽出する処理など、
他の本に書いていない内容が書かれています。

機械学習のより基本的な部分について補いたい場合は、
「[言語処理のための機械学習入門](http://www.coronasha.co.jp/np/isbn/9784339027518/)」を読むことをおすすめします。

この本では、文の「構造」を抽出する方法が書かれており、
一方でその上位の「意味」を扱った本が「[文脈解析](http://www.coronasha.co.jp/np/isbn/9784339027600/)」本となります。
冒頭で述べたように、これらは２つセットで読むことをおすすめします。
それにより、上位下位の概念、タスク設定と手法についてバランスよく理解できるはずです。

最後にはなりますが、人のより深い高度な処理を定義づけているのは、言語だと私は思っています。
何かの物事に対して、**言語に置き換えて処理をする**ことで、人は「意味」を理解しているのだと思います。

AI技術という言葉が世の中で使われていますが、
その本質は言語、しいて言うならば言語表現で表される「意味」だと考えています。

今後、そのような技術に携わろうと考えている方は、
ぜひこれらの本を読んでみて考えて頂きたいなと思います。