読者です 読者をやめる 読者になる 読者になる

SimStringをRubyから使ってみた

SimStringは,類似文字列検索のための高速かつシンプルなライブラリです。
簡単にいえば「もしかして:〇〇」を簡単に実装できるライブラリですね。
詳しくは公式サイトを見てください。http://www.chokkan.org/software/simstring/

このライブラリはC++でできているのですが、公式サイトを見るとPythonRubyからも扱えるとのこと。Pythonのサンプルが載っていて普段ならこれでなんの問題もないのですが、最近仕事でRubyをやっているのでRubyから使う方法が知りたくて調べました。

ビルド方法

基本的には公式サイトの手順で問題ないのですが、注意点が少し有ります。

  1. Ruby1.9系はインストール出来ない
  2. Macだとインストールはできるが、なんか動かない(っぽい)

CentOS5.5にruby1.8.7だとあっさりできました。

データ投入

一番簡単なのはsimstringコマンドを使ってテキストファイルからデータを入れる方法です。

スパゲッティー
スパゲッティ
スパゲッテー
スパゲティー
スパッティー
スパゲッティー
スパゲッティーニ
スパゲッティー・
スパッゲッティー
スパゲッティーニ・
・・スパゲッティー
スープスパゲッティー
スパゲッティーモンスター

上記のようなテキストをtest_data.txtとして保存します。
次にsimstringコマンドを使ってデータを入れます。

$ simstring -bu -d test.db < test_data.txt

Rubyで操作する

データが投入できたので、次はRubyから使ってみます。
http://www.chokkan.org/software/simstring/swig/

まぁこれを見ればすぐわかるんですが一応説明。

データ投入
require 'simstring'

#DB作成
db = Simstring::Writer.new('test_ruby.db', 3, false, true)

#DB投入
db.insert('スパゲティ')
db.close()

DBオブジェクトを作成して、insertするだけ。簡単

検索
require 'simstring'
# DBオープン
db = Simstring::Reader.new('test.db')

# 類似度関数としてコサイン類似度を選択。係数をセット
db.measure = Simstring::Cosine
db.threshold = 0.7

#出力
p(db.retrieve('スパゲッテ'))

DBをオープンして、類似度関数とパラメータをセットして検索するだけです。超簡単

まとめ

簡単に使えてしかも速い。単語数が結構増えても速いと聞きました。
検索補助や入力補助なんかに使えそうなので、SimStringを使うことでユーザーにとって地味に便利な機能をサイトに追加することができそうな気がしてきました。おすすめです。