SentenceTransformersを使って4行で文章埋め込みをする。

# この記事について
NLP初学者向けに、一瞬で文章の埋め込みができるSentenceTransformersを紹介します。NLP初学者向けということで用語の解説も簡単に行なっていきますが、厳密さのかけらもありません。

こんなに簡単に優秀なモデルで遊べるのに日本語の記事が少なくて勿体無い！と思ったので書きました。初めての投稿なので拙いですがお許しください。

それと良ければ「いいね」を...


# 目次
[1.この記事について](#この記事について)
[2.NLP(自然言語処理)とは](#NLP(自然言語処理)とは)
[3.SentenceTransformerとは](#SentenceTransformerとは)
[4.埋め込みとは](#埋め込みとは)
[5.使い方](#使い方)
[6.おわりに](#おわりに)

# NLP(自然言語処理)とは
自然言語とは、人間が普段会話に使う言語です。(正:日本語、英語 / 誤:Python、数式)
自然言語をコンピュータに処理させる一連の技術が自然言語処理です。
言葉を扱うAIというイメージで初めは良いのではないかと思います。

英語ではNatural Language Processing(通称:NLP)と言います。
NLPの中にNatural Language 〇〇〇という分野がたくさん包含されています。
↓
[Natural Language Understanding(NLU)](https://en.wikipedia.org/wiki/Natural-language_understanding),
[Natural Language Generation(NLG)](https://en.wikipedia.org/wiki/Natural_language_generation),
[Natural Language Assessment(NLA)](https://ai.googleblog.com/2022/10/natural-language-assessment-new.html).

# SentenceTransformerとは
## Transformerとは
SentenceTransformerの説明の前にTransformerの説明。
詳しい説明は省きます。NLPの偉大なディープラーニングモデルという認識で良いでしょう。NLPから生まれましたがCV(コンピュータービジョン)の世界でも使われています。

Transformerの偉大さを説明すると日が暮れるので省きますが、現在(2022)、NLPのほとんどのモデルがTransformerを基に作られています。
[深層学習界の大前提Transformerの論文解説！](https://qiita.com/omiita/items/07e69aef6c156d23c538)

タスクによっては人間の能力を超えているものもあります。
[NLPのタスクを紹介するだけの簡単なページ(0)
](https://qiita.com/MeguruMokke/items/1201b5fa05ad6ec5efb9)

## SentenceTransformerとは
単語ではなく文章用のTransformerです。最も類似したペアを見つけるタスクは今までのBERT/RoBERTaでは65時間かかっていましたが、精度と同じまま、SBERTでは約5秒でできます。
[Sentence-BERT: Siamese BERT-Networks を使用した文の埋め込み
(論文)](https://arxiv.org/abs/1908.10084)

# 埋め込みとは
自然言語処理で用いられる埋め込み(Embedding)とは、「文や単語などに対して、何らかの空間におけるベクトルを与えること」です。
テキストのままではコンピュータが処理できないので、理解できるようにするための手法の一つです。
近い意味のテキストを近いベクトルに対応させることができます。

# 使い方
お待たせしました。使い方です。

```py
# インストール方法
## ターミナルの場合
pip install -U sentence-transformers
## jupyterやcolabで行う場合
!pip install -U sentence-transformers
```

```embedding.py
# インポート
from sentence_transformers import SentenceTransformer

# モデルの選択
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')

# (モデル一覧↓)
# https://huggingface.co/models?library=sentence-transformers&sort=downloads

# 埋め込みを行いたい文
sentence = ['This framework generates embeddings for each input sentence']

# model.encode()を用いて埋め込みを行なってprint
print(model.encode(sentence))

# print結果

>>> [[-1.76214606e-01  1.20601386e-01 -2.93623507e-01 -2.29857996e-01
  -8.22926089e-02  2.37709135e-01  3.39985043e-01 -7.80964434e-01
   1.18127473e-01  1.63373724e-01 -1.37715369e-01  2.40282834e-01
   4.25125867e-01  1.72417581e-01  1.05279520e-01  5.18164277e-01
...
   2.94184327e-01  9.90919173e-02 -5.43897331e-01  1.40812859e-01
   3.66998643e-01  5.04865311e-02  1.99122056e-01 -2.80674666e-01
   4.34192240e-01 -1.40275091e-01  5.78048885e-01  1.77715629e-01
   8.98362473e-02  3.29651237e-01  6.13006540e-02 -3.24933112e-01]]
```
コサイン類似度で意味の近さを測ってみる
```cos_sim.py
# sklearnのインストールとcosine_simのインポート
!pip install sklearn
from sklearn.metrics.pairwise import cosine_similarity

sentence_1 = ["I am a student."]
sentence_2 = ["I am a high school student."]

# model.encode()を用いて埋め込みを行う
embedding_1 = model.encode(sentence_1)
embedding_2 = model.encode(sentence_2)

# コサイン類似度を計算する
print(cosine_similarity(embedding_1, embedding_2))

>>> [[0.78916454]]
```
文章の類似度はイメージと同じでしょうか？(-1から1の範囲)

# おわりに
SentenceTransformersを使って文章埋め込みをしてみました。
本当に簡単に使えますね。Multilingual(多言語)なモデルもあるので、"幸せ"と"Happy"の類似度が近いことが試せます。

ぜひ試してみてください。

[SentenceTransformers Documentation
](https://www.sbert.net/)