WordScoop ver2.0.0をリリースしました。
WordScoop は Kaerukeywordの後継ライブラリです。
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)