CaboChaで始める係り受け解析

#注意
著者は自然言語処理(NLP)初心者です。
記載内容に間違いがある場合は、コメントを頂けると助かります。


#MeCabの後には、何で遊ぼう？
CaboCha(南瓜)


#CaboCha(南瓜)とは？
CaboCha/南瓜: Yet Another Japanese Dependency Structure Analyzer

CaboCha は, SVM(Support Vector Machines) に基づく日本語係り受け解析器です。
[引用元：cabocha - Yet Another Japanese Dependency Structure Analyzer - Google Project Hosting](https://code.google.com/p/cabocha/)


#係り受け解析とは？
文節間の「修飾する（係る）」「修飾される（受ける）」の関係を調べる事です。

ex.綺麗な海
・「綺麗な」→「海」 #「綺麗な」が「海」を修飾する。


#何が嬉しいの？
自然言語の文の意味をよりシステムへ理解させられる。

ex.部屋が蒸し風呂のように暑い。

・形態素解析のみ
　- 部屋
　- 蒸し
　- 風呂
　- 暑い
　　-> 部屋が暑いか特定できない。

・係り受け解析まで
　- 部屋が→蒸し→風呂のように→暑い
　　-> 部屋が暑いか特定できる。


#SVM(Support Vector Machines)とは？
機械学習アルゴリズムの一つ。高精度のデータ分類ができると言われている。
##特徴
・マージン最大化……データをカテゴリ分けする直線(分離超平面)と各データとの距離が最大になる所で線を引く。
・高次元化による線形分離……データが直線で分けられない場合も、基準(X軸・Y軸)を変えれば線が引ける。

正しくはググって下さい。


#試してみる。

```bash:cabocha_try.sh
cabocha
一郎は二郎が描いた絵を三郎に贈った。
おじいさんは山へ芝刈りに、おばあさんは川へ洗濯に行きました。
```

#もっと試してみる。
C/C++/java/python/ruby/perlのインターフェースが提供されている。

```bash:cabochapy_try.sh
ipython

import CaboCha
c = CaboCha.Parser()
sentence = "一郎は二郎が描いた絵を三郎に贈った。"
tree =  c.parse(sentence)
print(tree.toString(CaboCha.FORMAT_XML))
```

#サポートする出力形式は？

##tree（CABOCHA_FORMAT_TREE）

```bash:caboCha_tree.sh
cabocha
一郎は二郎が描いた絵を三郎に贈った。

  一郎は---------D
    二郎が-D     |
      描いた-D   |
          絵を---D
          三郎に-D
          贈った。
EOS
```

##lattice（CABOCHA_FORMAT_LATTICE）

```bash:caboCha_lattice.sh
cabocha -f1
一郎は二郎を描いた絵を三郎に贈った。

* 0 5D 0/1 -0.620584
一郎	名詞,人名,*,*,一郎,いちろう,*
は	助詞,副助詞,*,*,は,は,*
* 1 2D 0/1 1.710282
二郎	名詞,人名,*,*,二郎,じろう,*
を	助詞,格助詞,*,*,を,を,*
* 2 3D 0/0 1.594028
描いた	動詞,*,子音動詞カ行,タ形,描く,えがいた,代表表記:描く
* 3 5D 0/1 -0.620584
絵	名詞,普通名詞,*,*,絵,え,漢字読み:音 代表表記:絵
を	助詞,格助詞,*,*,を,を,*
* 4 5D 0/1 -0.620584
三郎	名詞,人名,*,*,三郎,さぶろう,*
に	助詞,格助詞,*,*,に,に,*
* 5 -1D 0/0 0.000000
贈った	動詞,*,子音動詞ラ行,タ形,贈る,おくった,代表表記:贈る
。	特殊,句点,*,*,。,。,*
EOS
```

###1行目
 0. \* 
 0. 文節番号
 0. 係り先の文節番号(係り先なし:-1)
 0. 主辞の形態素番号/機能語の形態素番号
 0. 係り関係のスコア(大きい方が係りやすい)

###2行目
 0. 表層形
 （Tab区切り）
 0. 品詞
 0. 品詞細分類1
 0. 品詞細分類2
 0. 品詞細分類3
 0. 活用形
 0. 活用型
 0. 原形
 0. 読み
 0. 発音

##xml（CABOCHA_FORMAT_XML）

```bash:cabocha_xml.sh
cabocha -f3
一郎は二郎を描いた絵を三郎に贈った。

<sentence>
 <chunk id="0" link="5" rel="D" score="-0.620584" head="0" func="1">
  <tok id="0" feature="名詞,人名,*,*,一郎,いちろう,*">一郎</tok>
  <tok id="1" feature="助詞,副助詞,*,*,は,は,*">は</tok>
 </chunk>
 <chunk id="1" link="2" rel="D" score="1.710282" head="2" func="3">
  <tok id="2" feature="名詞,人名,*,*,二郎,じろう,*">二郎</tok>
  <tok id="3" feature="助詞,格助詞,*,*,を,を,*">を</tok>
 </chunk>
 <chunk id="2" link="3" rel="D" score="1.594028" head="4" func="4">
  <tok id="4" feature="動詞,*,子音動詞カ行,タ形,描く,えがいた,代表表記:描く">描いた</tok>
 </chunk>
 <chunk id="3" link="5" rel="D" score="-0.620584" head="5" func="6">
  <tok id="5" feature="名詞,普通名詞,*,*,絵,え,漢字読み:音 代表表記:絵">絵</tok>
  <tok id="6" feature="助詞,格助詞,*,*,を,を,*">を</tok>
 </chunk>
 <chunk id="4" link="5" rel="D" score="-0.620584" head="7" func="8">
  <tok id="7" feature="名詞,人名,*,*,三郎,さぶろう,*">三郎</tok>
  <tok id="8" feature="助詞,格助詞,*,*,に,に,*">に</tok>
 </chunk>
 <chunk id="5" link="-1" rel="D" score="0.000000" head="9" func="9">
  <tok id="9" feature="動詞,*,子音動詞ラ行,タ形,贈る,おくった,代表表記:贈る">贈った</tok>
  <tok id="10" feature="特殊,句点,*,*,。,。,*">。</tok>
 </chunk>
</sentence>
```

 * chunk = 文節
 * chunk/id = 文節番号
 * chunk/link = 係り先の文節番号
 * chunk/rel = (不明)
 * chunk/score = 係り関係のスコア(大きい方が係りやすい)
 * chunk/head = 主辞の形態素番号
 * chunk/func = 機能語の形態素番号
 * tok = 形態素
 * tok/id = 形態素番号
 * tok/feature = 品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音
 * tok/値 = 表層形

##CoNLL（CABOCHA_FORMAT_CONLL）

```bash:cabocha_conll.sh
cabocha -f4
一郎は二郎が描いた絵を三郎に贈った。

1	一郎	一郎	名詞	名詞-人名	feature=名詞,人名,*,*,一郎,いちろう,*|begin_chunk=1|head=1	2	_	_	_
2	は	は	助詞	助詞-副助詞	feature=助詞,副助詞,*,*,は,は,*|func=1	10	D	_	_
3	二郎	二郎	名詞	名詞-人名	feature=名詞,人名,*,*,二郎,じろう,*|begin_chunk=1|head=1	4	_	_	_
4	が	が	助詞	助詞-格助詞	feature=助詞,格助詞,*,*,が,が,*|func=1	5	D	_	_
5	描いた	描く	動詞	動詞	feature=動詞,*,子音動詞カ行,タ形,描く,えがいた,代表表記:描く|begin_chunk=1|head=1|func=1	6	D	_	_
6	絵	絵	名詞	名詞-普通名詞	feature=名詞,普通名詞,*,*,絵,え,漢字読み:音 代表表記:絵|begin_chunk=1|head=1	7	_	_	_
7	を	を	助詞	助詞-格助詞	feature=助詞,格助詞,*,*,を,を,*|func=1	10	D	
```  

#インストールのコツ（Ubuntu14.04 + Python3）

・依存ソフトは予めインストールする。
・Mecab/CabochaはUTF-8使用設定でインストールする。
・ソースを修正する。
　※CRF++/CaboChaのMakeときにエラーが発生する事がある。
　　その際は、[忘れがちな記憶へ Ubuntuへyamcha & Cabochaをインストール](http://kumagonjp2.blog.fc2.com/blog-entry-82.html)を参考にさせて貰っている。


##MeCabをインストールする。
公式サイトからMeCabをダウンロードする。
http://mecab.googlecode.com/svn/trunk/mecab/doc/index.html#install

MeCabをMakeする。※「--with-charset=utf8」を忘れない。

```bash:mecab_make.sh
tar zxfv mecab-X.X.tar.gz
cd mecab-X.X
./configure --with-charset=utf8
make
make check
su
make install
```

MeCab辞書をMakeする。※「./configure」の引数を忘れない。

```bash:mecabdic_make.sh
% tar zxfv mecab-juman-2.7.0-XXXX.tar.gz
% mecab-juman-2.7.0-XXXX
% ./configure --with-charset=utf8
% make
% su
# make install 
```

MeCabのインストールを確認する。

```bash:mecab_test.sh
% mecab
% すもももももももものうち #形態素解析結果が表示。Ctrl+Cで中断。
```

##CaboChaをインストールする。

CRF++(Yet Another CRF toolkit)をインストールする。
http://crfpp.googlecode.com/svn/trunk/doc/index.html

CRF++をMakeする。

```bash:crfpp_make.sh
./configure 
make
su
make install
```

共有ライブラリの追加設定をする。

```bash:vi_ld_so_conf.sh
sudo vi /etc/ld.so.conf 
# include /usr/local/bin #追記する
sudo ldconfig
```

公式サイトからCaboChaをダウンロードする。
https://code.google.com/p/cabocha/

CaboChaをMakeする。※「./configure」の引数を忘れない。

```bash:cabocha_make.sh
% ./configure --with-mecab-config=`which mecab-config` --with-charset=UTF8 --with-posset=juman
make
make check
su
make install
sudo ldconfig
```

CaboChaのインストール先フォルダを探す。
ドライブ内を"CaboCha.py"で検索し、そのファイルがあるフォルダへ移動する。
※注意
・makeでインストールした場合はインストール元フォルダも検索でヒットする。

```bash:find_cabochapy.sh
find / -name CaboCha.py
```

CabochaのPythonバインディングのソースを修正する。

```bash:vi_cabochapy.sh
sudo vi setup.py
#[修正前]
#return string.split (cmd1(str)) #def cmd2(str)
#[修正後]
#return cmd1(str).split()
```

CabochaのPythonバインディングを実行する。

```bash:cabochapy_setup.sh
sudo python3 setup.py install
```

CabochaのPythonバインディングを動作確認する。

```bash:cabochapy_test.sh
python3 test.py
```

#それでも入らない場合は？

Yahoo!の日本語係り受け解析APIを利用する。
　※形態素解析APIもあります。

テキスト解析:日本語係り受け解析 - Yahoo!デベロッパーネットワーク
http://developer.yahoo.co.jp/webapi/jlp/da/v1/parse.html


#まとめ
CaboChaは係り受け解析ツールです。
C/C++/java/python/ruby/perlからも使えます。
Ubuntuでインストールする時は、UTF-8指定等の設定が必要です。
CaboChaが使えない時は、Yahoo!の日本語係り受け解析APIを使いましょう。