はてなダイアリーキーワード抽出・リンクを高速化したい

きまぐれ日記:はてなキーワードを高速に付与という エントリーがとても気になる内容です。
はてなダイアリーの内部処理の中でも重めの処理である、キーワード抽出・リンクについて、高速化を試みるというとてもありがたい内容です。


高速化にはAC法という方法を使用しているようです。(恥ずかしながら全く知りませんでした。)
AC法の肝はトライ (TRIE) という木構造を利用して、高速に前方一致検索が出来るところです。
トライの説明は高林さん(namazuの中の人)の説明がとても分かりやすくておすすめです。
要は一文字ごとにばらして、ツリーに格納しておいて、検索後のつづりの通りにツリーをたどるということらしいです。

トライの特徴は、辞書に登録されている項目の数がどんなに多くても、キーの長さに比例した時間で探索が行えるという点である。


実際に 日記で紹介されている hatenakeyword というツールを利用してみました。
以下その手順です。(前提にDartsというテンプレートライブラリのインストールが必要です。)

wget http://www.chasen.org/~taku/software/darts/src/darts-0.2.tar.gz
tar zvxf darts-0.2.tar.gz
cd darts-0.2
./configure
make
make check
sudo make install
LC_ALL=C sort keyword.list >sortedkeyword.list  # ソート
/usr/local/libexec/darts/mkdarts sortedkeyword.list keywordlist.da # 辞書作成
/usr/local/libexec/darts/darts keywordlist.da # 辞書の動作確認

wget http://chasen.org/~taku/blog/archives/hatenakeyword.tar.gz
tar zvxf hatenakeyword.tar.gz 
cd hatenakeyword
make
./hatenakeyword # ここで文章を打ち込むとキーワードリンクされる

mkdartsで、辞書作成に失敗するなぁと思っていてデバッグしていたら
darts.h:123

	if (prev > cur) throw -3;

ここで引っかかっていて、ふと気づく。
キーワードリストのソートをするのを忘れていた。。orz


実際に試した結果としては、かなり高速にキーワードリンクがされるようです。
ということなので


という流れで進めようと思っています。
それにしても気まぐれ日記の方はすごい人です。
コードも読ませていただきましたがとても読みやすいですし、日記右側の検索がかっこよすぎます。

情報検索アルゴリズム

情報検索アルゴリズム