mecab-ipadic-neologdをNMeCab用にshift-jisでコンパイルした
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
のオプション-t
をUTF8
から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);
以上です。