どん底から這い上がるまでの記録

どん底から這い上がりたいけど這い上がれない人がいろいろ書くブログ(主にプログラミング)

MeCabに自分でカスタマイズした辞書を追加する

 

MeCabあるキーワードをどうしても正確に形態素解析してほしかったので、自分でカスタマイズした辞書を追加してみました。

環境はWindowsです。MacLinuxユーザのかたは関連リンクの公式の説明を見れば辞書のカスタマイズはできるんじゃないかと思います。Windowsでのやり方と流れは同じだと思うのでこの記事が参考になれば幸いです。

 

 

関連リンク

辞書のカスタマイズ

MeCabで使われる辞書への単語追加には2通りの方法があるようです。

  1. システム辞書に追加
  2. ユーザ辞書に追加

辞書更新が頻繁でないときや、解析速度を落としたくない場合はシステム辞書を更新するのが良いようです。システム辞書を更新するには少々時間がかかるようなので、頻繁に辞書を更新する場合はユーザ辞書の更新が良いとのこと。

今回はユーザ辞書を新しく追加してみたいと思います。

理由はユーザ辞書を追加することにより、どれくらい解析速度に影響があるのかを知りたいからです。今回追加するのはたった1単語なのでまったく影響ないと思いますが、とりあえずやってみます。

ユーザ辞書の追加

ここからユーザ辞書への単語の追加方法を書いていきます。

1. 作業ディレクトリに移動

まずはコマンドプロンプトを開いて適当な作業ディレクトリに移動します。

> cd workspace

2. csvファイルの作成

workspace> type NUL > foo.csv

適当な名前でcsvファイルを作成します。

3. csvファイルに単語を追加

作成したfoo.csvに追加したい単語をフォーマットに合わせて記述します。

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

今回追加する単語は

{name?}

です。

フォーマットに合わせると下のような感じになります。

{name?},,,10,名詞,固有名詞,人名,一般,*,*,{name?},ネーム,ネーム

文脈IDは空にしておくとmecab-dict-indexが自動的にIDを付与します。

コストはその単語の出現率を示します。小さいほど出現率が高くなります。

4. 辞書のコンパイル

以下のバッチファイルを作業ディレクトリに作成します。

user_custom.bat

echo on
"C:\Program Files (x86)\MeCab\bin\mecab-dict-index" -d "C:\Program Files (x86)\MeCab\dic\ipadic" -u user.dic -f utf-8 -t utf-8 foo.csv
pause
  • -d DIR: システム辞書があるディレクト
  • -u FILE: FILEというユーザファイルを作成

user_custom.batという名前で作りました。

いくつか注意点があります。

まずMeCabのパスについて。私はProgram Files (x86)直下にMeCabがあります。人によってはこれがProgram Filesの下にある人もいると思います。なので自分の環境に合わせてパスの設定をしてください。

このバッチファイルでやっていることはさっき作成したfoo.csvから自分用のuser.dicという名前の辞書を新しく作っています。辞書の名前は任意です。

作業ディレクトリでこのバッチファイルを実行します。

wordspace> user_custom.bat

実行すると以下のように表示されるはずです。

workspace>"C:\Program Files (x86)\MeCab\bin\mecab-dict-index" -d "C:\Program Files (x86)\MeCab\dic\ipadic" -u user.dic -f utf-8 -t utf-8 foo.csv
reading foo.csv ... 1
emitting double-array: 100% |###########################################| done! C:workspace>pause

作業ディレクトリの中にuser.dicという新しい辞書ができていれば成功です。

mecabrcの編集

新しく作った辞書user.dicを移動させます。なお、この作業は任意です。私は作業ディレクトリに辞書を置いたままにするのが嫌なので移動させるだけです。

管理者権限でコマンドプロンプトを開いて作業ディレクトリに行きます。

moveコマンドで移動させます。

workspace>move user.dic "C:\Program Files (x86)\MeCab\dic\"

そして、MeCabが新しく作った辞書を読み込めるようにmecabrcにパスを設定します。

mecabrcはC:\Program Files (x86)\MeCab\etcにあります。

(※おそらくmecabrcは管理者権限で開く必要があります。コマンドプロンプトを管理者権限で開くときと同じ要領でテキストエディタを開いてください。)

デフォルトで以下のようになっていました。

;
; Configuration file of MeCab
;
; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
;
dicdir = $(rcpath)\..\dic\ipadic ; 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

userdicのパスを新しく作った辞書user.dicがあるパスに変更します。

;
; Configuration file of MeCab
;
; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
;
dicdir = $(rcpath)\..\dic\ipadic userdic = C:\Program Files (x86)\MeCab\dic\user.dic ; output-format-type = wakati
; input-buffer-size = 8192 ; node-format = %m\n
; bos-format = %S\n
; eos-format = EOS\n

以上でユーザ辞書の設定は終了です。 登録した単語がただしく形態素解析されるか確認してみます。

テスト

試しに以下のサンプルプログラムを動かしてみます。

import MeCab

tagger = MeCab.Tagger("-Ochasen")
def tokenizer(sentence):
    tag = tagger.parseToNode(sentence)
    while tag:
        features = tag.feature.split(',')
        token = tag.surface
        print(token, features)
        tag = tag.next

        
sample = "こんにちは{name?}さん(^^"
tokenizer(sample)

結果

出力は以下のようになりました。

 ['BOS/EOS', '*', '*', '*', '*', '*', '*', '*', '*']
こんにちは ['感動詞', '*', '*', '*', '*', '*', 'こんにちは', 'コンニチハ', 'コンニチワ']
{name?} ['名詞', '固有名詞', '人名', '一般', '*', '*', '{name?}', 'ネーム', 'ネーム']
さん ['名詞', '接尾', '人名', '*', '*', '*', 'さん', 'サン', 'サン']
(^^ ['名詞', 'サ変接続', '*', '*', '*', '*', '*']
 ['BOS/EOS', '*', '*', '*', '*', '*', '*', '*', '*']

登録した単語{name?}がちゃんと解析されています。(^^

ちなみに、登録した単語は一語だけなので解析速度に影響はまったくありませんでした。

ここまで、ユーザ辞書に単語を追加する方法を書いてみました。