京橋のバイオインフォマティシャンの日常

データ分析、コマンドライン、プログラミングについての技術資料・自己アップデート・悩み事などをまとめています。最近、ディープラーニング関連のR言語の資料をまとめるべく注力してます。

【Rでの文字列処理シリーズ(その6)】類似文字列検索ライブラリpython版simstringをRから使って、文字列の距離計算をやってみた件

SimStringライブラリは、 類似文字列検索のための高速かつシンプルなライブラリである。

類似文字列検索とは、文字列集合の中から、特定のクエリ文字列との類似度が閾値以上のものを見つけ出す処理のことをいう。

類似検索では、クエリと完全には一致しなくても、文字列集合から似ている文字列を見つけることができる。

python版simstringのインストール

まずは、Macターミナルを起動して、pipsimstring-pureライブラリをインストールする。

#ターミナル上で実行の場合
pip install simstring-pure

Rからインストールする場合は、

#R上で実行の場合
system("pip install simstring-pure")

Pypi - simstring-pure 1.0.0:

pypi.org

R言語で、simstringライブラリを実行してみる。

reticulateパッケージをロードして、py_configとかを確認する。

#ロード
library(reticulate)

#Pythonのバージョンの選択
reticulate::use_python("/usr/local/bin/python3", required =T)

#Pythonの設定確認
reticulate::py_config()
#python:         /usr/local/bin/python3
#libpython:      /usr/local/opt/python@3.9/Frameworks/Python.framework/Versions/3.9/lib/python3.9/config-3.9-darwin/libpython3.9.dylib
#pythonhome:     /usr/local/Cellar/python@3.9/3.9.7/Frameworks/Python.framework/Versions/3.9:/usr/local/Cellar/python@3.9/3.9.7/Frameworks/Python.framework/Versions/3.9
#version:        3.9.7 (default, Sep  3 2021, 12:45:31)  [Clang 12.0.0 (clang-1200.0.32.29)]
#numpy:          /usr/local/lib/python3.9/site-packages/numpy
#numpy_version:  1.21.0
#NOTE: Python version was forced by use_python function

続いて、simstringライブラリをインポートして、適当な変数に代入する。

#simstringライブラリのインポート
CharacterNgramFeatureExtractor <- reticulate::import(module = "simstring", convert=T)$feature_extractor$character_ngram$CharacterNgramFeatureExtractor
CosineMeasure <- reticulate::import(module = "simstring")$measure$cosine$CosineMeasure
DictDatabase <- reticulate::import(module = "simstring")$database$dict$DictDatabase
Searcher <- reticulate::import(module = "simstring")$searcher$Searcher

データベースを作成して、類似検索をしてみる。

#2グラムのデータベース作成
db <- DictDatabase(CharacterNgramFeatureExtractor(2L))

#登録
db$add('foo')
db$add('bar')
db$add('fooo')

#コサイン類似度
searcher <- Searcher(db, CosineMeasure())

#fooで、閾値0.8で検索する
results <- searcher$search('foo', alpha=0.8)
print(results)
#[1] "foo"  "fooo"

他の特徴量や類似度を使用したい場合は、これらのクラスを置き換える。

#simstringライブラリのインポート - 別バージョン
WordNgramFeatureExtractor <- reticulate::import(module = "simstring", convert=T)$feature_extractor$word_ngram$WordNgramFeatureExtractor
JaccardMeasure <- reticulate::import(module = "simstring")$measure$jaccard$JaccardMeasure
DictDatabase <- reticulate::import(module = "simstring")$database$dict$DictDatabase
Searcher <- reticulate::import(module = "simstring")$searcher$Searcher

MongoDatabaseはうまくインポートできなかったので、諦めた。。

上記の条件で、類似検索を実行してみた。

#ワードNグラム特徴
db <- DictDatabase(WordNgramFeatureExtractor(2L))

#登録
db$add('You are so cool.')

#ジャッカード類似度係数
searcher = Searcher(db, JaccardMeasure())

#類似度検索
results = searcher$search('You are cool.', alpha=0.8)
print(results)
#list()

#0.5なら、、、
results = searcher$search('You are cool.', alpha=0.5)
print(results)
#[1] "You are so cool."

現在、コサイン類似度、Dice類似度、Jaccard類似度をサポートしているらしい。

simstringは、DB機能を使ってるから、検索も早そうな印象である。