自然言語処理用語と解析器まとめ

この記事では自然言語処理の入門者の方に向けに、自然言語処理の重要ワードと日本語用の主要な解析器をまとめました。

# 基本用語

## 自然言語

> 自然言語（しぜんげんご、英: natural language）とは、人間によって日常の意思疎通のために用いられる、文化的背景を持って自然に発展してきた記号体系である。大別すると音声による話し言葉と文字や記号として書かれる書き言葉がある。
[自然言語 - Wikipedia](https://ja.wikipedia.org/wiki/%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E)

我々が日常生活で使っている言語(話し言葉と書き言葉)のこと。自然言語以外の言語としては、例えばプログラミング言語や数式などが該当する。

## 自然言語処理

> 自然言語処理（しぜんげんごしょり、英語: natural language processing、略称：NLP）は、人間が日常的に使っている自然言語をコンピュータに処理させる一連の技術であり、人工知能と言語学の一分野である。
[自然言語処理 - Wikipedia](https://ja.wikipedia.org/wiki/%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86)

自然言語をコンピュータなどを利用して処理すること。NLPと略される。処理と一口に言っても、「文章を単語に区切る」といった簡単な処理から、「文章の内容を理解して要約する」「質問の内容を理解して応答する」といった高度な処理まで、目的によってその内容は様々である。

## コーパス

> コーパス（corpus）とは、言語学において、自然言語処理の研究に用いるため、自然言語の文章を構造化し大規模に集積したもの。
[コーパス - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%BC%E3%83%91%E3%82%B9)

単なる文章の集合体ではなく、文章に対してその意味や構造などを付与した大規模なデータのこと。作成にはとてつもない人手と手間がかかる。

例えば、[京都大学テキストコーパス](http://nlp.ist.i.kyoto-u.ac.jp/index.php?%E4%BA%AC%E9%83%BD%E5%A4%A7%E5%AD%A6%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%B3%E3%83%BC%E3%83%91%E3%82%B9)は、毎日新聞の記事に対して、形態素(名詞・動詞など)と構文情報(文節の係り受け構造)を付与した約4万文のデータである。自動で付与された解析データを全て人がチェックすることで作成された。

## シソーラス

> シソーラス (Thesaurus) は単語の上位 / 下位関係、部分 / 全体関係、同義関係、類義関係などによって単語を分類し、体系づけた類語辞典・辞書。
[シソーラス - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%BD%E3%83%BC%E3%83%A9%E3%82%B9)

単語同士の関係を分類した辞書のこと。例えば、「リンゴ」という単語に対して、上位概念に「果物」「植物」、下位概念に「青りんご」や「ジョナゴールド」などが定義されている。

国立国語研究所の[分類語彙表](https://www.ninjal.ac.jp/archives/goihyo/)やNICTの[日本語 WordNet](http://nlpwww.nict.go.jp/wn-ja/)などが挙げられる。

## 形態素解析

> 対象言語の文法の知識（文法のルールの集まり）や辞書（品詞等の情報付きの単語リスト）を情報源として用い、自然言語で書かれた文を形態素（Morpheme, おおまかにいえば、言語で意味を持つ最小単位）の列に分割し、それぞれの品詞を判別する作業を指す。
[形態素解析 - Wikipedia](https://ja.wikipedia.org/wiki/%E5%BD%A2%E6%85%8B%E7%B4%A0%E8%A7%A3%E6%9E%90)

文章を品詞情報を持った単語に区切ること。単に文章を単語に区切るのは分かち書き。

例えば、「ローマで休日を過ごす」は、

- ローマ：固有名詞・地名
- で　　：格助詞
- 休日　：普通名詞
- を　　：格助詞
- 過ごす：動詞・サ行五段・終止形

のように形態素解析されるが、

「ローマの休日を見る」は、

- ローマの休日：固有名詞・作品名
- を　　　　　：格助詞
- 見る　　　　：動詞・マ行上一段・終止形

となる。

形態素解析器としては、後述する[MeCab](http://mecab.googlecode.com/svn/trunk/mecab/doc/index.html)や[JUMAN](http://nlp.ist.i.kyoto-u.ac.jp/index.php?cmd=read&page=JUMAN&alias%5B%5D=%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%BD%A2%E6%85%8B%E7%B4%A0%E8%A7%A3%E6%9E%90%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0JUMAN)、[Yahoo!の日本語形態素解析API](http://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html)などが有名。

## 構文解析

> 構文解析（こうぶんかいせき、Syntactic Analysis）とは、ある文章の文法的な関係を説明すること(parse)。
[構文解析 - Wikipedia](https://ja.wikipedia.org/wiki/%E6%A7%8B%E6%96%87%E8%A7%A3%E6%9E%90)

文章の文節間の係り受けの構造を解析すること。

例えば、「望遠鏡で泳ぐ少女を見た」という文は、2種類の係り受け構造が考えられる。

- 望遠鏡で → 見た
- 泳ぐ → 少女を → 見た

もしくは

- 望遠鏡で → 泳ぐ
- 泳ぐ → 少女を → 見た

一般的には前者の係り受けが正しいと思われるが、もしかしたら望遠鏡をビート板にして泳ぐ少女がいたのかもしれない。

形態素解析においても同様だが、自然言語にはその文が発された状況が必ず存在するため、文章だけからは解析結果は必ずしも１つには定まらないことがしばしばある。

構文解析器としては、後述する[Cabocha](http://taku910.github.io/cabocha/)や[KNP](http://nlp.ist.i.kyoto-u.ac.jp/index.php?KNP)や、[Yahoo!のテキスト解析API](http://developer.yahoo.co.jp/webapi/jlp/da/v1/parse.html)が有名。

## 照応解析

> 照応解析（しょうおうかいせき、英: reference resolution）とは、照応詞（代名詞や指示詞など）の指示対象を推定したり、省略された名詞句（ゼロ代名詞）を補完する処理のこと。
[照応解析 - Wikipedia](https://ja.wikipedia.org/wiki/%E7%85%A7%E5%BF%9C%E8%A7%A3%E6%9E%90)

「彼」や「彼女」などの代名詞や「それ」や「あっち」などの指示語に対してその対象を推定したり、省略された語を補うこと。

例えば、「机の上にはクマのぬいぐるみが置いてあった。それは30年前からそこに鎮座している。」という文章に対して、「それ」＝「クマのぬいぐるみ」・「そこ」＝「机の上」という関係を推定することができる。

また、「先生はとても上機嫌だね。ニコニコしているもん。」という文章に対して、２文目の「ニコニコしている」の主語＝「先生」と推定できる。

照応解析器としては、[照応解析システムANASYS](http://www-haradalb.it.aoyama.ac.jp/anasys.html)や[東工大 笹野さんの省略・照応解析CGI](http://lotus.kuee.kyoto-u.ac.jp/~ryohei/zero_anaphora/index.cgi)などがある。

# 形態素解析器

## MeCab

> MeCabは 京都大学情報学研究科−日本電信電話株式会社コミュニケーション科学基礎研究所 共同研究ユニットプロジェクトを通じて開発されたオープンソース 形態素解析エンジンです。言語, 辞書,コーパスに依存しない汎用的な設計を基本方針としています。
[MeCab: Yet Another Part-of-Speech and Morphological Analyzer](http://mecab.googlecode.com/svn/trunk/mecab/doc/index.html)

日本語の形態素解析器としてはおそらく一番メジャー。辞書としてIPA辞書やUniDic辞書などが提供されており、また、必要に応じてユーザ辞書を作成して利用することができる。PythonやRubyなどのスクリプト言語用のバインディングも提供されているため、様々な場面で容易に呼び出せる。

```py:python
>>> import MeCab
>>> tagger = MeCab.Tagger('-Owakati')
>>> print tagger.parse('にわにはにわにわとりがいる')
にわ に はにわ にわとり が いる # ちょっと間違ってる
```

## JUMAN

> 本システムは，計算機による日本語の解析の研究を目指す多くの研究者に共通に使える形態素解析ツールを提供するために開発されました．その際, 学校文法が計算機向きではないという問題を考慮し，使用者によって文法の定義，単語間の接続関係の定義などを容易に変更できるように配慮しました
[JUMAN - KUROHASHI-KAWAHARA LAB](http://nlp.ist.i.kyoto-u.ac.jp/index.php?cmd=read&page=JUMAN&alias%5B%5D=%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%BD%A2%E6%85%8B%E7%B4%A0%E8%A7%A3%E6%9E%90%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0JUMAN)

単なる形態素解析だけでなく、Wikipediaから抽出した辞書やウェブから獲得した自動辞書による結果が付与されるため、MeCabの辞書では未知語になってしまうような固有名詞などに強い。また、動詞に対して反義語やドメインが定義されているので、文脈や意味理解に利用できる。

```
> 昨日ヨドバシカメラでスマブラとＷｉｉＵを買った

昨日 きのう 昨日 名詞 6 時相名詞 10 * 0 * 0 "代表表記:昨日/きのう カテゴリ:時間"
ヨドバシカメラ ヨドバシカメラ ヨドバシカメラ 名詞 6 地名 4 * 0 * 0 "自動獲得:Wikipedia Wikipedia上位語:量販店チェーンストア"
で で で 助詞 9 格助詞 1 * 0 * 0 NIL
スマブラ スマブラ スマブラ 名詞 6 普通名詞 1 * 0 * 0 "自動獲得:Wikipedia Wikipediaリダイレクト:大乱闘スマッシュブラザーズシリーズ"
と と と 助詞 9 格助詞 1 * 0 * 0 NIL
ＷｉｉＵ ＷｉｉＵ ＷｉｉＵ 名詞 6 普通名詞 1 * 0 * 0 "自動獲得:Wikipedia 読み不明 Wikipediaリダイレクト:Ｗｉｉ　Ｕ"
を を を 助詞 9 格助詞 1 * 0 * 0 NIL
買った かった 買う 動詞 2 * 0 子音動詞ワ行 12 タ形 10 "代表表記:買う/かう ドメイン:家庭・暮らし;ビジネス 反義:動詞:売る/うる"
EOS
```

# 構文解析器

## Cabocha

> CaboCha は, Support Vector Machines に基づく日本語係り受け解析器です。
[CaoboCha: Yet Another Japanese Dependency Structure Analyzer](http://taku910.github.io/cabocha/)

SVMを用いた日本語の係り受け解析器。動作にはMeCabが必要。PerlやRuby用のライブラリが提供されている。

形態素解析・文節区切り・素性選択・係り受け解析のそれぞれが独立したレイヤーになっていて、任意のレイヤーを別のプログラムに置き換えて利用することが可能。

## KNP

> KNPは日本語文の構文・格・照応解析を行うシステムです．形態素解析システムJUMANの解析結果(形態素列)を入力とし, 文節および基本句間の係り受け関係，格関係，照応関係を出力します． 係り受け関係，格関係および照応関係は，Webから自動構築した大規模格フレームに基づく確率的モデルにより決定します．
[KNP - KUROHASHI-KAWAHARA LAB](http://nlp.ist.i.kyoto-u.ac.jp/index.php?KNP)

ウェブから獲得した大規模な辞書を用いている確率モデルによる係り受け解析器。最新版のバージョン4.1では照応解析機能が追加された。同ウェブページから機能を試すことができる。

- [KNPを試してみる](http://lotus.kuee.kyoto-u.ac.jp/nl-resource/cgi-bin/knp.cgi)

例として挙げた「望遠鏡で泳ぐ少女を見た」という文をCabocha(+Unidic)では正しく解析できなかったが、KNPでは正しく解析できた。

```text:cabocha
望遠鏡で-D    
        泳ぐ-D  
            少女を-D
                  見た
EOS
```

```text:KNP
望遠────┐        <体言>
        鏡で──┐  <体言><Wikipediaエントリ:望遠鏡>
泳ぐ──┐       │  <用言:動><格解析結果:ガ/少女;ヲ/-;ノ/->
      少女を──┤  <体言>
             見た<用言:動><格解析結果:ガ/-;ヲ/少女;ニ/-;ト/-;デ/鏡;ノ/->
EOS
```