前回 NMeCab を試した時には標準の IPA 辞書を使いましたが、今回は辞書として UniDic を使ってみました。
最終更新日が 2013 年だったので、MeCab に付いている IPA 辞書よりは新しい気がします。
とりあえずダウンロードした辞書を dic ディレクトリにまるっとコピーしました。
後は App.config で読み込む辞書の場所を指定してやれば設定完了です。
<NMeCab.Properties.Settings> <setting name="DicDir" serializeAs="String"> <value>./dic/unidic</value> </setting> </NMeCab.Properties.Settings>
これでサクッと動くと思っていたんですが、何故か文字コード絡みのエラーが発生してしまいました。どうやら辞書に含まれている文字コード名が C# では対応していない形式のようです。
解決するためには 2 つ方法があります。
1 つが辞書を自前でコンパイルして、文字コードを Shift-JIS とする方法、もう一つが NMeCab に手を入れて utf8 を処理できるようにする方法です。念のため両方で試しました。
辞書を自分でコンパイルする
辞書のコンパイルについては先人を発見したので、今回はそれに倣うことにします。
コマンドを打ち込まなくても、Makefile.bat を開いて -t の値を shift_jis にすれば問題なさそうです。
こうしてコンパイルした辞書を使えば、NMeCab でも問題なく UniDic の恩恵に与れました。
ただし Shift-JIS の辞書ではなく、UTF-8 で使いたい場合には、さっきの Makefile.bat で utf-8 と書きなおしてやれば、文字コード名の問題を回避できるみたいです。
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 的には長単位の方が意味が通じやすくなりそうです。