Sentence Transformers 2.2 : 使用方法 : 意味的テキスト類似性

Sentence Transformers 2.2 : 使用方法 : 意味的テキスト類似性 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 11/25/2022 (v2.2.2)

* 本ページは、UKPLab/sentence-transformers の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

クラスキャット 人工知能 研究開発支援サービス

クラスキャット は人工知能・テレワークに関する各種サービスを提供しています。お気軽にご相談ください :

◆ 人工知能とビジネスをテーマに WEB セミナーを定期的に開催しています。スケジュール
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

  • 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
  • sales-info@classcat.com  ;  Web: www.classcat.com  ;   ClassCatJP

 

Sentence Transformers 2.2 : 使用方法 : 意味的テキスト類似性

センテンス埋め込みを計算 したら、通常はそれらを互いに比較することを望みます。ここでは、埋め込み間のコサイン類似度を計算する方法を示します、例えば、2 つのテキストの意味的類似度を測ります。

from sentence_transformers import SentenceTransformer, util
model = SentenceTransformer('all-MiniLM-L6-v2')

# Two lists of sentences
sentences1 = ['The cat sits outside',
             'A man is playing guitar',
             'The new movie is awesome']

sentences2 = ['The dog plays in the garden',
              'A woman watches TV',
              'The new movie is so great']

#Compute embedding for both lists
embeddings1 = model.encode(sentences1, convert_to_tensor=True)
embeddings2 = model.encode(sentences2, convert_to_tensor=True)

#Compute cosine-similarities
cosine_scores = util.cos_sim(embeddings1, embeddings2)

#Output the pairs with their score
for i in range(len(sentences1)):
    print("{} \t\t {} \t\t Score: {:.4f}".format(sentences1[i], sentences2[i], cosine_scores[i][i]))

convert_to_tensor=True パラメータを encode 関数に渡します。これは埋め込みを含む pytorch テンソルを返します。それから util.cos_sim(A, B) を呼び出します、これは A のすべてのベクトルと B のすべてのベクトル間のコサイン類以度を計算します。

上の例では、embeddings1 と embeddings2 のすべての可能なペアに対するそれぞれのコサイン類以度スコアを持つ 3×3 行列を返します。

最も高いコサイン類以度スコアを持つペアを見つけ出すためにこの関数を使用することもできます。

from sentence_transformers import SentenceTransformer, util

model = SentenceTransformer('all-MiniLM-L6-v2')

# Single list of sentences
sentences = ['The cat sits outside',
             'A man is playing guitar',
             'I love pasta',
             'The new movie is awesome',
             'The cat plays in the garden',
             'A woman watches TV',
             'The new movie is so great',
             'Do you like pizza?']

#Compute embeddings
embeddings = model.encode(sentences, convert_to_tensor=True)

#Compute cosine-similarities for each sentence with each other sentence
cosine_scores = util.cos_sim(embeddings, embeddings)

#Find the pairs with the highest cosine similarity scores
pairs = []
for i in range(len(cosine_scores)-1):
    for j in range(i+1, len(cosine_scores)):
        pairs.append({'index': [i, j], 'score': cosine_scores[i][j]})

#Sort scores in decreasing order
pairs = sorted(pairs, key=lambda x: x['score'], reverse=True)

for pair in pairs[0:10]:
    i, j = pair['index']
    print("{} \t\t {} \t\t Score: {:.4f}".format(sentences[i], sentences[j], pair['score']))

注意してください、上のアプローチでは、最も高いスコアリングペアを見つけるためにブルートフォース・アプローチを使用しています、これは二次関数的複雑さを持ちます。センテンスの長いリストに対しては、これは実行不可能かもしれません。センテンスの長いリストで最も高いスコアリングペアを見つけたい場合には、Paraphrase (言い換え) マイニング を見てください。

 

以上