CaboChaで始める係り受け解析

  • 161
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

注意

著者は自然言語処理(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を使いましょう。