Posted by yatsu Mon, 09 Oct 2006 01:01:25 GMT
2007-06-04 追記 ダウンロードはこちら → yatsu.info : ruby-pytstをRubyForgeに登録
ずっと前に、pytstをRubyに移植中と書きましたが、作りかけのものを公開しておきます。 ファイル読み込み/書き込み以外は動作していると思います。
pytstはもともとSWIGで実装されているのですが、Python依存部分が結構あって、移植はそれなりに大変でした。
これはTernary Search Trie (TST)というデータ構造を実装したRuby拡張です。 Aho-Corasick法(AC法)によるスキャニングもサポートしています。 文章中から複数のキーワードを抽出したり、一括置換したりするのに使えます。 くわしくはpytstのページをご参照ください。
使用例
例1 (example/tokenize.rb)
コード
require 'pytst'
t = Pytst::TST.new
t['1234'] = 'token 1'
t['123456'] = 'token 2'
t['45678'] = 'token 3'
t['5678910'] = 'token 4'
result = t.scan('1234561234567891012345',
Pytst::TupleListAction.new)
p result
実行
% ruby example/tokenize.rb
結果
[["123456", 6, "token 2"], ["123456", 6, "token 2"],
["78910", -5, nil], ["1234", 4, "token 1"], ["]
ワーイヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノワーイ
例2 (example/callable_action.rb)
コード
require 'pytst'
t = Pytst::TST.new
t['1234'] = '[token 1]'
t['123456'] = '[token 2]'
t['45678'] = '[token 3]'
t['5678910'] = '[token 4]'
mycallback = Proc.new {|key, length, obj|
if length > 0
print obj
else
print key
end
}
myresult = Proc.new {
puts
}
result = t.scan('1234561234567891012345',
Pytst::CallableAction.new(mycallback, myresult))
実行
% ruby example/callable_action.rb
結果
[token 2][token 2]78910[token 1]5
ワーイヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノワーイ
今後の予定
- ファイル読み込み/書き込み
- 例外処理
- Marshal対応
- Rubyっぽいインターフェース(ブロック処理など)
そして最終目的は、LesserWikiのレンダリング速度を改善して、サービス(ASP)化して公開することです。 半年くらいサボッてますが、そろそろ再開しようかと……。
