検索エンジンを実装 (2)出現位置とその文書ID

id:d-kamiさんから改良版Make2Gram付きトラックバックを頂きました(連絡方法がわからんのでトラックバックで – マイペースなプログラミング日記)(はてなダイヤリーから移転前)。d-kamiさん、ありがとうございます。

上記のページにあるコードから、TreeMapやsubstringを用いたbigramの切り出し・カウント方法などを学ばせて頂きました。

さて、今回の実装その2は以下の機能を加えました。

  1. コマンドライン引数にディレクトリ名を指定して、そのディレクトリ以下のファイル全てを処理の対象とする。
  2. N-gram情報には文書IDと部分文字列の出現位置を格納するようにデータ構造の拡張。

そして今回、指定ディレクトリ以下のファイルを再帰的に読み込んでいく処理はJava 再帰的にファイルを検索 / Chat&Messengerを参考にさせて頂きました。

Make2Gram.java

ファイル読み込み部分とbigram切り出し部分のループを二つに分けたのは今後の拡張の為です。

IndexRecord.java(N-gram情報を格納するクラス)

実行結果の一部

おー、なんか楽しくなってきました。

今後の改良点

  • IndexRecordにアクセサ(Getter, Setter)を作成しフィールドの修飾詞はprivateに
  • IO部分とN-gram解析部分のスレッドを分離(マルチスレッドのデザインパターンを学ぶ甲斐あり)
  • 文字列の出現位置情報を用いたAND検索(次はこれに挑戦してみよう)
  • forブロックのループ継続判定に使用する数値は予め求めておく(毎回length, sizeメソッド等を呼び出さないように)などのコードの最適化。