XPCOM MeCab
 

 このページは、MeCab 0.91によるわかち書き機能を、Mozilla系のアプリケーション(特にFirefox/Thunderbird)から、便利に使う方法について記述していきます。砕けて言うと、そういう機能の拡張を作って配布することになるのですが、

  • MeCabのわかち書き辞書はZIPで圧縮しても7MB弱あるので、拡張もそれに準じたサイズになってしまう。
  • googlepages.comは2~4MBくらいでダウンロードを一方的に打ち切る。(?)

という事情のため、最終的な成果を提供できないかもしれません。ただ、拡張本体(XPCOMのライブラリ)はゴミみたいなサイズですし、作る手間もそれなりです。つまり、ソース+技術的な情報という形式にすれば、この問題を回避できるので、当分その方向でいこうと思います。

ここにある情報は、すぐに風化してしまうでしょうから、その点、お気をつけ下さい。(2006年7月3日)


1. XPCOM Interface

とりあえず、単純なインターフェイスをこしらえてみました。

#include "nsISupports.idl"
[scriptable, uuid(3bcc2452-35f8-4d7d-9853-d982e4277b4d)]
interface mozIMorphologicalAnalyzer : nsISupports {
  /*
   * Separate each word with a white space.
   * e.g. "MYNAMEISFOO" -> "MY NAME IS FOO".
   *
   * @returns an output of analysis.
   * @param aText a string to be analyzed.
   */
  AUTF8String separate(in AUTF8String aText);
};

これをXPConnectでJavascriptから利用する時は、次のようになります。

const MECAB_INTRODUCTION = "\u004d\u0065\u0043\u0061\u0062\u306f\u4eac\u90fd\u5927"
+ "\u5b66\u60c5\u5831\u5b66\u7814\u7a76\u79d1\u2212\u65e5\u672c\u96fb\u4fe1\u96fb"
+ "\u8a71\u682a\u5f0f\u4f1a\u793e\u30b3\u30df\u30e5\u30cb\u30b1\u30fc\u30b7\u30e7"
+ "\u30f3\u79d1\u5b66\u57fa\u790e\u7814\u7a76\u6240\u5171\u540c\u7814\u7a76\u30e6"
+ "\u30cb\u30c3\u30c8\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4e00\u74b0\u3068"
+ "\u3057\u3066\u958b\u767a\u3055\u308c\u305f\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc"
+ "\u30b9\u5f62\u614b\u7d20\u89e3\u6790\u30a8\u30f3\u30b8\u30f3\u3067\u3059\u3002";

var mecab =
  Components.classes["@mozilla.org/textanalyzer/mecab;1"]
            .createInstance(Components.interfaces.mozIMorphologicalAnalyzer);
alert(mecab.separate(MECAB_INTRODUCTION));

コントラクトIDの "@mozilla.org/textanalyzer/mecab;1"はMeCabを名指ししているのに対して、インターフェイス名は汎用的な表現であるのに注意してください。形態素解析エンジンの実装は、他にもChaSenやKAKASIがありますし、日本語以外にも当然あるでしょうから、ここでは上記のようにしておきます。ひょっとしたら、辞書の名前(ipadic)も含めるべきだったかもしれませんが、あまり長いとスクリプトを書く人が大変なので…。わかち書き以外の機能は、必要ならこのインターフェイスに対して、おいおい、追加されていくでしょう。

2. 辞書の準備

XPCOMは、ブラウザの心臓部という性格上、文字コードの変換くらいは難なくこなします。しかし、わざわざ効率を落とすこともないので、今回MeCabの内部ではUTF-8だけを使うことにします。つまり、辞書の文字コードもUTF-8にするのですが、これがなかなかハードです。 そのあたりは楓 software::Web関連の開発日誌::MeCab(和布蕪)辞書の構築に詳しいです。

3. MeCabの準備

MeCabは共用のライブラリ(dll/so)を提供してくれていますが、拡張というソフトウェア手法ではそれを生かせないので、ここではスタティックリンクします。つまり、ソースが必要です。それで、せっかくソースをコンパイルするので、ついでにいじっておきます。

Windows版は設定ファイルを読みに行く順番が、MeCab 0.90 における mecabrc ファイルの優先順位: ナマズのブログの解説のようにレジストリ指定DLL脇のファイルになっているので、コレを逆にしておきます。具体的には/src/tageer.cppのMeCab::getDefaultRc(...)で、該当部分をひっくり返します(LGPLに忠実に従うなら、この部分もパッチなりを出さないといけないんでしょうが、この説明でわかりますよね?)。件のレジストリ設定は、サード開発者にとっては不確定要素ですから、自分が確実に知っているDLL横のファイルの有無より優先度が高いと、困るんです。特にFirefoxはnsIInstallLocationのバグのせいで引数渡しも微妙なものですから、こうしておくと、難易度がぐっと違ってきます。

4.ダウンロード

 mozMeCab-dic.xpi 

WindowsとLinux共用の拡張ですが、辞書(ipadic)が入っていませんので、別途手に入れて、dic/ipadic/に設置する必要があります。ひょっとすると、GCCはバージョンが高すぎるかもしれません。

Windows環境では例によってMicrosoft .NET Framework 2.0が必要だと思います。

 

 mozMeCab_source.zip

Linuxでこれをビルドするには、とりあえず、MeCab0.91をビルドしてインストールする必要があります。Windows版もそうなのですが、辞書のおき場所やlibmecab.dllのインストール方法で妥協するなら、配布されているインストーラー(のsdk)だけでも何とかなります。Makefileはやっつけなので、可読性が低いです。

どうしてもUTF-8の辞書の作り方がわからない場合は、

http://lxr.mozilla.org/mozilla/source/xpcom/string/public/nsXPCOMStrings.h
http://lxr.mozilla.org/mozilla1.8/source/xpcom/string/public/nsStringAPI.h 
 
にある、NS_CSTRING_ENCODING_NATIVE_FILESYSTEM を使えば、自動的にShift-JIS/EUC-JPになるので、便利です。