検索エンジン自作入門/ wiserのPython移植(3)

前回作成した add_document で呼び出している未実装の関数を実装していきます。

add_document の4行目と5行目で呼び出している、db_add_document と db_get_document_id は、データベースを扱う処理です。転置インデックスの本体はDBに格納します。wiser では SQLite を使用していますが、移植にあたって MySQL を利用することにします。Python からの MySQL の利用は、MySQL Connector/Python を利用することにしました(簡単なので)。

https://dev.mysql.com/downloads/connector/python/

これらの関数のコードについては、検索エンジンの本筋ではないので省略します。

次に、12行目で呼んでいる転置インデックスの構築処理 text_to_postings_list に入って行きます。

渡された文字列(文書の本文)をトークンに分解し、それを token_to_postings_list (未実装)に渡してポスティングリストを作成します。既存のテンポラリ転置インデックスがあれば、できたポスティングリストとマージします。なければ新規にテンポラリ転置インデックスを生成します。

Python のドキュメントスタイルなどはまだよくわからないので、ここで引数の説明をしておくと、document_id はデータベースに登録された文書のID、text は処理対象の文書の本文、n は何-gram で切り出すか、ii_buffer はテンポラリ転置インデックスになります。

文書をN-gramに分解する関数 ngram_next を中で呼んでいます。ここは、C版では for 文の条件部で逐一呼び出す形になってますが、Python版では一回の呼び出しで文書内のすべてのトークンを返す作りに変えてあります。

is_ignored_char は検索対象外文字列を弾くためのものです。コードは省略します。

ngram_next はこれで実行できるようになりましたので、bi-gram で動かしてみます。

結果は以下の通りです。bi-gram に分解できました。

未実装の token_to_postings_list と merge_inverted_index を、次回実装していきます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です