tSeiya's blog

行動結果のアウトプット場

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