類似文字列検索ライブラリSimStringをRubyから使う

類似文字列検索ライブラリの SimString を Ruby から使ってみましたのでその記録。とりあえず SimString とその Ruby 用モジュールをインストールして、irb からサンプルコードを試してみるところまでです。

SimStringは,類似文字列検索のための高速かつシンプルなライブラリです. 類似文字列検索とは,文字列集合(データベース)の中から,クエリ文字列との類似度が閾値以上のものを,見つけ出す操作です. クエリ文字列と完全に一致しなくても,データベース中の似ている文字列を検索することができるので,スペル訂正,あいまい計算,柔軟な辞書マッチング,重複レコード検出,データベース統合など,様々なアプリケーションを構築できます.

スポンサーリンク

— 環境 —
CentOS 6.5
SimString 1.0
SWIG 3.0.2
Ruby 2.1.2

以降の作業は、とりあえず動作確認のため Vagrant 上仮想マシンで行いました。

SimString のインストール

まずは、SimString 本体をソースからインストールします。

SimString のインストール確認。

ヘルプ確認。

SWIG のインストール

続いて、Ruby 用モジュールの動作に必要な SWIG をインストールします。SWIG(Simplified Wrapper and Interface Generator)は、C++ と Ruby など高級言語をつなぐためのソフトウェア。

まず、swig インストールの前に swig に必要な pcre-devel を前もって入れる。

yum でインストールできる swig パッケージのバージョンが 1.3.40 と古かったため、swig をソースコードからインストールしました。

Download SWIG

swig バージョン確認。

SimString の Ruby 用モジュールをビルド

続いて、SimString を Ruby から使うためのモジュールをビルドします。

これで Ruby 用モジュールがビルドできました。このステップの作業で少々エラーにはまったのですが、詳細はエントリー末尾に記載しました。

irb で SimString の動作確認

Ruby からの SimString 操作を確認するために、サンプルコードを irb 上で試してみました。SimString: A fast and efficient implementation of approximate string matching のページに書いてある、Ruby の A basic sample コードを irb で実行。

キタ━(゚∀゚)━! ばっちし動いてますね!試しましたところ、どうやら db.threshold の値を小さくすると、類似判定を甘くできる模様です。db.threshold を1にすると、完全一致の時のみ一致判定が真になるのかな。

ここまで来れば、Rails製ウェブアプリケーションの検索フォームで、スペルミスや誤字による検索文字列を訂正する機能を実装できる見通しが立ちました。Google の「もしかして: ○○」でお馴染みのあれ。

スクリーンショット 2014-10-10 21.02.19

最後に遭遇したエラーなどまとめ

最初、Ruby 用モジュールのビルドで、SimString 公式の手順を参考に以下の通りやりましたところ…

その後の make でエラーが発生しました。

export_wrap.cpp を確認したところ、swig 1.3.** と古いバージョンの swig でファイルが作成されていた。本当ならインストールした swig 3.0.2 で export_wrap.cpp が作成されるべきなはず。

ということで prepare.sh を確認したところ、–swig オプションを使うとシステムの swig コマンドを使って、export_wrap.cpp を生成するコードであることを確認できました。

なので –swig オプションを付けてやり直し。

こうすると、インストールした swig 3.0.2 で export_wrap.cpp が作成されます。

これで、その後の make, make install まで上手く行けました!

SimString を使うと簡単に類似文字列検索を実装することができ、とても便利です。作者の Naoaki Okazaki さんに感謝、ありがとうございます。

スポンサーリンク
私は以下の本で Ruby を覚えました。メタプログラミングRubyは入門を超える内容で難しめです。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!