くじら公園

プログラミングなど学んだことについて書きます

読書メモ〜『情報検索の基礎』 第1章

以前購入して積読してしまっていた情報検索の基礎を最近読み始めたのでそのメモです。


『情報検索の基礎』はタイトル通り、検索エンジンを実現するために必要となる基礎知識が網羅的に記載されている本で、扱われている内容は、逆インデックスやインデックスの圧縮から、tf-idf、k近傍法やSVMなどの分類手法、クラスタリングなど広範に及びます。どちらかというと、古典的ないわゆるプログラミングの教科書に近いスタイルで記述されており、各章は文章と若干の数式、特定の言語に依らない疑似コードによる説明と演習問題で構成されています。

個人的には前述の通り、情報検索が網羅的に記述されている点、教科書的なスタイルで記載されている点に加えて、各章の分量が多すぎず少なすぎないため、リズム良く取り組める点にとても勉強意欲をそそられました。

あくまで説明は文書と疑似コードに限られるので、実際に自分で作って動かして結果を目で見てみたい人間としては、各章の重要箇所については自分で実装してみたくなります。これは実際に実装してみた際のメモです。


第1章は引き続く章へのポインターなのでこの時点で実装できる項目はそれ程ないのですが、実装して動かしてみるというリズムを掴むために、いくつか実装してみました。

論理検索モデル

用語と文章の関係(term-document)からなる結合行列をつくって、Brutus AND Caesar AND NOT Calpurnia のようなクエリーに対応するドキュメントを検索します。

教科書に習って、"The Shakespeare Collection"にを題材にしました。データとしてはこちらのリポジトリを利用させて頂きました。

utils.create_incidence_matrix は、データのパスを引数に取り、pandas.DataFrame型で結合行列を返却します。

第1章の後半で、この結合行列はより疎な逆インデックスに置き換えられるため(という言い訳を理由に)実装はかなり雑です。

まぁこんな適当な実装で、とりあえず教科書のこの部分については再現できる。

実際の問合せは以下の通り、Pandas便利。

# `Brutus AND Caesar AND NOT Calpurnia`という質問に答える
In: matrix.loc['Brutus'] & matrix.loc['Caesar'] & (~matrix.loc['Calpurnia'])

Out: 
Antony and Cleopatra    1
Hamlet                  1
Julius Caesar           0
Macbeth                 0
Othello                 0
The Tempest             0
dtype: int64