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

南国のビーチパラソルの下で、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機能を使ってるから、検索も早そうな印象である。

【Rでの文字列処理シリーズ(その5)】文字列の抽出・切り出し・検出

はじめに

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

この記事では、R言語での文字列の抽出/切り出しや検出について、いろいろと試してまとめてみました。主に、baseやstringrのパッケージを扱っています。

テキスト処理の関連記事

skume.net

skume.net

skume.net

skume.net

skume.net

skume.net

関連パッケージをロードする

library(stringr)
library(readr)

文字列の抽出/切り出しについて

stringr::str_extract関数、stringr::str_extract_all関数では、 文字列から一致するパターンを抽出して、ベクトルで結果を返す。

str_extractとstr_extract_allとで、少し挙動が違うみたいである。

以下に、テストデータでの実行例を示す。

#テストデータの読み込んで、unlistにする
Dat <- unlist(data.frame(readr::read_tsv(file="https://raw.githubusercontent.com/kumeS/Blog/master/TXT_proc/test.txt", 
                                         col_names=F, show_col_types = FALSE)),
              use.names = F)

#最初の部分を表示する
Dat
#[1] "abc ABC abc" "ABC abc ABC" "def DEF def" "DEF def DEF" "abc.ABC.abc"
#[6] "ABC.abc.ABC"

#abcが含まれる部分を要素ごとに抽出する
stringr::str_extract(string=Dat, pattern="abc")
#[1] "abc" "abc" NA    NA    "abc" "abc"

#abcが含まれる部分をすべて抽出する
stringr::str_extract_all(string=Dat, pattern="abc")
#[[1]]
#[1] "abc" "abc"
#
#[[2]]
#[1] "abc"
#
#[[3]]
#character(0)
#
#[[4]]
#character(0)
#
#[[5]]
#[1] "abc" "abc"
#
#[[6]]
#[1] "abc"

文字数指定で、文字列を抽出する

base::substrあるいはstringr::str_subを使って、 文字ベクトルの部分文字列を文字数指定で抽出する。

#任意の文字列
Moji <- "abcdefghij"

#文字数のカウント
nchar(Moji)
#[1] 10

#substr関数で、1から3文字目までを抽出する
base::substr(Moji, start=1, stop=3)
#[1] "abc"

#substr関数で、4から6文字目までを抽出する
base::substr(Moji, start=4, stop=6)
#[1] "def"

#次に、str_sub関数で、1から3文字目までを抽出する
stringr::str_sub(Moji, start=1, end=3)
#[1] "abc"

#str_sub関数で、4から6文字目までを抽出する
stringr::str_sub(Moji, start=4, end=6)
#[1] "def"

#str_sub関数で、1文字目から、後ろから3文字目までを抽出する
stringr::str_sub(Moji, start=1, end=-3)
#[1] "abcdefgh"

#str_sub関数で、4文字目から最後の文字までを抽出する
stringr::str_sub(Moji, start=4, end=-1)
#[1] "defghij"

stringr::str_sub関数では、 マイナス付きで、startあるいはendを指定すると、 後ろから何文字目かを指定できる。

文字列の検出

stringr::str_detect関数は、 文字列の中のパターンの有無を検出する。

#そのパターンが含まれるかどうかを、TRUE/FALSEで返す
stringr::str_detect(string=Dat, pattern="abc")
#[1]  TRUE  TRUE FALSE FALSE  TRUE  TRUE

#パターンが含まれた場合には、FALSEで返す (negate = TRUE)
stringr::str_detect(string=Dat, pattern="abc", negate = TRUE)
#[1] FALSE FALSE  TRUE  TRUE FALSE FALSE

「月の英語表記」を「月の数字」に置換する方法について

#月の英語表記を月の数字に変換するTips
Month <- c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")

#数字に変換
match(Month, month.abb)
#[1]  1  2  3  4  5  6  7  8  9 10 11 12

#数字に変換: 桁数を合わせる
formatC(match(Month, month.abb), width = 2, flag = "0")
#[1] "01" "02" "03" "04" "05" "06" "07" "08" "09" "10" "11" "12"

参考資料

https://www.it-swarm.jp.net/ja/r/%E3%83%94%E3%83%AA%E3%82%AA%E3%83%89%E3%81%A7strsplit%E9%96%A2%E6%95%B0%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/1048748448/www.it-swarm.jp.net

stats.biopapyrus.jp

kazutan.github.io

github.com

www.rdocumentation.org

kazutan.github.io

stats.biopapyrus.jp

bioscryptome.t-ohashi.info

www.medi-08-data-06.work

kazutan.github.io

stats.biopapyrus.jp

heavywatal.github.io

代表的なプレプリント・サーバー

はじめに

雑誌に掲載れる前に、プレプリントで話題になる昨今。。

プレプリントとは、論文原稿を一般的な査読を受けずに、専用のサーバーで無償公開することを指す。

代表的なプレプリント・サーバーをまとめてみた。

arXiv(アーカイヴ)

情報系・人工知能分野でよく投稿されている 「arXiv(アーカイヴ)」は、1991年にスタートしていて、今年2021年でちょうど30年となる。結構歴史があるプレプリント・サーバーである。現在、コーネル大学図書館が管理している。

公式には、物理学、数学、コンピュータサイエンス、定量的生物学、定量的金融、統計学、電気工学・システム科学、経済学の分野が主に対象のようだ。

https://arxiv.org/

bioRxiv(バイオアーカイヴ)

bioRxivは、主に生物系の論文を掲載するプレプリント・サーバーである。

動物の行動と認知、生化学、バイオエンジニアリング、 バイオインフォマティクス、生物物理学、癌生物学、細胞生物学、臨床試験、発達生物学、 生態学、疫学、進化生物学、遺伝学、ゲノミクス、免疫学、微生物学、分子生物学、神経科学 などなど、生物医学分野全体を網羅している。

https://www.biorxiv.org/