MeCabでユーザー辞書を登録する
バイトでやってる自然言語処理のお仕事です。
- データをMeCab辞書のフォーマットにパースしてcsvで保存
- /usr/local/libexec/mecab/mecab-dict-index でコンパイル
- /usr/local/etc/mecabrc を編集してユーザー辞書を指定する
- 参考: MeCab: 単語の追加方法
MeCab辞書のフォーマット
例:
工藤,1223,1223,6058,名詞,固有名詞,人名,名,*,*,くどう,クドウ,クドウ
具体的には
表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音
今回は名詞を扱うので、ある程度決め打ちにしておく。
{単語},-1,-1,10,名詞,一般,*,*,*,*,{単語},*,*,{登録タグ}
- 文脈ID:
左文脈IDは, その単語を左から見たときの内部状態IDです. 通常システム辞書と同一場所にある left-id.def から該当する ID を選択します. -1 としておくと, mecab-dict-index が自動的に ID を付与します.
- コスト:
コストは,その単語がどれだけ出現しやすいかを示しています. 小さいほど, 出現しやすいという意味になります. 似たような単語と 同じスコアを割り振り, その単位で切り出せない場合は, 徐々に小さくしていけばいいと思います.
csvファイルを作る
とりあえずpythonで。エンコーディングはmecabのエンコーディングにあわせておく必要がある。
自分はutf-8決め打ち。
class Term(object): def __init__(self,title,option="*" ): self.title = title.replace(","," ") self.left = -1 self.right = -1 self.cost = 10 self.langtype = "名詞" self.type1 = "一般" self.type2 = "*" self.type3 = "*" self.actx = "*" self.acttype = "*" self.base = title self.read = "*" self.anounce = "*" self.option = option def dump(self): return ",".join([self.title , str(self.left ), str(self.right ), str(self.cost ), self.langtype , self.type1 , self.type2 , self.type3 , self.actx , self.acttype , self.base , self.read , self.anounce , self.option ] ) # 泥臭い def write(fname,terms): f = open(fname,"w") for i in terms: f.write(i.dump()+"\n") print "make it :" + fname f.close()
あとはTermオブジェクトの配列を作ってwriteに渡してやればいい。
コンパイル
作ったcsvに対して /usr/local/libexec/mecab/mecab-dict-index で dicファイルにコンパイルする。mecab-dict-index はmecabが動いているならインストールされているはず。
エンコーディングに注意。
$ /usr/local/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/ipadic -u なんとか.dic -f utf-8 -t utf-8 今作った.csv
これはipadicを使ってる場合。だいたいipadicかnaistの辞書を使っていると思われる。後述するmecabrcファイルの編集で使用するファイルを変更する
ipadic
/usr/local/etc/mecabrc に userdicを追加
- 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 = /Users/mizchi/dbcls/mydb.dic ; さっきのcsvを追加 ; 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を変更すればシステム辞書を変更できる
使ってみた
dbclsで扱う文書を辞書化したものを使った
[mizchi]% echo アデニンの構造とカシューナッツ |mecab アデニン 名詞,一般,*,*,*,*,アデニン,*,*,dbcls の 助詞,連体化,*,*,*,*,の,ノ,ノ 構造 名詞,一般,*,*,*,*,構造,*,*,dbcls と 名詞,一般,*,*,*,*,と,*,*,dbcls カシュー 名詞,一般,*,*,*,*,カシュー,カシュー,カシュー ナッツ 名詞,一般,*,*,*,*,ナッツ,ナッツ,ナッツ EOS
辞書に含まれている単語がちゃんと適用されてるし、そうじゃないものはシステム辞書が使われている。
「と」まで含まれているので、TF/IDFなどを使って専門用語のフィルターを掛けた方がよさそうだ。