pip install sentence-transformers torch
from sentence_transformers import SentenceTransformer, util
# Bi-Encoderのモデルを用意する
model = SentenceTransformer(
"sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
)
# さくらさんの質問
question = "宇宙で水はどう使うの?"
# 答えの候補
sentences = [
"宇宙船では水をくり返し使います。",
"宇宙飛行士は訓練をします。",
"ねこはボールで遊びます。",
]
# 質問と候補を、べつべつに数字カードへ変える
question_vector = model.encode(
question,
convert_to_tensor=True,
)
sentence_vectors = model.encode(
sentences,
convert_to_tensor=True,
)
# 数字カードの近さを計算する
scores = util.cos_sim(
question_vector,
sentence_vectors,
)[0]
# 点数が高い順に表示する
ranking = sorted(
zip(sentences, scores),
key=lambda item: item[1],
reverse=True,
)
for rank, (sentence, score) in enumerate(ranking, start=1):
print(f"{rank}位: {sentence}")
print(f"似ている度: {score.item():.3f}\n")
from sentence_transformers import CrossEncoder
# Cross-Encoderのモデルを用意する
model = CrossEncoder(
"cross-encoder/mmarco-mMiniLMv2-L12-H384-v1"
)
question = "宇宙で水はどう使うの?"
sentences = [
"宇宙船では水をくり返し使います。",
"宇宙飛行士は訓練をします。",
"ねこはボールで遊びます。",
]
# 質問と候補をペアにする
pairs = [
[question, sentence]
for sentence in sentences
]
# ペアをいっしょに読んで点数をつける
scores = model.predict(pairs)
# 点数が高い順に並べる
ranking = sorted(
zip(sentences, scores),
key=lambda item: item[1],
reverse=True,
)
for rank, (sentence, score) in enumerate(ranking, start=1):
print(f"{rank}位: {sentence}")
print(f"相性スコア: {score:.3f}\n")




















