【Python】sentence-transformersによるセマンティック検索

【Python】sentence-transformersによるセマンティック検索 機械学習

「文章の類似度を測定したい」
「画像検索を自分で作ってみたい」
「セマンティック検索・意味検索をPythonで行いたい」

このような場合には、sentence-transformersが利用できます。
この記事では、sentence-transformersについて解説しています。

本記事の内容

  • sentence-transformersとは?
  • sentence-transformersのシステム要件
  • sentence-transformersのインストール
  • sentence-transformersの動作確認

それでは、上記に沿って解説していきます。

sentence-transformersとは?

sentence-transformersは、文章や画像をベクトル空間に埋め込むことができます。
この説明だと、意味がわかりませんよね。

簡単に言うと、sentence-transformersにより文章や画像をデータに変換できます。
データに変換できたら、次のことが可能になります。

  • セマンティック検索
  • パラフレーズマイニング
  • 画像検索

要するに、言葉の意味を解釈できるということです。
入力された文字のみで検索するのではなく、意味で検索ができます。

セマンティック検索は、チャットボットなどでも使われている技術です。
パラフレーズマイニングは、セマンティック検索と似たようなモノです。

画像検索については、少し説明しておきます。

例えば、次のような画像があります。
そして、この画像には付加するテキスト情報が一切ありません。

この条件において、次の3つの文章があるとします。

  • a dog on the beach
  • a cat at home
  • a bear on the mountains

人間だと「a dog on the beach」とわかります。
でも、これをシステムで判断するのは非常に困難でした。

しかし、sentence-transformersを使えばこのことが判断できるのです。

文章類似度
a dog on the beach0.3140
a cat at home0.1906
a bear on the mountains0.2023

上記のように、画像と各文章との類似度を数値化できます。
この類似度の数値化の際には、CLIPの技術を用いています。

CLIPについては、次の記事で説明しています。

sentence-transformersでは、CLIPのラッパーを提供しているようです。
単独でCLIPを利用するより、いいかもしれません。

以上、sentence-transformersについて説明しました。
次は、sentence-transformersのシステム要件を確認します。

sentence-transformersのシステム要件

現時点(2021年10月)でのsentence-transformersの最新バージョンは、2.1.0となります。
この最新バージョンは、2021年10月1日にリリースされています。

sentence-transformersのシステム要件では、以下を確認しておきます。

  • OS
  • Python
  • PyTorch
  • Transformers

それぞれを下記で説明します。

OS

サポートOSに関しては、以下を含むクロスプラットフォーム対応です。

  • Windows
  • macOS
  • Linux

Python

サポート対象となるPythonのバージョンは、Python 3.6となります。
公式では、Python 3.6のみが記載されています。

ただ、Python 3.6以降なら問題ないでしょう。
実際、私は次のPythonで検証しています。

>python -V 
Python 3.9.7

PyTorch

機械学習を行うためのフレームワークとして、PyTorchが利用されています。
PyTorch 1.6以降が、必須です。

sentence-transformersのインストールの際に、同時にインストールされます。
ただし、それはCPU版のPyTorchとなります。

GPU版のPyTorchを動かしたい場合は、事前にインストールしておきましょう。
PyTorchのインストールに関しては、次の記事で解説しています。

今回の検証では、事前に以下のコマンドでPyTorch 1.9.1のGPU版をインストール済みです。

pip install torch==1.9.1+cu111 torchvision==0.10.1+cu111 torchaudio===0.9.1 -f https://download.pytorch.org/whl/torch_stable.html

各自の環境により、インストールコマンドは異なります。
そのため、上記記事を参考にして各自の環境に適したコマンドを利用してください。

Transformers

最先端の自然言語処理を行うためには、必須と言えます。
次の記事において、Transformersについて説明しています。

ただし、事前にインストールする必要はありません。
sentence-transformersのインストールの際に、自動的に適したバージョンがインストールされます。

まとめ

sentence-transformersのシステム要件で、最も注意すべきはPyTorchです。
GPU版のPyTorchを使いたいなら、事前にインストールが必要となります。

それ以外は、pipコマンドで自動的に適したバージョンをインストールしてくれます。

以上、sentence-transformersのシステム要件を説明しました。
次は、sentence-transformersをインストールします。

sentence-transformersのインストール

まずは、現状のインストール済みパッケージを確認しておきます。
GPU版のPyTorchをインストールしただけの状態です。

>pip list  
Package           Version  
----------------- ------------  
numpy             1.21.2  
Pillow            8.3.2  
pip               21.3 
setuptools        58.2.0  
torch             1.9.1+cu111  
torchaudio        0.9.1  
torchvision       0.10.1+cu111  
typing-extensions 3.10.0.2

次にするべきことは、pipとsetuptoolsの更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。

python -m pip install --upgrade pip setuptools

では、sentence-transformersのインストールです。
sentence-transformersのインストールは、以下のコマンドとなります。

pip install sentence-transformers

インストールは、それなりに時間がかかります。
では、どんなパッケージがインストールされたのかを確認しましょう。

pip list 
Package               Version 
--------------------- ------------ 
certifi               2021.10.8 
charset-normalizer    2.0.7 
click                 8.0.3 
colorama              0.4.4 
filelock              3.3.0 
huggingface-hub       0.0.19 
idna                  3.2 
joblib                1.1.0 
nltk                  3.6.5 
numpy                 1.21.2 
packaging             21.0 
Pillow                8.3.2 
pip                   21.3 
pyparsing             2.4.7 
PyYAML                5.4.1 
regex                 2021.10.8 
requests              2.26.0 
sacremoses            0.0.46 
scikit-learn          1.0 
scipy                 1.7.1 
sentence-transformers 2.1.0 
sentencepiece         0.1.96 
setuptools            58.2.0 
six                   1.16.0 
threadpoolctl         3.0.0 
tokenizers            0.10.3 
torch                 1.9.1+cu111 
torchaudio            0.9.1 
torchvision           0.10.1+cu111 
tqdm                  4.62.3 
transformers          4.11.3 
typing-extensions     3.10.0.2 
urllib3               1.26.7

それなりの数のパッケージが、インストールされました。
複雑な処理を行う以上、これは仕方がないでしょう。

ただ、ここまで依存するパッケージが多いとPython仮想環境を利用すべきです。

Windowsなら、IDEにPyCharmを使えば簡単に仮想環境を利用できます。
プロジェクト(今回ならsentence-transformers用)毎に仮想環境となります。

また、以下のようにコマンドでも簡単に仮想環境を利用できます。

以上、 sentence-transformersのインストールについて説明しました。
最後は、 sentence-transformersの動作確認を行います。

sentence-transformersの動作確認

sentence-transformersの動作確認として、2つの文章の類似度を数値化します。
利用するモデルは、日本語に対応しています。

from sentence_transformers import SentenceTransformer, util 
model = SentenceTransformer('stsb-xlm-r-multilingual') 

#Sentences are encoded by calling model.encode() 
emb1 = model.encode("今日は天気が悪いです") 
emb2 = model.encode("今日は雨です") 

cos_sim = util.cos_sim(emb1, emb2) 
print("コサイン類似度:", cos_sim)

上記を実行した結果は、以下。

コサイン類似度: tensor([[0.6703]])

数値が高い方が、類似しているということです。
雨は天気が悪い場合の方が、多いですからね。

ある程度、納得の類似度になっています。
折角なので、他の文章とも類似度を測ってみました。

ベースとなる文章は、以下。

今日は天気が悪いです

もう一方の文章を次のように変更した結果は、以下。

文章コサイン類似度
今日は雨です0.6703
今日は晴れです0.3347
今日は湿度が高い0.4260
今日は風が強い0.6163
今日は快晴だ0.3502
今日はジメジメしている0.4692
今日は気分が落ち込みます0.7595
今日は気分が良いです0.2983

人間の感覚に近い結果が出ています。
モデルを変更したら、結果も変わってきます。

以上、sentence-transformersの動作確認の説明でした。

タイトルとURLをコピーしました