MeCabでユーザー辞書を登録する

バイトでやってる自然言語処理のお仕事です。

  1. データをMeCab辞書のフォーマットにパースしてcsvで保存
  2. /usr/local/libexec/mecab/mecab-dict-index でコンパイル
  3. /usr/local/etc/mecabrc を編集してユーザー辞書を指定する

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などを使って専門用語のフィルターを掛けた方がよさそうだ。