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

データ分析、コマンドライン、プログラミングについての技術資料・自己アップデート・悩み事などをまとめています。最近、ディープラーニング関連の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機能を使ってるから、検索も早そうな印象である。

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

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

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

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

参考資料

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年となる。結構歴史があるプレプリント・サーバーである。現在、コーネル大学図書館が管理している。

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

f:id:skume:20211022003525p:plain:w500
https://arxiv.org/

bioRxiv(バイオアーカイヴ)

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

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

f:id:skume:20211022003551p:plain:w500
https://www.biorxiv.org/

Mac Homebrewで、pandocのインストール

R/Knitで、bibtexのリファレンスの処理ができなくなったと思ったら、pandocが消えてるっぽい。

Pandocというのは、文書作成ツール や出版作業時に用いられるドキュメント・コンバータの1つであり、、、、

なので、pandocを再度インストールしてみた。

pandocのインストール

#インストール
brew install pandoc

#バージョン確認
pandoc -v

brewコマンドで、すぐにインストールできて無事に解決したので良かった。

Mac/Homebrewで、AWS CLIをインストールする

Amazon Web Services(AWS)とは、 Amazon.comにより提供されているクラウドコンピューティングサービスである。

今回、AWSサービスを管理するための統合ツールである、 AWS CLIのインストールとかセットアップについてまとめてみた。

まずは、ターミナルを起動して、 Homebrewをアップデートして、awscliをインストールする

AWS CLIのインストール

#Homebrewのアップデート
brew update

#awsを検索する
brew search aws

#AWS CLIのインストール
brew install awscli

#パス確認
which aws
#/usr/local/bin/aws

#バージョン確認
aws --version
#aws-cli/2.2.43 Python/3.9.7 Darwin/19.6.0 source/x86_64 prompt/off

AWS CLIの各種設定

次に、各種設定について示す。 ここでは、Bioconductorへの登録時に行った実行コマンドを例に示す。

#アクセスキーの設定
aws configure --profile AnnotationContributor

ここで、BioCから教えてもらった、Access KeyとSecret Keyをコピペする。

Default region nameは、「ap-northeast-1」と入力

Default output format は、「text」と入力

ちゃんと、設定されてるかの確認をする。

#config
cat ~/.aws/config

#credentials
cat ~/.aws/credentials

AWSサーバーにアクセスして、ファイルをアップロードする。

ここでは、BioImageDbsパッケージのデータをAWSにアップロードした事例を紹介する。

まず、AWSにアクセスして、フォルダやファイルを確認する。

#ディレクトリ確認
aws --profile AnnotationContributor s3 ls s3://annotation-contributor/ --recursive

#BioImageDbsフォルダを確認する
aws --profile AnnotationContributor s3 ls s3://annotation-contributor/BioImageDbs --recursive
#はじめは、何もアップされいない。

ファイルをサーバーにコピーする。その場合には、cpコマンドを使う。

ローカルのv01フォルダをBioImageDbs/v01にコピーしたときの実行したコマンドを示す。

#ファイル・コピー
aws --profile AnnotationContributor s3 cp v01 s3://annotation-contributor/BioImageDbs/v01 --recursive --acl public-read

#アップロードされたか確認
aws --profile AnnotationContributor s3 ls s3://annotation-contributor/BioImageDbs --recursive

補足

CentOSでの AWS cli のインストール

AWS cliのインストールコマンドは、MacとCentOSとではやや違う。

CentOSの場合は、以下の通りである。

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

#パス確認
which aws

以下のRequestTimeTooSkewedエラーが出たら、PCの時計がズレているかも。。。

An error occurred (RequestTimeTooSkewed) when calling the ListObjectsV2 operation: The difference between the request time and the current time is too large. というエラーが出た時は、結構面倒だけど、以下の方法で、時計を合わせる必要がある。。

date

#ntp無効
sudo timedatectl set-ntp no
timedatectl status

#いまの時間をセットする
sudo timedatectl set-time "2021-04-19 14:45:00"
#コントロール + c で終了

#ntp有効
sudo timedatectl set-ntp yes
timedatectl status

参考資料

docs.aws.amazon.com

qiita.com

qiita.com

関連図書