2009年8月11日火曜日

はてなのような自動キーワードリンクをtx-rubyで実装 はてなブックマーク

はてなダイアリーやニコニコ大百科では、本文のキーワードに自動的にリンクが付くようになっていますが、ニコニコ大百科では、sennaとrubyを使って実装しているそうです。

はてなのようなキーワードリンクをRubyで付与する実例


僕もキーワードリンクを実装する機会があったのですが、そのときはtx-rubyを使いました。

tx-ruby

これはtrieというデータ構造を扱うtxというライブラリを、rubyから使うものです。
rubyを介しても十分高速で、以前Wikipediaの見出し語約90万語をキーワードに使って試した際も、非常に高速に動作しました。
大変便利だったので、書いておきます。

tx-rubyのダウンロードはこちらから。
ダウンロードしたファイルを解凍したあと、そのディレクトリに移動して、
ruby setup.rb

とすると、簡単にインストールできます。(Windowsでも使えます。)

それではニコニコ大百科の説明文と同様にできるかどうかやってみます。

autolink_test.rb
ダウンロード

require 'cgi'
require 'tx'

builder = Tx::Builder.new
words = ['ニコニコ大百科', 'ニコニコ動画', '運営', '未来検索ブラジル', 'ニコペ', 'ニコ百', '大百科']
builder.add_all(words)
# キーワードをインデックスファイルに書き込み
builder.build("test.index")

# インデックスファイルを読み込み
index = Tx::Index.open("test.index")

str = "ニコニコ大百科(-だいひゃっか)とは、ニコニコ動画上での各種用語に関する解説や、ニコニコ動画上にアップされている動画についての情報、その他あらゆる言葉についての情報をユーザが自由に記述できるサイトである。運営・管理ともに未来検索ブラジルが行っている。「ニコペ」、「ニコ百」、「百」、「百」などと、略称され、単に「大百科」と呼ぶこともあるやもしれない。"

# キーワードにマッチする部分をリンクに置き換え
ret = index.gsub(str) do |s, i|
"<a href='http://dic.nicovideo.jp/a/#{CGI.escape(s)}' target='_blank'>#{s}</a>"
end

# 結果をファイルに出力
File.open('autolink.txt', 'w') do |f|
f.puts ret
end


出力
autolink.txt

ニコニコ大百科(-だいひゃっか)とは、ニコニコ動画上での各種用語に関する解説や、ニコニコ動画上にアップされている動画についての情報、その他あらゆる言葉についての情報をユーザが自由に記述できるサイトである。運営・管理ともに未来検索ブラジルが行っている。「ニコペ」、「ニコ百」、「百」、「百」などと、略称され、単に「大百科」と呼ぶこともあるやもしれない。


キーワードリンクが成功しました!

参考:
tx-ruby
tx
はてなキーワードを高速に付与
Aho Corasick 法

0 件のコメント:

コメントを投稿