3.6.2: 日本語形態素解析器と, ci.conf についてもう少し

単語だけ入れて検索するインタフェースにすれば簡単なのですが, 利用者が日本語形態素解析器の分割方法を 100% 予測することは困難なので, これから作る検索システムでは, 文章を入力し, それをWAM を作った時と同じ方法で単語に分割してから, それを改めて入力単語として処理することにします. 単語に分割するだけなら ChaSen のライブラリをリンクすれば一発なのですが, 将来, 句読点や stopword を取り除くフィルタを 本体の変更無しに追加することを考えれば(*11) ChaSen も含めて 外付けフィルタにしておくと便利です. そして, そのフィルタを先に作った inbox2freqfile でも使用することにすれば, 同一の処理を行うことが保証できます. (図1 は悪い設計例です. )

そのために, 例えば, シンプルな日本語形態素解析 (w/不要語除去フィルタ) プロトコル (a.k.a Simple Morphological Analyser Protocol, SMAP) を設計し, 形態素解析サーバとクライアントの間の通信を標準化してしまう案などが考えられます (図2). しかし, そのうち ChaSen server などに ユーザ定義のフィルタを入れることができるようになるかもしれません(図3).

とりあえず今回は検索ができれば良いので, shell script で ChaSen と後付けフィルタを結合し, それを C 言語から外付けプログラムとして呼び出すことにします. また, msearch を変更せずにそのプログラム名を変更できる様にします. その為には ci.conf のユーザ定義属性を使います.

ci.conf のユーザ定義属性については, 3.6.1 で触れませんでしたのでここで説明します. ci.conf には任意の属性を書ことができます. そしてその値は ci_value で取得できます. 例えば ci.conf で, my-inbox の属性として ci.conf に以下の様に書かれているとします.


handle: my-inbox.walkuere.geta.hatoyama.hitachi.co.jp
short-name: my-inbox
chasen: /usr/local/bin/chasen

この時に,
        char *chasen;
        chasen = ci_value("my-inbox", "chasen");
により, "/usr/local/bin/chasen"が返ります. また, 属性名の最後が ":p" で, かつ値の先頭が "/" でなければ, "$GETAROOT/data/$handle/" が値の前に付加されます. こんな具合です.
handle: my-inbox.walkuere.geta.hatoyama.hitachi.co.jp
short-name: my-inbox
special-chasen:p: chasen

        char *chasen;
        chasen = ci_value("my-inbox", "special-chasen");
        printf("special-chasen = [%s]\n", chasen);

        $ ./a.out
        special-chasen = [/usr/local/geta/data/my-inbox.walkuere.geta.hatoyama.hitachi.co.jp/chasen]
今回はこの機能を用いて ChaSen + 後付けフィルタ を呼びだす shell script のパス名を指定することにします.

+-----------------------------------------------+
|         msearch    built_in不要語除去フィルタ |
+--|----------------------------------------^---+
   |                                        |  <== ChaSen のクライアント/サーバ
   |                                        |      ライブラリを利用
+--|----------------------------------------|---+
|  + ---> ChaSen ---------------------------+   |
+-----------------------------------------------+
        図1  不要語除去フィルタを msearch が自前で後付け
             (フィルタを組み込みではなく ChaSen の様に外付けにしてもほぼ同様)



+-----------------------------------------------+
|              msearch                          |
+--|----------------------------------------^---+
   |                                        |     <== ここのプロトコルを
   |                                        |         SMAP として標準化
+--|----------------------------------------|---+
|  + ---> ChaSen ---> 不要語除去フィルタ ---+   |
+-----------------------------------------------+
        図2  SMAP + 形態素解析サーバによる形態素解析器の拡張
             (msearch はフィルタの存在を知る必要が無い)



+-----------------------------------------------+
|              msearch                          |
+--|----------------------------------------^---+
   |                                        |  <== ChaSen のクライアント/サーバ
   |                                        |      ライブラリを利用
+--|----------------------------------------|---+
|  + --> ChaSen -> (ChaSen の出力ルーチン)--+   |
+--------------------|--------------^-----------+
         +-----------+              |        <== ChaSen のユーザ定義フィルタ
         |                          |            機能を利用
+--------|--------------------------|-----------+
|        +--> 不要語除去フィルタ ---+           |
+-----------------------------------------------+
        図3   ChaSen のユーザ定義フィルタによる形態素解析機能の拡張
             (msearch はフィルタの存在を知る必要が無い上, 広く使われている
              ChaSen の クライアント/サーバライブラリが利用可能)


*11: 実は, WAM からそれらを除けば, この様な機能を msearch に加える必要は無い.