このチュートリアルでは, 「WAM チュートリアル」で作った 電子メール検索プログラムをもとにして, 検索要求と文書との類似度計算式をカスタマイズする方法について学びます.
まずは「WAM チュートリアル」を一通り読んで, 電子メール検索プログラムを作ってください. 実行すると以下のようになるはずです.
$ ./Msearch 昨日、猿が現れました ^D 3 inbox/2 2 inbox/1 1 inbox/4 1 inbox/3 ...「昨日、猿が現れました」が検索要求です."inbox/1"などが検索結果の文書です. その前の数字は, それぞれの文書が含んでいる検索単語の異り数です. Msearch では,この数字が検索要求と文書との類似度になります.
この類似度はヒットした検索単語の異り数を単純に数えているため, 例えば「昨日」という単語があらわれる文書と 「猿」という単語があらわれる文書はヒット数が同じで差がありません. この場合,どちらかというと「昨日」より 「猿」があらわれる文書のほうが好ましいでしょう. また,「猿」にヒットする文書でも, 「猿」が 1 回しかあらわれない文書より 5 回あらわれる文書のほうが 好ましいでしょう. 高度な検索システムでは,何らかの方法で単語の重要度を計り, 単語の重要度にもとづいて検索要求と文書との類似度を計算しています.
もちろん,libwam を使えば,どんな類似度計算でも実装できますが, ちょっと面倒です. libae は, いろいろな類似度計算を簡単に実装するためのライブラリです. このチュートリアルでは, libae を使って,実際に類似度計算式のカスタマイズをおこなってみましょう.
libae を使う利点は他にもあります. Msearch は以下のようなプロセスからなっていました.
#!/bin/sh ./msearch $* | sort | uniq -c | sort -nr最初の"msearch"はそれぞれの検索単語について, その単語を含む文書をリストするだけですから, 複数の検索単語を含む文書は重複してバラバラに出力されてしまいます. 次の"sort"で重複する文書を集め,"uniq -c"で回数を集計し,さらに"sort -nr"で出現回数順にソートしています. この方法は,検索対象が大きくなるにつれ効率が悪くなります. 特に,最初の"sort"の入力が膨大な数になり, これがボトルネックになります.
libae で提供されている検索ライブラリでは, このような集計を効率良く行なっています. 普通の検索要求なら新聞1年分でも一瞬で検索が終わるでしょう.
それでは,実際に libae を使ってみましょう.