はてなダイアリーキーワード抽出・リンクを高速化したい
きまぐれ日記:はてなキーワードを高速に付与という エントリーがとても気になる内容です。
はてなダイアリーの内部処理の中でも重めの処理である、キーワード抽出・リンクについて、高速化を試みるというとてもありがたい内容です。
高速化には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
実際に試した結果としては、かなり高速にキーワードリンクがされるようです。
ということなので
- 現在のキーワードリンクとの比較ベンチマークをとる
- はてなキーワードを高速に付与 (SWIG を使って Perl モジュール)というさらに面白そうな話題に追いつく。
という流れで進めようと思っています。
それにしても気まぐれ日記の方はすごい人です。
コードも読ませていただきましたがとても読みやすいですし、日記右側の検索がかっこよすぎます。
- 作者: 北研二,津田和彦,獅々堀正幹
- 出版社/メーカー: 共立出版
- 発売日: 2002/01/01
- メディア: 単行本
- 購入: 6人 クリック: 552回
- この商品を含むブログ (38件) を見る