形態素解析エンジンのMeCab(およびRMeCab)をEC2上の新しい環境に入れる必要が生じたので、
- MeCabのインストール
- IPA辞書のインストール
- RMeCabのインストール
- NEologd辞書のインストールとシステム辞書の変更
- ユーザ辞書の作成、コンパイル、登録
の手順を改めて確認してみた。以下は手元のMac上での作業だけどlinuxでもさほど変わらんでしょう。
ちなみにRMeCabは、システム自体にインストールされたMeCabを利用するラッパーなので、R上だけではインストールが完結しない。
ソースから自分でインストールする方法もあるが、私はHomebrewで管理することにしたいので、まずHomebrewでMeCabとIPA辞書をインストールする。ターミナルで以下のようにする。
$ brew install mecab
$ brew install mecab-ipadic
ちなみにどうでもいいが、MeCab本体だけインストールした状態でmecabコマンドを打つと、
$ param.cpp(69) [ifs] no such file or directory: /usr/local/lib/mecab/dic/ipadic/dicrc
というエラーが出るが、上記の場所を探しに行っているのは、mecabrcというファイルに書かれたコンフィグでデフォルトでそう指定されているため。
最初からIPA辞書を使わないという場合は、べつにmecab-ipadicをインストールせずに、別の辞書をインストールして、コンフィグを書き換えればいいのだが、その場合は、
/usr/local/etc/mecabrc
を開いて、
$ dicdir = /usr/local/lib/mecab/dic/ipadic
という記述の部分を書き換えることになる。ここに、コンパイル済みの別の辞書のパスを書けばいい。ちなみに後述するように、同じファイルにユーザ辞書の設定も書くことになる。
とりあえずIPA辞書のインストールまで済んだら、試しに起動してみる。
$ mecab
すもももももももものうち。
すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも 名詞,一般,*,*,*,*,もも,モモ,モモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも 名詞,一般,*,*,*,*,もも,モモ,モモ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
うち 名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
。 記号,句点,*,*,*,*,。,。,。
EOS
RのほうでRMeCabもインストールしておこう。CRANからじゃないので注意。
install.packages("RMeCab", repos = "http://rmecab.jp/R")
library(RMeCab)
RMeCabC("すもももももももものうち。")
IPA辞書でMeCabを使うなら上記で完了だが、今回は、新語に強く毎週辞書が更新されているmecab-ipadic-NEologdを使いたいので、インストールする。インストール方法は以下のページに書いてある。
https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md
まず、git cloneでソースをダンロードし、ダウンロードしたディレクトリに移動して、インストーラーを実行する。
$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd
$ ./bin/install-mecab-ipadic-neologd -n -a
ここで-aというオプションは、上記説明ページにある「全部入り」の意味。けっこうインストールに時間かかる。
さて、インストールしただけではNEologd辞書は使えない。以下のように解析を実行してみると……
$ mecab
今日はあつまれどうぶつの森をプレイします。
今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
あつまれ 動詞,自立,*,*,五段・ラ行,命令e,あつまる,アツマレ,アツマレ
どう 副詞,助詞類接続,*,*,*,*,どう,ドウ,ドー
ぶつ 名詞,一般,*,*,*,*,ぶつ,ブツ,ブツ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
森 名詞,一般,*,*,*,*,森,モリ,モリ
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
プレイ 名詞,一般,*,*,*,*,*
し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
ます 助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
。 記号,句点,*,*,*,*,。,。,。
EOS
このように「あつまれどうぶつの森」が固有名詞として認識されないのは、システム辞書としてデフォルトのIPA辞書が適用されたままだからである。
NEologd辞書をMeCabに反映させる方法は2つある。
- MeCabコマンドを実行するときに、システム辞書を指定する。(RMeCabではこの方法は使えない。)
- /usr/local/etc/mecabrcを書き換えてデフォルトのシステム辞書を入れ替える。
前者は、以下のようにmecabコマンドの後ろに-dオプションを付けて辞書を指定する。ちなみに後でやるように、ユーザ辞書を指定する場合は-uで指定するのだが、その場合はディレクトリじゃなくてファイルのパスを指定するところが違うので注意。システム辞書はディレクトリで指定する。
$ mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd/
今日はあつまれどうぶつの森をプレイします。
今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
あつまれどうぶつの森 名詞,固有名詞,一般,*,*,*,あつまれどうぶつの森,アツマレドウブツノモリ,アツマレドーブツノモリ
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
プレイ 名詞,固有名詞,一般,*,*,*,PLAY!,プレイ,プレイ
し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
ます 助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
。 記号,句点,*,*,*,*,。,。,。
EOS
しかしRのRMeCabから使う場合は、この方法は使えない(RMeCabのdicという引数はユーザ辞書を指定するためのもの。)
そこで、コンフィグでデフォルトのシステム辞書を変更するために、/usr/local/etc/mecabrcを書き換えるのだが、最初は開くと以下のような内容になっている。
; Configuration file of MeCab
;
; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
;
dicdir = /usr/local/lib/mecab/dic/ipadic
; userdic = /home/foo/bar/user.dic
; output-format-type = wakati
; input-buffer-size = 8192
; node-format = %m\n
; bos-format = %S\n
; eos-format = EOS\n
dicdir=がシステム辞書のパスを書くところで、userdic=はユーザ辞書のパスを書くところ(最初は;でコメントアウトされている)。
とりあえずここでは、以下のように書き換えておく。テキストエディタで開けばよいが、管理者権限になってて保存できなかったりする場合はターミナルからsudo viとか編集する。
dicdir = /usr/local/lib/mecab/dic/mecab-ipadic-neologd/
これでシステム辞書が切り替わったので、以下のように、オプションを付けなくても「あつまれどうぶつの森」が一つの固有名詞として判定される。
$ mecab
今日はあつまれどうぶつの森をプレイします。
今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
あつまれどうぶつの森 名詞,固有名詞,一般,*,*,*,あつまれどうぶつの森,アツマレドウブツノモリ,アツマレドーブツノモリ
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
プレイ 名詞,固有名詞,一般,*,*,*,PLAY!,プレイ,プレイ
し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
ます 助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
。 記号,句点,*,*,*,*,。,。,。
Rの方でもちゃんと認識できる。
> RMeCabC("今日はあつまれどうぶつの森をプレイします。")
[[1]]
名詞
"今日"
[[2]]
助詞
"は"
[[3]]
名詞
"あつまれどうぶつの森"
[[4]]
助詞
"を"
[[5]]
名詞
"プレイ"
[[6]]
動詞
"し"
[[7]]
助動詞
"ます"
[[8]]
記号
"。"
さて次に、ユーザ辞書を登録する。例えば以下のように、「95%信頼区間」は複数の単語に分解されてしまうのだが(文脈にもよる可能性があるが)、これを辞書に登録しておいて1つの名詞として認識させたい。
$ mecab
今日は95%信頼区間の求め方を勉強します。
今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
95% 名詞,固有名詞,一般,*,*,*,95%,キュウジュウゴパーセント,キュウジュウゴパーセント
信頼 名詞,サ変接続,*,*,*,*,信頼,シンライ,シンライ
区間 名詞,一般,*,*,*,*,区間,クカン,クカン
の 助詞,連体化,*,*,*,*,の,ノ,ノ
求め 動詞,自立,*,*,一段,連用形,求める,モトメ,モトメ
方 名詞,接尾,特殊,*,*,*,方,カタ,カタ
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
勉強 名詞,サ変接続,*,*,*,*,勉強,ベンキョウ,ベンキョー
し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
ます 助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
。 記号,句点,*,*,*,*,。,。,。
EOS
ユーザ辞書を使う方法はここに書いてある。
http://taku910.github.io/mecab/dic.html
まずMeCabのフォーマットにしたがったCSVファイル(タイトル行は不要)を作成し、それをコンパイルして、/usr/local/etc/mecabrcのユーザ辞書欄にパスを追加するか、もしくは解析をするときにオプションで指定する。
ユーザ辞書はどこに置いててもいいのだが、私は/usr/local/lib/mecab/dic/の中にuserdicというフォルダを作って置いておくことにした。
そのフォルダの中にまず、以下のような内容のcsvをuserdic1.csvという名前で保存する(名前は何でもいいが)。文字コードはUTF-8にしておく。
95%信頼区間,1285,1285,5000,名詞,一般,*,*,*,*,95%信頼区間,キュウジュウゴパーセントシンライクカン,キュージューゴパーセントシンライクカン
一番左が、文章中に出てくる実際の表記で、右から3つ目は基本形。左から2つ目と3つ目のIDは、左文脈ID、右文脈IDというらしいが、空にしておいてもコンパイル時に勝手に埋めてくれるらしい。私はよく分かってないが、システム辞書のコンパイル前のcsvを見て似た単語と同じIDを入れておいた。
左から4つ目の5000という数字は、その単語の登場しやすさを表していて、値を小さくすると出現頻度の高い単語ということになるので、解析時に1つの単語として認識される確率が高くなる。
このコストの数字も、システム辞書のコンパイル前のcsvを見て似た単語のコストを書いとけばいいらしい。認識されやすくするなら、小さい値を設定する。
つぎにこのcsvをコンパイルして、MeCabが読めるユーザ辞書にするのだが、上のリンク先に書いてあるコンパイル方法だと、mecab-dict-indexという実行ファイル(コンパイラ兼インストーラ)が/usr/local/libexec/mecab/というディレクトリに置いてあることになっている。
私も以前はそうだったのだが、いったん最初からMeCabを入れ直したらMac上では/usr/local/Cellar/mecab/0.996/libexec/mecabというディレクトリに入っていた。
なお、場所が分からなければ、ターミナルから
$ sudo find / -name mecab-dict-index
として探せばよい。
ユーザ辞書をコンパイルするには、以下のようにする。
辞書置き場に移動した上で、最初のmecab-dict-indexまでが実行ファイルを指定。-d オプションのところはどのシステム辞書を使っているかを書く。-uは生成されるコンパイル済みユーザ辞書のパスとファイル名。-fと-tはcsvとコンパイル済み辞書の文字コード。そして最後にcsvのパスを指定。
システム辞書の指定が間違っていたり、文字コードの指定が間違っていたりすると、ちゃんと動作しない辞書ができて、その状態でうっかりRMeCabから呼び出すとRのセッションごと落ちるので注意したい。
$ cd /usr/local/lib/mecab/dic/userdic
$ /usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd -u userdic1.dic -f utf-8 -t utf-8 userdic1.csv
reading userdic1.csv ... 1
emitting double-array: 100% |###########################################|
done!
これでコンパイル完了したので、試しに使ってみる。
$ mecab -u userdic1.dic
今日は95%信頼区間の求め方を勉強します。
今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
95%信頼区間 名詞,一般,*,*,*,*,95%信頼区間,キュウジュウゴパーセントシンライクカン,キュージューゴパーセントシンライクカン
の 助詞,連体化,*,*,*,*,の,ノ,ノ
求め 動詞,自立,*,*,一段,連用形,求める,モトメ,モトメ
方 名詞,接尾,特殊,*,*,*,方,カタ,カタ
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
勉強 名詞,サ変接続,*,*,*,*,勉強,ベンキョウ,ベンキョー
し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
ます 助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
。 記号,句点,*,*,*,*,。,。,。
EOS
ちゃんと認識できてるようだ。
RMeCabでもやっておく。dicという引数にユーザ辞書のパスを書く。
> RMeCabC("今日は95%信頼区間の求め方を勉強します。",
+ dic='/usr/local/lib/mecab/dic/userdic/userdic1.dic')
[[1]]
名詞
"今日"
[[2]]
助詞
"は"
[[3]]
名詞
"95%信頼区間"
[[4]]
助詞
"の"
[[5]]
動詞
"求め"
[[6]]
名詞
"方"
[[7]]
助詞
"を"
[[8]]
名詞
"勉強"
[[9]]
動詞
"し"
[[10]]
助動詞
"ます"
[[11]]
記号
"。"
これは先ほど言ったように、mecabrcの中にユーザ辞書の指定を書き込むことも可能で、mecabrcに以下のように追記する。システム辞書(dicdir)はディレクトリ、ユーザ辞書はファイルを指定するというところを間違えやすいので注意が必要。ちなみに、ユーザ辞書はカンマで区切って複数のパスを書けば複数同時に使えるらしい。
; Configuration file of MeCab
;
; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
;
dicdir = /usr/local/lib/mecab/dic/mecab-ipadic-neologd/
userdic = /usr/local/lib/mecab/dic/userdic/userdic1.dic
; output-format-type = wakati
; input-buffer-size = 8192
; node-format = %m\n
; bos-format = %S\n
; eos-format = EOS\n
ちなみに、NEolodgに切り替えると、「すもももももももものうち。」が解析できなくなる。
すもももももももものうち · Issue #41 · neologd/mecab-ipadic-neologd · GitHub