Section 3: GETA による電子メール検索システムの製作

このセクションでは GETA を使って電子メールの検索システムを作成し, その過程で, 日本語形態素解析器との連係や, libwam(3) の C言語インタフェースについて学びます.

3.1 環境の整備

このセクションを読む前に, 奈良先端科学技術大学院大学松本研究室で開発された日本語形態素解析システム茶筌 (ChaSen)をインストールしておいて下さい. なお, この例題を作成するにあたっては, 茶筌 version 2.0b6 を /usr/local/bin/chasenという名前でインストールしています. (その他, jperl, nkf などが必要になります. )

3.2 製作するシステムの概要

mh は強力で, UNIX で人気がある(?)メールリーダの一つです. このセクションでは mh で受信したメールを単語で検索する 簡単なツールを作ってみます. 検索対象は$HOME/Mail/inboxにある数字だけからなるファイルとします.

mh ではinboxなどのフォルダに, 1つのメールを1つのファイルに保存しています. あらかじめこれらのメールを日本語形態素解析器ににより単語に分割し, それをもとに, 各メールが行, 分割された単語が列, i行 j列の値がメール i に現れる単語 j の回数であるような WAM を作ります. 最後に文章を入力すると単語に分割し, その単語でこの WAM (列)を検索し, メールの (mh での) ファィル名を表示するプログラムを作ります.

3.3 ci.conf の修正とディレクトリの作成

まず, 製作する WAM のハンドルを決めます. ここではハンドルをmy-inbox.walkuere.geta.hatoyama.hitachi.co.jp, ショートネームをmy-inboxとします. $GETAROOT/etc/ci.confに新しいハンドルとショートネーム (以下の2行)を追加します.


handle: my-inbox.walkuere.geta.hatoyama.hitachi.co.jp
short-name: my-inbox

ディレクトリも作っておきます.
        $ handle=my-inbox.walkuere.geta.hatoyama.hitachi.co.jp
        $ mkdir -p $GETAROOT/data/$handle

3.4 WAM の設計

先程, メールを行, 単語を列にすると説明しました. そこで, 行と列の name をどうするか決めなければなりません. この例では行の name としてメールのパス名を採用することにします. またそのパス名は$HOME/Mailからの相対パスにしておきます(*8). また, 列の name は単語の綴りそのものにしておけば便利ですから, そうすることにします.

これで大変おおざっぱですが, WAM の設計は終わりです. 作成する WAM のイメージは次の様になります.

           する     では     写真     猿    出現    鳩山    越生  ...
inbox/1       2       1       0       1       1       2       0   ...
inbox/2       3       0       2       0       0       0       3   ...
inbox/3       1       1       0       0       0       0       0   ...
...
そして, freqfile は次の様になります.
@inbox/1
2 鳩山
1 猿
1 出現
2 する
1 では
...
@inbox/2
3 越生
2 写真
3 する
...
@inbox/3
1 する
1 では
...


*8: こうすることで, (あんまりあってほしくないことですが)$HOMEが変わったり, (そして, これは十分あり得そうなことですが) inbox以外のフォルダのメールも同じ WAM で処理したい時に最小限の変更で済むことになります. RMAIL や beckey など, メールが分割されていないのであれば, そのファイルでメールを特定できるような name を 行の name として付ける必要があるでしょう.

3.5 WAM の製作

WAM の製作にかかるまえに, もう少し検討しておかねばならないことがあります. mh はメールのヘッダ情報をファイルの先頭に付けたまま保存しているということです. このまま各メールを日本語形態素解析器で解析すると, Recieved, from, by, id, UAA09724, Thu, 14 ... などあまり意味の無い単語が入って来てしまいます. 検索したいのは, To:やCc:やSubject:や本文の内容です. できればシグネチャは検索対象から外したいのですが, どこがシグネチャか判定するのは難しいのでとりあえずあきらめることにします. 引用の部分はとりあえず検索できることにします. また, Date:も入れたいのですが日付の部分がばらばらになってしまい, これは単純な単語検索の場合よろしくないので, 日付もあきらめることにします.

これで方針は決まりました. まず, $HOME/Mail/inbox/*から freqfile を作るプログラムを製作すれば良いわけです. ここではプログラミング言語として sh を, 日本語形態素解析器として茶筌を用いることにします. この様にしてできあがったのがこのディレクトリにある inbox2freqfileというプログラムです. find, echo, sed, ChaSen, uniq を組み合わせた簡単なプログラムですが, 第1近似としては十分でしょう. さっそく実行し, 結果を確認してみます.

        $ handle=my-inbox.walkuere.geta.hatoyama.hitachi.co.jp
        $ ./inbox2freqfile > $GETAROOT/data/$handle/freqfile
        $ more $GETAROOT/data/$handle/freqfile

句読点や記号なども入っていますが, これを取り除くのは将来の課題ということにしましょう. これで, あとは WAM を作るだけです.

        $ handle=my-inbox.walkuere.geta.hatoyama.hitachi.co.jp
        $ $GETAROOT/sbin/mkw $handle $GETAROOT/data/$handle/freqfile
行と列の name をタイプしてみます.
        $ $GETAROOT/bin/dumpwam $handle cw_row
        $ $GETAROOT/bin/dumpwam $handle cw_col

行は単にファイルの(相対)パス名の一覧です. 一方, 列の方は, inbox 以下で使用回数が多い単語から順に表示されます. これを眺めるだけでもいろいろなことが分かります.