MeCabにユーザ辞書を追加する
概要
$ mecab 人類は衰退しました 人類 名詞,一般,*,*,*,*,人類,ジンルイ,ジンルイ は 助詞,係助詞,*,*,*,*,は,ハ,ワ 衰退 名詞,サ変接続,*,*,*,*,衰退,スイタイ,スイタイ し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ まし 助動詞,*,*,*,特殊・マス,連用形,ます,マシ,マシ た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ EOS
を
$ mecab 人類は衰退しました ,じんるいはすいたいしました ,一般,*,*,*,*,*,*,じんるいはすいたいしました EOS
となるように
$ mecab ソードアート・オンライン ソード 名詞,固有名詞,組織,*,*,*,ソード,ソード,ソード アート 名詞,固有名詞,人名,名,*,*,アート,アート,アート ・ 記号,一般,*,*,*,*,・,・,・ オンライン 名詞,一般,*,*,*,*,オンライン,オンライン,オンライン EOS
を
$ mecab ソードアート・オンライン ソードアート・オンライン 名詞,一般,*,*,*,*,*,*,そーどあーと・おんらいん,そーどあーと・おんらいん EOS
となるようにユーザ辞書に追加する.
homebrewでMeCabと辞書のインストール
brew install mecab brew install mecab-ipadic
追加するデータの作成
例えば,以下のような追加するデータと読みをadd.csvに書き込むとする
(CSVを利用するのは,後で大量にデータを追加するときにも困らないようにするため)
人類は衰退しました,じんるいはすいたいしました ソードアート・オンライン,そーどあーと・おんらいん
MeCabのフォーマットは
表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音
http://mecab.googlecode.com/svn/trunk/mecab/doc/dic.html
となっているので,それに合わせてadd.csvを書き換えます
左文脈IDと右文脈IDは,left-id.def,right-id.def を見れば良いとのことで,「1345 名詞,一般,*,*,*,*,*」としようと思いましたが,「reading out.csv ... dictionary.cpp(202) [lid >= 0 && rid >= 0 && matrix.is_valid(lid, rid)] invalid ids are found lid=1345 rid=1345」と言われてしまったので,-1にして自動的に判定してもらいます.
(MeCab: 単語の追加方法 http://mecab.googlecode.com/svn/trunk/mecab/doc/dic.html)
コスト等の計算は,
MeCabにユーザ辞書を追加する。 - Seishinkouki. http://d.hatena.ne.jp/yukihir0/20110201/1296565687
をそのまま利用させていただきます.
# -*- encoding: utf-8 -*- import sys import codecs if __name__ == "__main__": argvs = sys.argv argc = len(argvs) if (argc != 3): print 'Usage: # python %s Input_FileName Output_FileName' % argvs[0] quit() fin_name = argvs[1] fout_name = argvs[2] fin = codecs.open(fin_name, "r", "utf-8") fout = codecs.open(fout_name, "w", "utf-8") for line in fin: #word = line[:-1].split('\t')[1] word = line.split(',') print word[0] + word[1] cost = int(max(-36000, -400*len(word[0])**1.5)) fout.write(u"%s,1345,1345,%d,名詞,一般,*,*,*,*,*,*,%s,%s\n" % (word[0], cost, word[1], word[1])) fin.close() fout.close()
上記のプログラムを実行する前に,add.csvの文字コードをUTF-8に変換しときます
nkf -w add.csv > add_utf8.csv
もし,nkfコマンドが使えなければ,brewでインストールしちゃいましょう
brew install nkf
これでプログラムを実行します
python create_dic.py add_utf8.csv out.csv
結果はout.csvに書き込まれますので見てみると
$ cat out.csv 人類は衰退しました,1345,1345,-10800,名詞,一般,*,*,*,*,*,*,じんるいはすいたいしま,じんるいはすいたいしました ソードアート・オンライン,1345,1345,-16627,名詞,一般,*,*,*,*,*,*,そーどあーと・おんらいん,そーどあーと・おんらいん
のようになっています.
辞書の追加
CSV形式をそのまま利用できないので,MeCabで使える形式にコンパイルします.
$ /usr/local/Cellar/mecab/0.993/libexec/mecab/mecab-dict-index -d /usr/local/Cellar/mecab/0.993/lib/mecab/dic/ipadic -u original.dic -f utf8 -t utf8 out.csv reading out.csv ... 2 emitting double-array: 100% |###########################################| done!
そうすると,original.dicが出来上がります.
ーuオプションを使えば,ユーザ辞書が有効にできます.
$ mecab -u original.dic ソードアート・オンライン ソードアート・オンライン 名詞,一般,*,*,*,*,*,*,そーどあーと・おんらいん,そーどあーと・おんらいん EOS
ただ,いちいちオプションを追加するのは面倒なので,
#ファイルの移動 mv original.dic /usr/local/Cellar/mecab/0.993/lib/mecab/dic #mecabrcを開く emacs /usr/local/etc/mecabrc #以下を書き加える userdic = /usr/local/Cellar/mecab/0.993/lib/mecab/dic/original.dic
これでパスが通るので,いつでも使える
以下を参考にしました.
MeCab: 単語の追加方法 http://mecab.googlecode.com/svn/trunk/mecab/doc/dic.html
MeCab の辞書に単語を追加して利用する - kurainの壺 http://d.hatena.ne.jp/r_kurain/20120725/1343226646
MeCabにユーザ辞書を追加する。 - Seishinkouki. http://d.hatena.ne.jp/yukihir0/20110201/1296565687
はてなキーワードからMecCab辞書を生成する(Ruby版) http://www.mwsoft.jp/programming/munou/mecab_hatena.html