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

意識の高いLISPマシン

藤原惟/すかいゆき(@sky_y)の技術用ブログ

mecab-ipadic-neologdをNMeCab用にshift-jisでコンパイルした

C# Programming

C#形態素解析をやりたくて、NMeCabを使うことにしました。 mecab-ipadic-neologdという辞書がいいらしいと聞いたのでNMeCabでも使おうと思ったのですが、少し手間取りました。

方法1: NMeCabのソースに手を加える

NMeCab でも mecab-ipadic-neologd を使ってみた - しばやん雑記

で紹介された方法ですが、NMeCabのソースを編集して、自前ビルドする方法があるそうです。しかし、できればNuGetのNMeCabを使用したいので、この方法はパスしました。

方法2: 辞書をshift-jisでコンパイルする

mecab-ipadic-neologdは事前にコンパイルして使う必要があるのですが、付属のスクリプトではUTF-8でしかコンパイルできない上に、「UTF8」という変なエンコーディング文字列を埋め込むのでNMeCabでは例外が発生します。

そこで、コンパイルスクリプトに手を加えてshift-jisでコンパイルすることにします。

具体的には、(cloneしたディレクトリ)/libexec/make-mecab-ipadic-neologd.shの166, 167, 182行目、mecab-dict-indexのオプション-tUTF8からshift-jisに書き換えてやります。

--- a/libexec/make-mecab-ipadic-neologd.sh
+++ b/libexec/make-mecab-ipadic-neologd.sh
@@ -163,8 +163,8 @@ fi

 if [ ${WANNA_CREATE_USER_DIC} = 1 ]; then
     echo "${ECHO_PREFIX} Create the user dictionary using ${NEOLOGD_DIC_DIR}/${SEED_FILE_NAME}"
-    echo "${MECAB_LIBEXEC_DIR}/mecab-dict-index -f UTF8 -t UTF8 -d ${MECAB_DIC_DIR}/ipadic -u ${NEOLOGD_DIC_DIR}/${SEED_FILE_NAME}.dic ${NEOLOGD_DIC_DIR}/${SEED_FILE_NAME}"
-    ${MECAB_LIBEXEC_DIR}/mecab-dict-index -f UTF8 -t UTF8 -d ${MECAB_DIC_DIR}/ipadic -u ${NEOLOGD_DIC_DIR}/${SEED_FILE_NAME}.dic ${NEOLOGD_DIC_DIR}/${SEED_FILE_NAME}
+    echo "${MECAB_LIBEXEC_DIR}/mecab-dict-index -f UTF8 -t shift-jis -d ${MECAB_DIC_DIR}/ipadic -u ${NEOLOGD_DIC_DIR}/${SEED_FILE_NAME}.dic ${NEOLOGD_DIC_DIR}/${SEED_FILE_NAME}"
+    ${MECAB_LIBEXEC_DIR}/mecab-dict-index -f UTF8 -t shift-jis -d ${MECAB_DIC_DIR}/ipadic -u ${NEOLOGD_DIC_DIR}/${SEED_FILE_NAME}.dic ${NEOLOGD_DIC_DIR}/${SEED_FILE_NAME}
     if [ -f ${NEOLOGD_DIC_DIR}/${SEED_FILE_NAME}.dic ]; then
         echo "${ECHO_PREFIX} Success to create the user dictionary"
         echo
@@ -179,7 +179,7 @@ fi
 cp ${BASEDIR}/../misc/dic/unk.def .

 echo "${ECHO_PREFIX} Re-Index system dictionary"
-${MECAB_LIBEXEC_DIR}/mecab-dict-index -f UTF8 -t UTF8
+${MECAB_LIBEXEC_DIR}/mecab-dict-index -f UTF8 -t shift-jis

 echo "${ECHO_PREFIX} Make custom system dictionary on ${BASEDIR}/../build/${NEOLOGD_DIC_NAME}"
 make

その後、マニュアル通りにコンパイルを実行すると、shift-jisで作られた辞書バイナリが作成できます。 これをWindowsのディレクトリに持ってきてC#側で辞書を指定してやると、うまく動くようになります。

Visual Studioのプロジェクトディレクトリにコンパイル済み辞書を置く場合は、以下のように設定すると良いでしょう。

MeCabParam param = new MeCabParam();
param.DicDir = @"..\..\dic\mecab-ipadic-neologd"; 
MeCabTagger t = MeCabTagger.Create(param);

以上です。