しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

NMeCab で UniDic を使う 2 つの方法を試してみた

前回 NMeCab を試した時には標準の IPA 辞書を使いましたが、今回は辞書として UniDic を使ってみました。

最終更新日が 2013 年だったので、MeCab に付いている IPA 辞書よりは新しい気がします。

とりあえずダウンロードした辞書を dic ディレクトリにまるっとコピーしました。

f:id:shiba-yan:20150310000237p:plain

後は App.config で読み込む辞書の場所を指定してやれば設定完了です。

<NMeCab.Properties.Settings>
  <setting name="DicDir" serializeAs="String">
    <value>./dic/unidic</value>
  </setting>
</NMeCab.Properties.Settings>

これでサクッと動くと思っていたんですが、何故か文字コード絡みのエラーが発生してしまいました。どうやら辞書に含まれている文字コード名が C# では対応していない形式のようです。

f:id:shiba-yan:20150310000009p:plain

解決するためには 2 つ方法があります。

1 つが辞書を自前でコンパイルして、文字コードを Shift-JIS とする方法、もう一つが NMeCab に手を入れて utf8 を処理できるようにする方法です。念のため両方で試しました。

辞書を自分でコンパイルする

辞書のコンパイルについては先人を発見したので、今回はそれに倣うことにします。

NMeCabでUnidicを使う - アフタースクールーム

コマンドを打ち込まなくても、Makefile.bat を開いて -t の値を shift_jis にすれば問題なさそうです。

f:id:shiba-yan:20150310003435p:plain

こうしてコンパイルした辞書を使えば、NMeCab でも問題なく UniDic の恩恵に与れました。

f:id:shiba-yan:20150310003906p:plain

ただし Shift-JIS の辞書ではなく、UTF-8 で使いたい場合には、さっきの Makefile.bat で utf-8 と書きなおしてやれば、文字コード名の問題を回避できるみたいです。

f:id:shiba-yan:20150310004052p:plain

utf8 を utf-8 に変更してコンパイルすれば問題なく処理できました。

NMeCab を修正する

辞書のコンパイルで解決できるのは楽ですが、そもそも utf8 と utf-8 の違いでエラーになるのも如何なものかと思ったので、NMeCab 側でも対応してみました。

MeCabDictionary クラス内で Encoding.GetEncoding に渡す前にチェックするだけの簡単なコードです。

string charSet = StrUtils.GetString(reader.ReadBytes(32), Encoding.ASCII);
//this.encoding = Encoding.GetEncoding(charSet);
// utf8 だと GetEncoding が例外を投げるので utf-8 にする
this.encoding = Encoding.GetEncoding(charSet == "utf8" ? "utf-8" : charSet);

とりあえずダサいコードですが、utf8 ぐらいしか問題にならないと思うので、こんな感じで片付けました。

これで NMeCab でも UniDic を使えるようになったので試してみましたが、IPA 辞書と比べて分割多めな感じです。そもそも UniDic の特徴が短単位での解析なので、当たり前と言えば当たり前なんですが。

bot 的には長単位の方が意味が通じやすくなりそうです。