トライ木を使用した高速な文字列検索をRubyで試してみました。 tyler/trieのサンプルコードを使用しています。
fast_trie
をインストール
gem install fast_trie
コード
require 'trie'
trie = Trie.new
words = ['forestry', 'king', 'exculde', 'end', 'Meros']
words.each do |word|
trie.add word
end
word = 'Meros raged.It was determined without fail that it was necessary to exclude king of Satol dishonest cruelty.'
node = trie.root
#TRIE木のルートからたどっていってterminalが見つかったら一致。
#terminalが見つかる前にたどる場所がなくなったら不一致。
word.split('').each do |char|
break unless node.walk!(char)
if node.terminal?
puts "Found me a word: #{node.full_state}"
break
end
end
出力
Found me a word: Meros
結果
やってみて2つの欠点がわかりました。
- 日本語の検索ができない
- 文章の先頭からしか検索できない