しかつきかふぇ

ちょっとした休憩時間に

openSUSEに自然言語処理な環境構築

本日も『openSUSE Advent Calendar 2018』、6日目の記事です。

今年のopenSUSEのAdvent Calendarといえば、
完全にあっちに話題を持ってかれた印象ですが、めげずにがんばりましょう〜w
(よろしければこちらにも記事を書いてください!!! >古賀様)

本日は、おーぷん万葉とのコラボ(?)で、自然言語処理のお話です。

f:id:a_shika:20181206213756j:plain

トピック:

  1. 形態素解析器『Mecab』をopenSUSEへインストール
  2. 係り受け解析器なジョニーデップ!??

1.形態素解析器『Mecab』をopenSUSEへインストール

自然言語処理を始めよう!と言ったときに、
まず形態素解析器がないとお話になりません。(と思う。)

というわけで、最初にopenSUSEMecabをインストールしてみます。
形態素解析器ってなに?ってお話は、後ほど!

ところが、、、openSUSEMecabのパッケージって、用意されてないんだな〜これが。
なので、ソースコードからビルドしていきます。
まずは、開発環境をインストールしましょう!!

f:id:a_shika:20181206215220p:plain

  1. Yastを起動して、『ソフトウェア管理』を選択
  2. 左上の『表示』から『パターン』を選んで、『C/C++ Development』を選択
  3. 『了解』を押して、インストール実行!

これでopenSUSEMecabをビルドするための開発環境が全てインストールされました。
簡単ですね!

そしたらこちらからMecabをダウンロードしてきて、下記コマンドでビルドしましょう。

tar xvzf mecab-0.996.tar.gz
cd mecab-0.996
./configure
make
sudo make install
sudo ldconfig

これで、Mecabのインストールまでは完了です。

だがしかし、Mecabは辞書がないと動きません。
なので、次は辞書をインストールしていきます。

辞書はいろいろあるのですが、ここではJUMAN辞書をインストールします。
※後ほど『jdepp』を使うため

先程のMecabのページの真ん中付近にある『Juman辞書』と書かれた場所から
『ダウンロード』をクリックして、Juman辞書をダウンロードしましょう。

ビルド方法はこんな感じです。

tar xvzf mecab-jumandic-7.0-20130310.tar.gz
cd mecab-jumandic-7.0-20130310
./configure –with-charset=utf8

……と、makeする前にここでちょっとおまじない。
Makefileを2箇所いじり、『libexec』となってる箇所を『lib』に修正します。
※他のディストリビューションだといじる必要ないんですよね……

vi Makefile
MECAB_DICT_INDEX = /usr/local/libexec/mecab/mecab-dict-index
↓
MECAB_DICT_INDEX = /usr/local/lib/mecab/mecab-dict-index
mecab_dict_index = /usr/local/libexec/mecab/mecab-dict-index
↓
mecab_dict_index = /usr/local/lib/mecab/mecab-dict-index

修正したら、makeです。

make
sudo make install

最後にmecabrcの『dicdir』を直します。

sudo vi /usr/local/etc/mecabrc
dicdir = /usr/local/lib/mecab/dic/ipadic
↓
dicdir = /usr/local/lib64/mecab/dic/jumandic

はい、これで使える準備が整いました!
早速動かしてみましょう!

> echo "国境の長いトンネルを抜けると雪国であった" | mecab
国境 名詞,普通名詞,*,*,国境,くにざかい,代表表記:国境/くにざかい 地名末尾 カテゴリ:場所-その他 ドメイン:政治
の 助詞,格助詞,*,*,の,の,*
長い 形容詞,*,イ形容詞アウオ段,基本形,長い,ながい,代表表記:長い/ながい 反義:形容詞:短い/みじかい
トンネル 名詞,サ変名詞,*,*,トンネル,とんねる,代表表記:トンネル/とんねる カテゴリ:場所-施設 ドメイン:交通
を 助詞,格助詞,*,*,を,を,連語
抜ける 動詞,*,母音動詞,基本形,抜ける,ぬける,代表表記:抜ける/ぬける 可能動詞:抜く/ぬく 付属動詞候補(基本) 自他動詞:他:抜く/ぬく;他:抜かす/ぬかす
と 助詞,格助詞,*,*,と,と,連語
雪国 名詞,普通名詞,*,*,雪国,ゆきぐに,代表表記:雪国/ゆきぐに カテゴリ:場所-その他
であった 判定詞,*,判定詞,デアル列タ形,だ,であった,*
EOS

動きましたか?

Mecabを使うと、文章を単語ごとに区切って、単語の品詞情報を付与して表示してくれます。
自然言語処理を行う、基本中の基本ですね!(たぶんだけど)

2.係り受け解析器なジョニーデップ!??

次に、係り受け解析というものをやってみます!
係り受けって中学生かなにかの国語でやったような気もするけど何だっけ?』
と思う方もいらっしゃると思いますが、まずはやってみましょう!

係り受け解析器というと、Cabochaというものが有名ですが、
ここでは、J.DepPというものを紹介します。

なんでそっちなの!??というお話は、またまた後ほど。

とりあえずインストールしてみましょう!
下記のコマンドでビルドしていきます。

wget http://www.tkl.iis.u-tokyo.ac.jp/~ynaga/jdepp/jdepp-latest.tar.gz
tar zxvf jdepp-latest.tar.gz
./configure
make model
sudo make install

なにも問題なければ、これでインストール完了です。
動かしてみます!

> echo "国境の長いトンネルを抜けると雪国であった" | mecab | jdepp
(input: STDIN [-I 0])
 # S-ID: 1; J.DepP
 * 0 2D
国境 名詞,普通名詞,*,*,国境,くにざかい,代表表記:国境/くにざかい 地名末尾 カテゴリ:場所-その他 ドメイン:政治
の 助詞,格助詞,*,*,の,の,*
 * 1 2D
長い 形容詞,*,イ形容詞アウオ段,基本形,長い,ながい,代表表記:長い/ながい 反義:形容詞:短い/みじかい
 * 2 3D
トンネル 名詞,サ変名詞,*,*,トンネル,とんねる,代表表記:トンネル/とんねる カテゴリ:場所-施設 ドメイン:交通
を 助詞,格助詞,*,*,を,を,連語
 * 3 4D
抜ける 動詞,*,母音動詞,基本形,抜ける,ぬける,代表表記:抜ける/ぬける 可能動詞:抜く/ぬく 付属動詞候補(基本) 自他動詞:他:抜く/ぬく;他:抜かす/ぬかす
と 助詞,格助詞,*,*,と,と,連語
 * 4 -1D
雪国 名詞,普通名詞,*,*,雪国,ゆきぐに,代表表記:雪国/ゆきぐに カテゴリ:場所-その他
であった 判定詞,*,判定詞,デアル列タ形,だ,であった,*
EOS

J.DepP profiler:
io : 0.0198 ms./trial (0.07906831/4)
dict : 0.2519 ms.
preproc : 0.0235 ms.
chunk : 0.0184 ms.
depnd : 0.0180 ms.

はい、途中で『* 0 2D』とか『* 1 2D』とか出力されるようになりました。
これが係り受け情報となります。(ぇ

つまり、『* 0 2D』は、『0番目の文節は2番目の文節に係る』
すなわち、『国境の』は『トンネルを』と係るということになります。

同様に『* 1 2D』は、『長い』は『トンネルを』に係り、
『* 2 3D』は、『トンネルを』は『抜けると』、
『* 3 4D』は、『抜けると』は『雪国であった』に係るということですね!

余談・・・・・

ところで、なんでJ.DepPを取り上げたかといいますと、
モデルをつくるのに、KNBコーパスを使用しているからです。

KNBコーパスは量こそ少ないですが、
誰でも使えるという点では唯一の、係り受け解析まで行われたコーパスです。

これがCabochaだとそうはいかなくて、
付属しているモデルに使用条件が付いてしまっているんですね。

そもそものお話・・・・・係り受け解析まで行われたコーパス少なすぎ!!!

この辺りのお話をなんとか解決したい!
というのがおーぷん万葉プロジェクトの目指している方向性だったりします。

来年こそはなんとか形あるもの作りたいな〜 >おーぷん万葉

☆ ☆ ☆

さて、明日のopenSUSE Advent Calendarは、満を持して(?)ribbonさんの登場です!
どんなブログになるのやら???

というわけで、今日はこの辺で。
(なんだかものすごく書き足りない気もするけど、それはまた次回以降ということで)