Edited at

CaboChaで始める係り受け解析

More than 5 years have passed since last update.


注意

著者は自然言語処理(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


係り受け解析とは?

文節間の「修飾する(係る)」「修飾される(受ける)」の関係を調べる事です。

ex.綺麗な海

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


何が嬉しいの?

自然言語の文の意味をよりシステムへ理解させられる。

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

・形態素解析のみ

 - 部屋

 - 蒸し

 - 風呂

 - 暑い

  -> 部屋が暑いか特定できない。

・係り受け解析まで

 - 部屋が→蒸し→風呂のように→暑い

  -> 部屋が暑いか特定できる。


SVM(Support Vector Machines)とは?

機械学習アルゴリズムの一つ。高精度のデータ分類ができると言われている。


特徴

・マージン最大化……データをカテゴリ分けする直線(分離超平面)と各データとの距離が最大になる所で線を引く。

・高次元化による線形分離……データが直線で分けられない場合も、基準(X軸・Y軸)を変えれば線が引ける。

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


試してみる。


cabocha_try.sh

cabocha

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


もっと試してみる。

C/C++/java/python/ruby/perlのインターフェースが提供されている。


cabochapy_try.sh

ipython

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



サポートする出力形式は?


tree(CABOCHA_FORMAT_TREE)


caboCha_tree.sh

cabocha

一郎は二郎が描いた絵を三郎に贈った。

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



lattice(CABOCHA_FORMAT_LATTICE)


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行目


  1. *

  2. 文節番号

  3. 係り先の文節番号(係り先なし:-1)

  4. 主辞の形態素番号/機能語の形態素番号

  5. 係り関係のスコア(大きい方が係りやすい)


2行目


  1. 表層形
    (Tab区切り)

  2. 品詞

  3. 品詞細分類1

  4. 品詞細分類2

  5. 品詞細分類3

  6. 活用形

  7. 活用型

  8. 原形

  9. 読み

  10. 発音


xml(CABOCHA_FORMAT_XML)


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)


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をインストールを参考にさせて貰っている。


MeCabをインストールする。

公式サイトからMeCabをダウンロードする。

http://mecab.googlecode.com/svn/trunk/mecab/doc/index.html#install

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


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」の引数を忘れない。


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のインストールを確認する。


mecab_test.sh

% mecab

% すもももももももものうち #形態素解析結果が表示。Ctrl+Cで中断。


CaboChaをインストールする。

CRF++(Yet Another CRF toolkit)をインストールする。

http://crfpp.googlecode.com/svn/trunk/doc/index.html

CRF++をMakeする。


crfpp_make.sh

./configure 

make
su
make install

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


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」の引数を忘れない。


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でインストールした場合はインストール元フォルダも検索でヒットする。


find_cabochapy.sh

find / -name CaboCha.py


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


vi_cabochapy.sh

sudo vi setup.py

#[修正前]
#return string.split (cmd1(str)) #def cmd2(str)
#[修正後]
#return cmd1(str).split()

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


cabochapy_setup.sh

sudo python3 setup.py install


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


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を使いましょう。