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

南国のビーチパラソルの下で、Rプログラムを打ってる日常を求めて、、Daily Life of Bioinformatician in Kyobashi of Osaka

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

はじめに

文字列処理・テキスト処理とは、プログラミングを行うなかで、文字列・テキストに対する色々な操作のことを指します。それら処理をうまく使いこなすことで、文字列を自由に処理できるようになります。文字列処理の活用事例は、キーワード抽出、テキスト分類、テキストマイニングの前処理など、多岐に渡ります。 今回の「Rでの文字列処理」シリーズで扱う、文字列処理のライブラリ・関数群やプログラムコードは、R環境上で無料で提供されている、オープン・ソフトウェアを用います。

この記事では、R環境でのPythonライブラリを使って実行しています。

SimStringライブラリは、 類似文字列検索のための高速かつシンプルなライブラリです。 類似文字列検索とは、文字列集合の中から、特定のクエリ文字列との類似度が閾値以上のものを見つけ出す処理のことをいいます。 類似検索では、クエリと完全には一致しなくても、文字列集合から似ている文字列を見つけることができます。

テキスト処理の関連記事

skume.net

skume.net

skume.net

skume.net

skume.net

skume.net

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機能を使ってるから、検索も早そうな印象である。