読者です 読者をやめる 読者になる 読者になる

MeCabのユーザー辞書編集

python 備忘録

MeCabで使う辞書を編集したいけど権限が無くて編集できないときの対処法

mecabrc

~/.mecabrc を作成し,/usr/local/etc/mecabrc の内容をコピーして

// ; userdic = /home/foo/bar/user.dic
userdic = ~/user_dic/hoge.dic

と書き換える.セミコロンも消す.
新しい単語についての情報を持つファイル(以下で作成)を
~/user_dic/hoge.dicとします.

ユーザー辞書の編集

~/user_dic/hoge.csvを用意する.

hoge.csvの内容を作成

fname = "~/user_dic/hoge.csv"
words = ["hoge", "fuga", "foo", "bar"]  #更新したい単語のリスト
with file(fname, "a") as dic:
	for word in words:
		cost = int(max(-36000, -400 * len(word) ** 1.5))
		_new_dic_ = "%s, 0, 0, %d, 名詞, 固有名詞, 人名, *, *, *, %s, %s, %s\n"\
							 % (word, cost, word, word, word)
		dic.write(_new_dic_)
コスト
cost = int(max(-36000, -400 * len(word) ** 1.5))

についてはMeCabの辞書にはてなキーワードを追加しようを参考にさせていただきました.
costとはその単語がどれだけ出現しやすいかを示す値なので,小さいほど頻出で,大きいほど珍しい単語となります.

ちなみに,絶対に誤判定して欲しくない単語の追加だったので,

cost = -99999

とかすればほぼ確実に追加した単語と判定してくれました.

mecab辞書のフォーマット

MeCab:単語の追加方法にあるように
csv形式で,左から

表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音

となっています.

今回は全て人名として扱って欲しいので

_new_dic_ = "%s, 0, 0, %d, 名詞, 固有名詞, 人名, *, *, *, %s, %s, %s\n"\
					 % (word, cost, word, word, word)

このようにしました.
固有名詞だったら左右の文脈IDは0で良さそうです.経験上.

ユーザー辞書の追加

作成した辞書(csv)をコンパイルします.

// コマンドラインから
% /usr/local/libexec/mecab/mecab-dict-index -d/usr/local/lib/mecab/dic/ipadic -u hoge.dic -f utf-8 -t utf-8 hoge.csv

ここでhoge.csvは上で作成した~/user_dic/hoge.csvのことを指します.
hoge.dicはhoge.csvから作成する新しい辞書ファイルの名前です.適当にどうぞ.

ちなみにpythonからだと

update_dic = ("/usr/local/libexec/mecab/mecab-dict-index"
 " -d/usr/local/lib/mecab/dic/ipadic -u hoge.dic -f utf-8 -t utf-8 hoge.csv")
os.system(update_dic)

とすれば実行できます.

うまくいかなければ一旦hoge.csv

echo -n > hoge.csv

で空にしてからもう一度つくり直して試してください.

いい形態素解析ライフを!