はじめに
文字列処理・テキスト処理とは、プログラミングを行うなかで、文字列・テキストに対する色々な操作のことを指します。それら処理をうまく使いこなすことで、文字列を自由に処理できるようになります。文字列処理の活用事例は、キーワード抽出、テキスト分類、テキストマイニングの前処理など、多岐に渡ります。 今回の「Rでの文字列処理」シリーズで扱う、文字列処理のライブラリ・関数群やプログラムコードは、R環境上で無料で提供されている、オープン・ソフトウェアを用います。
この記事では、R環境でのPythonライブラリを使って実行しています。
SimString
ライブラリは、
類似文字列検索のための高速かつシンプルなライブラリです。
類似文字列検索とは、文字列集合の中から、特定のクエリ文字列との類似度が閾値以上のものを見つけ出す処理のことをいいます。
類似検索では、クエリと完全には一致しなくても、文字列集合から似ている文字列を見つけることができます。
テキスト処理の関連記事
python版simstringのインストール
まずは、Macターミナルを起動して、pip
でsimstring-pure
ライブラリをインストールする。
#ターミナル上で実行の場合
pip install simstring-pure
Rからインストールする場合は、
#R上で実行の場合 system("pip install simstring-pure")
Pypi - simstring-pure 1.0.0:
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機能を使ってるから、検索も早そうな印象である。