「文章の類似度を測定したい」
「画像検索を自分で作ってみたい」
「セマンティック検索・意味検索を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 beach | 0.3140 |
a cat at home | 0.1906 |
a bear on the mountains | 0.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の動作確認の説明でした。