RubyでTST+AC法 (ruby-pytst)

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)化して公開することです。 半年くらいサボッてますが、そろそろ再開しようかと……。

Comments

Trackbacks

Use the following link to trackback from your own site:
http://yatsu_info/articles/trackback/21266

(leave url/email »)

   Comment Markup Help Preview comment