WordScoop ver2.0.0をリリースしました。

Tsukasa OISHI

WordScoopKaerukeywordの後継ライブラリです。
Kaerukeyword同様、与えられたテキスト中から、登録されたキーワードを高速に検索することができます。また、今回、HTML文章中にキーワードが現れた際、自動でリンクを付与するメソッドも追加しました。ずっとkaeruspoonでは使っていたものですが、晴れてリリースとなりました。

インストール

sudo gem install word_scoop

使い方は以下のとおりです。
まず、キーワード群の辞書を登録しておきます。

tree = WordScoop.new(["ruby", "rails", "おおいし"])

あとでキーワードを追加登録することもできます。

tree.add("つかさ")
tree << "焼き肉"

テキスト中に存在するキーワードを抽出するには、searchメソッドを使います。
テキスト中に出現した順番に配列に格納して返されます。

tree.search("ぼくはおおいしつかさです。rubyと焼き肉が大好きです。I love ruby!") 
    #=> ["おおいし", "つかさ", "ruby", "焼き肉", "ruby"]

テキスト中のキーワードに自動でリンクをはりたい場合は、filter_htmlメソッドを使います。
タグ内にキーワードが現れても無視します。また、a、script、pre、object、iframeタグの場合は、タグが閉じられるまでキーワードが現れても無視します。

tree.filter_html(|I love Ruby! <scrip>alert("Ruby!")</scrip>|)
    #=> %Q|I love <a href="https://www.kaeruspoon.net/keywords/Ruby">Ruby</a>! <scrip>alert("Ruby!")</scrip>|

リンクのAタグは自由に設定できます。wikipediaやはてなキーワードなどを利用すると便利かもしれません。デフォルトでは当サイトのかえるキーワードへのリンクとなります。%sの部分にヒットしたキーワードが割り当てられます。内部的には単純に、sprintfに渡してあげているだけです。

tree.link_url = %Q|<a href="http://ja.wikipedia.org/wiki/%s">%s</a>|
tree.filter_html(|I love Ruby!|)
    #=> %Q|I love <a href="http://ja.wikipedia.org/wiki/Ruby">Ruby</a>!|

パフォーマンス的には、filter_htmlはsearchに比べて若干落ちますが、許容範囲の速度だと思います。アルゴリズム的には何も工夫していないので、さらに高速化をいずれ目指そうと思います。

262380語の登録にかかる時間。

             user     system      total        real
total:   1.100000   0.320000   1.420000 (  1.419997)
avg:     0.000004   0.000001   0.000005 (  0.000005)

searchメソッド(1000回繰り返し)

             user     system      total        real
total:   3.540000   0.030000   3.570000 (  3.569992)
avg:     0.003540   0.000030   0.003570 (  0.003570)

filter_htmlメソッド(1000回繰り返し)

             user     system      total        real
total:   4.220000   0.050000   4.270000 (  4.269990)
avg:     0.004220   0.000050   0.004270 (  0.004270)